Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Глобальный хук

343
28 ноября 2008 года
lena_ki
282 / / 14.04.2005
[FONT=Arial]В интернете много примеров как устанвить хук на мышь и клавиатуру. Мне нужен хук отслеживающий запуск определенной чужой программы (с именем Tracer.exe). Если программа запустилсь сделать одно действие, если программа закрылась сделать другое действие в моей программме. При этом должно быть максимальное быстродействие.[/FONT]
[FONT=Arial]Как это реализовать? Что использовать: [/FONT]
[FONT=Arial]WH_SHELL [/FONT]
[FONT=Arial]WH_CALLWNDPROC [/FONT]
[FONT=Arial]WH_CBT[/FONT]
[FONT=Arial]?[/FONT]
[FONT=Arial]и как должен выглядить код функции Tracer_Hook? [/FONT]
Код:
//"UMyDLL.h"
#ifndef _UHOTKEY_H
#define _UHOTKEY_H
#ifdef __DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif
extern "C" void DLL_EI StartHook();
extern "C" void DLL_EI RemoveHook();
#endif
//*********************************
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
#include "UMyDLL.h"
HHOOK HKey = 0;
int _stdcall Tracer_Hook(int code, int wParam, int lParam)
{
/*
     if (code > 0 && wParam == HCBT_CREATEWND)
        {
 
   return 1;
        }
       else
      {
       return CallNextHookEx(HKey, code, wParam, lParam);
      }
*/
}
 
void StartHook()
{
 HKey = SetWindowsHookEx(WH_CBT,(WNDENUMPROC)Tracer_Hook,HInstance,0);
 if (HKey==0)
 {
  MessageBox(0, "Не удалось включить отслеживание программы Tracer", "Ошибка", MB_OK);
 }
}
void RemoveHook()
{
  if (HKey!=0)
  {
   UnhookWindowsHookEx(HKey);
   HKey = 0;
  }
}
 
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
 if((reason == DLL_THREAD_DETACH) || (reason == DLL_PROCESS_DETACH))
   {
     if (HKey!=0)
    UnhookWindowsHookEx(HKey);
    }
   return 1;
}
//---------------------------------------------------------------------------
288
29 ноября 2008 года
nikitozz
1.2K / / 09.03.2007
Если приложение оконное и вы знаете заголовок (и/или другие уникальные признаки) его главного окна, тогда WH_CBT подходящий вариант. В этом случае ловушка будет выглядеть так:
Код:
HWND hTracerHandle = NULL; // Handle главного окна приложения
..........................................................................................
int _stdcall Tracer_Hook(int code, int wParam, int lParam)
{
if (code == HCBT_CREATEWND) // Окно создается
{
    LPCBT_CREATEWND pCBTCreateWnd = (LPCBT_CREATEWND)lParam;
    // То ли это окно, которое нам нужно
    // можно определить по каким либо признакам из CREATESTRUCT
    // здесь определяю по заголовку окна
    if ( strcmp(pCBTCreateWnd->lpcs->lpszName, ...) == 0 )
    {
        hTracerHandle = (HWND)wParam;
        //Какие-то действия при запуске приложения
    }
}
else if (code == HCBT_DESTROYWND)
{
    if ( (hTracerHandle != NULL) && (hTracerHandle == (HWND)wParam) )
    {
        hTracerHandle = NULL;
        //Какие-то действия при завершении приложения
    }
}
return CallNextHookEx(HKey, code, wParam, lParam);
}

(Код не тестировал, но думаю должен работать).
Если же у приложения окна, создаваемого при запуске, нет, тогда попробуйте посмотреть здесь например
http://forum.ru-board.com/topic.cgi?forum=33&topic=9217

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог