2010-08-06 3 views
0

Попытка написать GLOBAL CBT HOOK,
это мой код, но мое приложение для подключения не получает никаких сообщений, ни что-то не записывает dll в тестовый файл.Global Hook in C++ не работает?

Это мой код:

#include "stdafx.h" 

#include "GlobalHook.h" 


#include "Stdafx.h" 

#include <iostream> 
#include <fstream> 

#define DLL_EXPORT 
#include "GlobalHook.h" 
#include <windows.h> 
using namespace std; 

#pragma comment(lib, "User32.lib") 
#pragma unmanaged 

HINSTANCE dllHandle; 
#pragma data_seg("ASEG") 
    HWND prnt = 0; 
#pragma data_seg() 
#pragma comment(linker, "/section:ASEG,RWS") 
    HHOOK hHook; 
    int x = 0; 

BOOL APIENTRY DllMain( 
     HINSTANCE hinstDLL, // handle to DLL module 
     DWORD fdwReason,  // reason for calling function 
     PVOID lpReserved) // reserved 
{ 
    // Perform actions based on the reason for calling. 
    switch(fdwReason) 
    { 
    case DLL_PROCESS_ATTACH:  
     dllHandle = hinstDLL;  
     return TRUE; 
     break; 
    } 
} 
    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam) 
    { 
     if(nCode < 0) 
     { 
      return CallNextHookEx(hHook, nCode, wParam, lParam); 
     } 
     if(nCode == HCBT_MINMAX) 
     { 
      SendNotifyMessage(prnt, WM_USER + 3, wParam, lParam); 
      if(x == 0) 
      { 
       ofstream myfile; 
       myfile.open ("C:\\example.txt"); 
       myfile << "Dies in ein File."; 
       myfile.close(); 
       x = 1; 
      } 
     } 
     return CallNextHookEx(hHook, nCode, wParam, lParam); 
    } 
extern "C" 
{ 
    DECLDIR int SetHook(HWND parent) 
    { 
     prnt = parent; 
     hHook = SetWindowsHookEx(WH_CBT, CBTProc, dllHandle, 0); 
     return 1; 
    } 
    DECLDIR void UninstallHook(void) 
    { 
     if(UnhookWindowsHookEx(hHook)) 
     { 

     } 
    } 
    DECLDIR int Add(int a, int b) 
    { 
     return (a + b); 
    } 
} 

ответ

0

Общая структура кажется звук.

#pragma comment(linker, "/section:ASEG,RWS") RWS, возможно, придется быть RWS

я раздеться CBTProc так, что вы просто в файл журнала на данный момент на каждом MINMAX, это позволит вам увидеть, что ваш длл был введен правильно.

WM_USER предназначен для использования в одном приложении не через приложения (хотя вы можете с ним справиться). Рассмотрим RegisterWindowMessage()

Если впрыскивается App является нижний собств уровень вы, возможно, потребуется, чтобы заставить ваше ПОЛУЧАТЬ приложение, чтобы обеспечить контакт с нижней Priv приложения с помощью ChangeWindowMessageFilter

Также можно попробовать также закреплять WH_CALLWNDPROC, WH_GETMESSAGE, чтобы увидеть, если вы можете получать другие сообщения.

Ваше окно также будет подключено, убедитесь, что вы не попали в цикл отправки сообщений. Вы используете SendMessage для пересылки сообщения, это вызовет блокировку сообщения приложения, если это приложение также является вашей собственной обработкой сообщения, которое вы заблокируете.

indllmain вы могли бы использовать OutputDebug войти какие приложения библиотека DLL загружается в

0

Использование глобальной ловушки требует "инъекции DLL". Ваша DLL будет внедрена в каждый запущенный процесс (с потоком пользовательского интерфейса). Когда DLL вводится, любые глобальные переменные в модуле будут NULL/0. Вам нужно кэшировать дескриптор окна, который вы хотите отправлять сообщениям в доступной для всего мира области. Самое простое - использовать свойство окна рабочего стола.

См. GetProp и SetProp.

Обратите внимание, что если вы хотите, чтобы ваш глобальный крючок работал на 64-разрядной Windows, вам необходимо иметь 32- и 64-разрядную DLL-инъекцию, а также 32- и 64-разрядное приложение для инжектора. В противном случае вы будете обрабатывать приложения только с той же дозой, что и ваш инжектор/DLL.

+0

я разделяю ручку окна с #pragma data_seg («ASEG») – alex

+0

Это не работает, как вы думаете, что он делает. Это для статических инициализированных данных. HWND не может быть жестко закодирован в DLL. – Tergiver

+0

Хорошо, я попробую позже – alex