Функция не работает внутри класса — вызов функции отсутствует в списке аргументов

Я построил работающий кейлоггер, и теперь я хочу переместить его в класс, чтобы я мог использовать его снова, когда захочу, и даже на разных языках, таких как 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);

0

Решение

Если предположить, SetWindowsHookEx должен взять указатель на функцию (я никогда не могу понять ужасная документация по Windows API), вам нужно привязать указатель на функцию-член к объекту, для которого она должна быть вызвана. Если вы хотите привязать его к объекту, указанному this (то есть KeyboardHook объект, который вы создаете в то время), попробуйте это:

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

С другой стороны, KeyboardProc может быть объявлена ​​как статическая функция-член, но это означает, что она не сможет использовать typedChars член.

1

Другие решения

Вы должны определить KeyboardProc как статический член

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

если он должен и может быть вызван без объекта.

0

По вопросам рекламы [email protected]