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

'&Keyboard ::keyboardHookProc'に変更するとエラーも発生します。'(HOOKPROC)&Keyboard::keyboardHookProc'にキャストするとエラーも発生します

誰でも助けてください

4

1 に答える 1

3

これは、C コールバックでよくある間違いです。

Keyboard::keyboardHookProc静的でなければなりません。

[アップデート]

でオブジェクトKeyboardを操作したい場合は、この静的メソッドにオブジェクトを取得する別の方法を見つける必要があります。ある場合はパターンを使用できます。そうでない場合は、すべての静的メソッドに独自のオブジェクトが必要です。Keyboardstatic Keyboard::keyboardHookProcKeyboardsingletonKeyboard

[更新2]

オブジェクトをグローバル関数にリンクする方法の 1 つは、テンプレート オブジェクトの参照によるものです。ただし、これはグローバル オブジェクトに対してのみ機能します。

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);
}  
于 2012-09-29T11:58:28.100 に答える