2015-12-25 2 views
0

Я пытаюсь создать приложение, которое будет уведомлено о каждом активном изменении окна в Windows, чтобы оно могло выполнять некоторые задачи, такие как обнаружение заголовков окон, поэтому «наказывать» плохих людей, обращающихся к плохому контенту на нашем ПК машины. Таким образом, это действительно важно для приложения, потому что целью является запись «плохих» приложений из истории.SetWindowHookEx() возвращает NULL

Итак, в моей основной функции я начал тему для своего WindowLogger.

windowThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) WindowLogger, 
     (LPVOID) argv[0], 0, NULL); 

if (windowThread) 
{ 
    // Also a bit of protection here.. 
    return WaitForSingleObject(windowThread, INFINITE); 
} 

Тогда, вот моя WindowLogger процедура:

// Function called by main function to install hook 
DWORD WINAPI 
WindowLogger(LPVOID lpParameter) 
{ 

    HHOOK hWinHook; 

    HINSTANCE hExe = GetModuleHandle(NULL); 

    if (!hExe) 
    { 
     return 1; 
    } 
    else 
    { 
     hWinHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, hExe, 0); 

     MSG msg; 

     // I AM UNSURE ABOUT THIS PART.. 
     // Probably wrong code :D .. 

     while (GetMessage(&msg, NULL, 0, 0) != 0) 
     { 
      if (msg.message == HCBT_ACTIVATE) { 
       // my code to log the window name 
      } 
     } 
     UnhookWindowsHookEx(hWinHook); 
    } 
    return 0; 
} 

И, наконец, моя CBTProc функция обратного вызова, он записывает окна используя мою log() функцию:

LRESULT CALLBACK 
CBTProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    switch (nCode) 
    { 

    case HCBT_ACTIVATE: 
    { 
     HWND foreground = GetForegroundWindow(); 
     char window_title[50]; 
     if (foreground) 
      GetWindowText(foreground, window_title, 25); 

      log("|"); 
      log(&window_title[0]); 
      log("|"); 

     } 
    } 
} 

Так я отлаженный программа и то, что я понял, что hWinHook становится NULL после SetWindowsHookEx() - это то, что, вероятно, заставляет мою программу использовать функцию почты. .. Не могли бы вы мне помочь?

Заранее спасибо.

+0

Опишите Windows версию и состояние UAC. –

+0

Отходы времени. «Плохие» люди могут использовать приложение для сообщений без сообщений или использовать драйвер режима ядра или что-то еще. – user2120666

+0

Nick K - Windows 10 x64, UAC - default (Уведомить меня, когда приложения пытаются внести изменения в мой компьютер). user2120666 - я знаю, что это не лучший метод, но я доволен этой концепцией. – user3752782

ответ

2

Передача 0 для параметра dwThreadId на SetWindowsHookEx Используется для регистрации крюка для всех потоков в системе, то есть глобального крючка. Однако для этого ваш код крюка должен быть расположен в DLL (чтобы DLL отображалась в адресное пространство других процессов). Поскольку ваш код hook находится в вашем основном исполняемом файле, а не в DLL, вызов прерывается.