2
我有一類這樣的通行證方法
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
如果我更改爲「&鍵盤:: keyboardHookProc'它也錯誤,當我投到'(HOOKPROC)& Keyboard :: k eyboardHookProc」還錯誤
請人幫忙
不能從普通方法傳遞迴調方法而不是靜態方法嗎?有什麼理由嗎? –
「非靜態」成員有一個隱含的「this」參數,因爲這種或那種方式必須知道要操作哪個對象,而C回調根本不準備處理這個問題。另外,「成員函數指針」可能有點複雜,就像使用多重繼承時一樣。 –
要調用成員方法,需要一個對象代表這個對象調用這個方法:'(object。* normalMethod)(args)'。沒有對象調用這個方法是不可能的。對於靜態方法,不需要任何對象 - 它們更像普通的C函數,這些函數原本就是在這裏預期的。 – PiotrNycz