C++ 键盘挂钩仅适用于32位程序

C++ 键盘挂钩仅适用于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

/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::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