我有一个这样的课程
class Keyboard
{
public:
Keyboard(void);
~Keyboard(void);
void SetHook(HINSTANCE hInstance);
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
};
LRESULT CALLBACK Keyboard::keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
bool bControlKeyDown=0;
bool caps = GetKeyState(VK_CAPITAL) < 0;
...
void Keyboard::SetHook(HINSTANCE hInstance)
{
KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, Keyboard::keyboardHookProc, hInstance, NULL);
}
但声明
KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, Keyboard::keyboardHookProc, hInstance, NULL);
导致编译错误
Error 7 error C3867: 'Keyboard::keyboardHookProc': function call missing argument list; use '&Keyboard::keyboardHookProc' to create a pointer to member
如果我改为'&amp; Keyboard :: keyboardHookProc'也会出错,当我转向'(HOOKPROC)&amp; Keyboard :: keyboardHookProc'时也会出错
任何人请帮助
答案 0 :(得分:2)
这是C-callbacks的常见错误。
Keyboard::keyboardHookProc
必须是静态的。
[UPDATE]
如果要对Keyboard
中的Keyboard
对象进行操作,则必须找到其他方法将static Keyboard::keyboardHookProc
对象提供给此静态方法。如果您有一个Keyboard
,则可能使用singleton
模式,如果没有,那么每个静态方法都必须有自己的Keyboard
对象。
[UPDATE2]
将对象与全局函数链接的方法之一是通过模板对象引用。但这只适用于全局对象:
class Keyboard
{
public:
Keyboard();
~Keyboard(void);
LRESULT keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
};
LRESULT Keyboard::keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
}
// global function interface
template <Keyboard& k>
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return k.keyboardHookProc(nCode, wParam, lParam);
}
Keyboard k; // global keyboard
int main()
{
// this works
SetWindowsHookEx(0, keyboardHookProc<k>, NULL, NULL);
}