0

動作するキーロガーを作成しましたが、それをクラスに移動して、必要なときにいつでも再利用できるようにしたいのですが、c# などの異なる言語でも同じコードがクラス内で機能しないため、エラーが発生しました。

main.cpp (作業中)

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

void main()
{
    HINSTANCE h_instance = GetModuleHandle(NULL);
    SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, h_instance, 0); // Works here
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    // Populate typedChars
    return NULL;
}

KeyboardHook.cpp (動作していません)

class KeyboardHook
{
    stringstream typedChars;

    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        // Populate typedChars
        return NULL;
    }

    KeyboardHook()
    {
        HINSTANCE h_instance = GetModuleHandle(NULL);
        SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, h_instance, 0); // Does not work
    }

public:
    std::string Get()
    {
        return typedChars.str();
    }

    void Clear()
    {
        typedChars.str(std::string());
        typedChars.clear();
    }
};

エラー

C3867: 'KeyboardHook::KeyboardProc': function call missing argument list; use '&KeyboardHook::KeyboardProc' to create a pointer to member

だから私はそれを変更しSetWindowsHookEx(WH_KEYBOARD_LL, &KeyboardProc, h_instance, 0);、今別のエラーが発生します

C2276: '&' : illegal operation on bound member function expression

私も試しましたが、成功しませんでした:

SetWindowsHookEx(WH_KEYBOARD_LL, (LRESULT)&KeyboardProc, h_instance, 0);
SetWindowsHookEx(WH_KEYBOARD_LL, (LRESULT)KeyboardProc, h_instance, 0);
SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHook::KeyboardProc, h_instance, 0);
SetWindowsHookEx(WH_KEYBOARD_LL, &KeyboardHook::KeyboardProc, h_instance, 0);
4

2 に答える 2

1

関数ポインターを受け取ることになっていると仮定すると(恐ろしいWindows APIドキュメントSetWindowsHookExを理解することはできません)、メンバー関数へのポインターを、それが呼び出されるオブジェクトにバインドする必要があります。が指すオブジェクト(つまり、その時点で作成しているオブジェクト)にバインドする場合は、次のことを試してください。thisKeyboardHook

using std::placeholders;
SetWindowsHookEx(WH_KEYBOARD_LL,
  std::bind(&KeyboardHook::KeyboardProc, this, _1, _2, _3),
  h_instance, 0);

または、KeyboardProc静的メンバー関数として宣言することもできますが、それはメンバーを使用できないことを意味しますtypedChars

于 2013-02-14T21:30:18.703 に答える
0

KeyboardProc静的メンバーとして定義する必要があります

static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
...
}

オブジェクトなしで呼び出す必要があり、呼び出すことができる場合。

于 2013-02-14T21:29:28.877 に答える