64-битный глобальный хук блокирует 32-битные приложения - PullRequest
4 голосов
/ 23 июня 2011

Я пытаюсь создать простую DLL для подключения к 64-битным приложениям на Win7 x64.

Моя программа работает с 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, но я пытаюсь понять, почему этот хук не работает.

Ответы [ 2 ]

1 голос
/ 23 июня 2011

а) вы не можете вызвать MessageBox из процедуры Hook. Не делай этого. б) Крючки - почти всегда неправильный способ решения любой проблемы. Я рекомендую против них. Что ты на самом деле пытаешься сделать?

0 голосов
/ 21 июля 2015

Измените ваш 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;
}
...