C++ 键盘挂钩仅适用于32位程序
/index.cppC++ 键盘挂钩仅适用于32位程序,c++,windows,hook,C++,Windows,Hook,/index.cpp #include <functional> // std::function #include <iostream> // std::cout #include <Windows.h> #include "Keyboard_hook/index.h" int main () { HMODULE DLL_handle = LoadLibraryA("Keyboard_hook/index.dll"); std::funct
#include <functional> // std::function
#include <iostream> // std::cout
#include <Windows.h>
#include "Keyboard_hook/index.h"
int main () {
HMODULE DLL_handle = LoadLibraryA("Keyboard_hook/index.dll");
std::function<Hook_interface *()> get_hook = reinterpret_cast<Hook_interface *(*)()>(GetProcAddress(DLL_handle, "get_hook"));
Hook_interface *hook = get_hook();
hook->start_hooking();
system("pause");
hook->stop_hooking();
FreeLibrary(DLL_handle);
return 0;
}
我执行了一个a.exe
,但它只为32位应用程序打印KeyboardProc()
消息
但DLL被很好地注入到64位应用程序中。(我用Process Explorer找到了答案)
我知道64位DLL不会注入32位应用程序,所以我为此创建了一个消息循环
我很好奇为什么hook不适用于64位应用程序。当我在64位应用程序上键入键时,没有输出。我不知道我做错了什么。谢谢你的阅读D我认为KeyboardProc()函数似乎调用得很好。它只是直接注入到其他进程中,所以它没有在64位应用程序上打印任何内容。
#include <iostream> // std::cout
#include <Windows.h>
#include "index.h"
LRESULT CALLBACK KeyboardProc (int n_code, WPARAM w_param, LPARAM l_param);
namespace global {
HINSTANCE instance_handle;
}
class Hook : public Hook_interface {
private:
static HHOOK hook_handle;
public:
static HHOOK get_hook_handle () {
return Hook::hook_handle;
}
void start_hooking () {
MSG msg;
Hook::hook_handle = SetWindowsHookExA(WH_KEYBOARD, KeyboardProc, global::instance_handle, 0);
while(GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
void stop_hooking () {
if (Hook::hook_handle != nullptr) {
UnhookWindowsHookEx(this->hook_handle);
Hook::hook_handle = nullptr;
}
}
};
HHOOK Hook::hook_handle = nullptr;
BOOL WINAPI DllMain ([[maybe_unused]] HINSTANCE instance_handle, [[maybe_unused]] DWORD call_reason, [[maybe_unused]] LPVOID reserved) {
switch (call_reason) {
case DLL_PROCESS_ATTACH:
global::instance_handle = instance_handle;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return true;
}
LRESULT CALLBACK KeyboardProc ([[maybe_unused]] int n_code, [[maybe_unused]] WPARAM w_param, [[maybe_unused]] LPARAM l_param) {
std::cout << "KeyboardProc()" << "\n";
return CallNextHookEx(Hook::get_hook_handle(), n_code, w_param, l_param);
}
extern "C" _declspec(dllexport) Hook_interface *get_hook () {
return new Hook();
}
#include <Windows.h> // HHOOK
class Hook_interface {
public:
virtual void start_hooking () = 0;
virtual void stop_hooking () = 0;
virtual ~Hook_interface () = default;
};
cl index.cpp /EHsc /source-charset:utf-8 /std:c++17 /W4 /WX /link /MACHINE:X64 /OUT:a.exe
cl Keyboard_hook/index.cpp user32.lib /EHsc /LD /source-charset:utf-8 /std:c++17 /W4 /WX /link /MACHINE:X64