64位全局挂钩锁定32位应用程序

64-bit global hook locks up 32-bit applications

本文关键字:32位 应用程序 锁定 全局 64位      更新时间:2023-10-16

我正在尝试创建一个简单的DLL,以挂接到Win7 x64上的64位应用程序。

我的程序使用64位进程,每当按键时都会生成一个消息框。但是,当我在32位应用程序中按下任何键时,该应用程序都会锁定,直到钩子被移除。为什么64位挂钩会干扰32位应用程序?

下面的代码。

hook.h

#ifdef MYHOOK_EXPORTS
#define MYHOOK_DLL __declspec(dllexport) __stdcall
#else
#define MYHOOK_DLL __declspec(dllimport) __stdcall
#endif
void MYHOOK_DLL installHook();
void MYHOOK_DLL removeHook();

hook.cpp:

#include "hook.h"
#include <windows.h>
// hook handle stored in a shared data segment
#pragma data_seg(".myshared")
HHOOK hhook = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.myshared,RWS")
static HMODULE hmodule = 0;
LRESULT CALLBACK keyboardProc(int code, WPARAM wParam, LPARAM lParam) {
    // Replace this with sending a message to another window or writing to a file
    MessageBox(NULL, L"Hello, world!", L"Alert", 0);
    return CallNextHookEx(hhook, code, wParam, lParam);
}
void MYHOOK_DLL installHook() {
    if (!hhook)
        hhook = SetWindowsHookEx(WH_KEYBOARD, keyboardProc, hmodule, 0);
}
void MYHOOK_DLL removeHook() {
    if (hhook)
        UnhookWindowsHookEx(hhook);
    hhook = 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call,
    LPVOID lpReserved) {
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        hmodule = hModule;
    }
    return TRUE;
}

install.cpp:

#include "hook.h"
#include <stdio.h>
int wmain() {
    installHook();
    getchar();
    removeHook();
    return 0;
}

我读过你应该检查一下你是否在64位进程中,但我不确定如何以及在哪里。

我知道WH_KEYBOARD_LL不需要注入DLL,但我正在努力理解为什么这个钩子不起作用。

a)您不能从Hook过程调用MessageBox。不要那样做。b) 钩子几乎总是解决任何问题的错误方法。我建议反对他们。你到底想做什么?

如下修改install.cpp。

#include "hook.h"
#include <stdio.h>
int wmain() {
    installHook();
    MSG msg;
    BOOLEAN bRunThread = TRUE;
    while(bRunThread)
    {
        PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    removeHook();
    return 0;
}