2016-04-12 11 views
4

Erstens: Ich verwende Visual Studio 2010 unter Windows XP - 32 Bit.Der Unterschied zwischen den Verwendungen von SetWindowsHookEx

Im Moment versuche ich eine DLL zu schreiben, die es einer anderen Anwendung ermöglicht mit Low-Level Keyboard Hooks zu arbeiten.

Obwohl ich es zur Arbeit gebracht habe - ich will jetzt verstehen warum.

der nicht arbeitende Code:

#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; 
} 

Der Arbeitscode:

#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; 
} 

Der einzige Unterschied ist, dass ich die SetWindowsHookEx -Call aus DllMainThreadProc zu bewegt. Die Frage: Warum macht diese den Unterschied?

+0

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

Antwort

4

Dies alles wird für LowLevelKeyboardProc callback function in der Dokumentation erläutert:

Dieser Haken im Rahmen des Thread aufgerufen ist, dass es installiert ist. Der Aufruf erfolgt durch Senden einer Nachricht an den Thread, der den Hook installiert hat. Daher muss der Thread, der den Hook installiert hat, eine Nachrichtenschleife haben.

Ihr nicht funktionierender Code installiert den Hook in einem Thread, der keine Nachrichtenschleife ausführt.