C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 152 - Hooks (перехват) / Win 32 API / Win32 API

Шаг 152 - Hooks (перехват)

Понятие перехвата используется во многих областях. Например, даже при создании диалогового окна открытия файла мы может установить перехват подробнее читайте "Шаг 140 - Cтруктура OPENFILENAME". Перехват является точкой в обработка сообщений Microsoft Windows, где приложение может установить подпрограмму, чтобы проверить трафик сообщения в системе и обработать определенные тип сообщений прежде, чем они достигнут процедуры окна в которую посланы. Перехваты имеют тенденцию замедлять систему из-за того, что они увеличивают суммарное время обработки, которую система должна выполнить для каждого сообщения. У нас есть утилита SPY подробнее читайте "Шаг 47 - Как пользоваться SPY", которая умеет следить за сообщениями Windows для конкретного окна. Разработчики использующие MFC имеют еще одну дополнительную утилиту MFC Tracer, читайте "Шаг 44 - Знакомимся с MFC Tracer", "Шаг 227 - afxTraceFlags", которая позволяет следить за сообщениями. Можно воспользоваться и сторонними утилитами, которые в основном нацелены на слежение за пользователями читайте "Шаг 139 - Программа слежения WinGuard".

А можно создать ее и самому. Вы должны устанавливать захват только когда необходимо, и удалять его как можно скорее. Для установки захвата используется функция.

HHOOK SetWindowsHookEx
(
	int idHook,	// тип перехвата
	HOOKPROC lpfn,	// процедура перехвата
	HINSTANCE hMod,	// указатель приложения
	DWORD dwThreadId	// идентифкатор потока
); 

А для отмены перехвата UnhookWindowsHookEx. Ну попробуем, что ли. MFC приложение Dialog Bases:

152_1.gif (2450 b)

Заводим глобальную переменную:

static char THIS_FILE[] = __FILE__;
#endif

HHOOK hk;

/////////////////////////////////////
// CAboutDlg dialog used for App About

А теперь процедуру обработки, запуск и остановка перехвата:

LRESULT  CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	MessageBox(NULL,"Hook","Hook",MB_OK);
	return CallNextHookEx(hk, nCode, wParam, lParam);
}

void CHookDlg::OnStart() 
{
	hk = SetWindowsHookEx(WH_KEYBOARD,&HookProc, NULL, 0);
}

void CHookDlg::OnStop() 
{
	UnhookWindowsHookEx(hk);	
}

Все можно запускать. Теперь после запуска программы и нажатия на Start, где бы Вы не нажали клавишу тут Ваша программа получит сообщение. Вот я в WORD попытался нажать клавишу:

152_2.gif (3003 b)

Полный пример есть в проекте.


Загрузить проект | | |
Автор Каев Артем.
[AD]