Как исключить поток из глобального хука - PullRequest
2 голосов
/ 25 января 2010

Мы подключаем методы T extOut(), ExtTextOut() и DrawText() ГЛОБАЛЬНО.

т.е.

hhook = SetWindowsHookEx(WH_CBT, function_address, module_handle, 0);

Но мы хотим исключить перехват нашего приложения (которое мы используем для установки / удаления ловушки). Если последний аргумент SetWindowsHookEx() равен 0 (нулю), он перехватит все существующие потоки. Как проверить здесь, является ли текущий поток «OurApplication.exe», а затем исключить его из перехвата или немедленно отцепить его. Пожалуйста, предоставьте помощь.

Ответы [ 3 ]

0 голосов
/ 25 января 2010

с макушки головы:

Передайте хук dll PID процесса, который вы хотите игнорировать при установке хука. Убедитесь, что PID хранится в общем разделе, чтобы все экземпляры ловушек видели одно и то же значение.

В вашей функции перехвата проверьте, совпадает ли текущий PID процесса с переданным. Если это так, не выполняйте зацепку, просто перейдите к CallNextHookEx.

Мне это не нравится, потому что это добавляет к работе, выполняемой в функции ловушки, что всегда плохо. Но похоже, что это должно работать в принципе.

0 голосов
/ 25 января 2010

Спасибо экспертам за ответ на наш вопрос. Мы нашли способ сделать это. Теперь мы добавили следующий блок кода в точку входа dll. И он работает нормально.

BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved) 
{   
    switch (dwReason) 
    {
       case DLL_PROCESS_ATTACH:
           IsDebuggerPresent();

           // Exclude the "someapplication.exe" from hooking
           GetModuleFileName( GetModuleHandle( NULL ),Work,sizeof(Work) );
           PathStripPath(Work );

           if ( _stricmp( Work, "someapplication.exe" ) != 0 )
           {
              InstallWindowHooks();
           }

         break;
       case DLL_PROCESS_DETACH:
           hWindowReceiver = NULL;
           CleanUp();
         break;     
    }
    return TRUE;
}
0 голосов
/ 25 января 2010

Я не думаю, что это возможно. Вы либо цепляетесь за все, либо за конкретную ветку. Почему бы вам просто не отфильтровать ваше приложение по коду, который есть у function_address? Большинство, если не все, обратные вызовы ловушки CBT предоставляют дескриптор окна в аргументе wParam или lParam Затем вы можете получить идентификатор процесса из этого дескриптора и сравнить его с pid вашего приложения.

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