2016-04-12 10 views
4

まず、Windows XPでVisual Studio 2010を使用しています - 32ビット。SetWindowsHookExの使用法の相違点

今、低レベルのキーボードフックで別のアプリケーションを使用できるようにするDLLを作成しようとしています。

私はそれがうまく機能したにもかかわらず、なぜ今は理解したいのですか?

非稼働コード:

#include <Windows.h> 
#include <stdio.h> 

static HINSTANCE hinst; 
static HHOOK kbdHook = NULL; 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    printf(":"); fflush(stdout); 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

DWORD WINAPI ThreadProc(LPVOID lpParameter) 
{ 
    MSG msg; 

    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return 0; 
} 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
    switch (fdwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
      hinst = hinstDLL; 
      CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); 

      kbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinst, 0); 
      break; 
     case DLL_PROCESS_DETACH: 
      UnhookWindowsHookEx(kbdHook); 
      break; 
     default: 
      break; 
    } 

    return TRUE; 
} 

ワーキングコード:

#include <Windows.h> 
#include <stdio.h> 

static HINSTANCE hinst; 
static HHOOK kbdHook = NULL; 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    printf(":"); fflush(stdout); 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

DWORD WINAPI ThreadProc(LPVOID lpParameter) 
{ 
    MSG msg; 

    kbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0); 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return 0; 
} 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
    switch (fdwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
      hinst = hinstDLL; 
      CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); 
      break; 
     case DLL_PROCESS_DETACH: 
      UnhookWindowsHookEx(kbdHook); 
      break; 
     default: 
      break; 
    } 

    return TRUE; 
} 

唯一の違いは、私はDllMainからThreadProcSetWindowsHookEx -callを移動することです。

質問:なぜですかこのはすべて違いがありますか?

+0

http://stackoverflow.com/questions/13874324/what-is-a-loader-lock –

答えて

4

これは、すべてのLowLevelKeyboardProc callback functionのドキュメントで説明されています。

このフックはそれをインストールしたスレッドのコンテキストで呼び出されます。呼び出しは、フックをインストールしたスレッドにメッセージを送信することによって行われます。 したがって、フックをインストールしたスレッドにはメッセージループが必要です。

あなたの正常でないコードは、メッセージループを実行しないスレッドにフックをインストールします。