Я построил работающий кейлоггер, и теперь я хочу переместить его в класс, чтобы я мог использовать его снова, когда захочу, и даже на разных языках, таких как c #, однако я столкнулся с ошибкой, поскольку один и тот же код не работает внутри класса.
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;
}
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);
Если предположить, 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
член.
Вы должны определить KeyboardProc
как статический член
static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
...
}
если он должен и может быть вызван без объекта.