2011-06-23 22 views
4

Win7 x64上で64ビットアプリケーションにフックするための簡単なDLLを作成しようとしています。64ビットグローバルフックが32ビットアプリケーションをロックする

私のプログラムは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を注入する必要はありませんが、なぜこのフックが機能していないのか理解しようとしています。

答えて

1

a)HookプロシージャからMessageBoxを呼び出すことはできません。それをしないでください。 b)フックは、問題を解決するためにほとんど常に間違った方法です。私はそれらに対抗することを勧めます。あなたは本当に何をしようとしていますか?

+0

私は64ビットシステムでWH_KEYBOARDフックの標準的な例を実装しようとしていますが、これはもっと大きなものの一部ではありません。 – acdx

+0

表示されているキーを単純な配列にキャプチャしてみてください。それは安全でなければなりません。 –

+0

@マーティン:それを試してみてください。それは、64ビットのアプリケーションからのキーストロークを記録し、32ビットのアプリケーションはロックアップする。明らかに64ビットでプログラムは32ビットなので、フックプロシージャは決して実行されません。 – acdx

0

次のように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; 
} 
関連する問題