Глобальный хук в с ++ не работает? - PullRequest
0 голосов
/ 06 августа 2010

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

Это мой код:

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

Ответы [ 2 ]

0 голосов
/ 28 августа 2010

Общая структура кажется надежной.

#pragma comment(linker, "/section:ASEG,RWS") RWS, возможно, должны быть значениями rws

Я бы сократил CBTProc, чтобы вы просто регистрировались в данный момент на каждом minmax,это позволит вам увидеть, что ваша dll была введена правильно.

WM_USER может использоваться внутри одного приложения, а не между приложениями (хотя с этим можно обойтись).Рассмотрим RegisterWindowMessage()

Если внедренное приложение имеет более низкий уровень привилегий, вам может потребоваться принудительно разрешить получающему приложению разрешать контакт из приложения с более низкими привилегиями, используя ChangeWindowMessageFilter

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

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

indllmain, вы можете использовать outputdebug для регистрации того, какие приложенияDLL загружается в

0 голосов
/ 06 августа 2010

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

См. GetProp и SetProp.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...