« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга

Тестирование 64-битных приложений

ПнВтСрЧтПтСбВс
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
    Популярное
Microsoft SharePoint: установка Service Pack 1 и обновлений

Функция GetMessageTime

Валидация XML

Платформа независимый динамический сайт – миф или реальность?

Бумеранг против спама

Создание таблицы в конструкторе таблицы

Функция date() - вывод даты и времени в PHP

VBX в приложениях DELPHI - как распространять

Формирование названия единицы измерения

Создание установочной дискеты




    Архив файлов



    Сообщества



    Документация

Статьи:: Delphi :: Разные статьи :: Использование HOOK в Дельфи.


отправить ссылку другу версия для печати  Обсудить на форуме

Использование HOOK в Дельфи.





Новая страница 1

Использование HOOK в Дельфи.

Что такое НООК?
НООК - это механизм перехвата сообщений, предоставляемый системой Microsoft Windows. Программист пишет специального вида функцию (НООК-функция), которая затем при помощи функции SetWindowsHookEx вставляется на верх стека НООК-функций системы. Ваша НООК-функция сама решает, передать ли ей сообщение в следующую НООК-функцию при помощи CallNextHookEx или нет. 

Какие бывает НООК'и?
НООК бывают глобальные, контролирующие всю систему, так и локальные, ориентированные на какой-либо поток (Thread). Кроме того НООК различаются по типу перехватываемых сообщений (подробнее об этом - ниже). НООК несколько подтормаживают систему, поэтому ставить их рекомендуется только при необходимости, и кактолько необходимость в них отпадает - удалять. 

Как создавать НООК? 
НООК устанавливается в систему при помощи функции SetWindowsHookEx, вот её заголовок: function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK;


idHook 
константа, определяющая тип вставляемого НООК'а, должна быть одна из нижеследующих констант: 
WH_CALLWNDPROC 
вставляемая НООК-функция следит за всеми сообщения перед их отпралением в соответствующую оконную функцию 
WH_CALLWNDPROCRET 
вставляемая НООК-функция следит за всеми сообщениями после их отправления в оконную функцию 
WH_CBT 
вставляемая НООК-функция следит за окнами, а именно: за созданием, активацией, уничтожением, сменой размера; перед завершением системной команды меню, перед извлечением события мыши или клавиатуры из очереди сообщений, перед установкой фокуса и т.д. 
WH_DEBUG 
вставляемая НООК-функция следит за другими НООК-функциями. 
WH_GETMESSAGE 
вставляемая НООК-функция следит за сообщениями, посылаемыми в очередь сообщений. 
WH_JOURNALPLAYBACK 
вставляемая НООК-функция посылает сообщения, записанные до этого WH_JOURNALRECORD НООК'ом. 
WH_JOURNALRECORD 
эта НООК-функция записывает все сообщения куда-либо в специальном формате, причем позже они могут быть "воспроизведены" при помощи НООК'а WH_JOURNALPLAYBACK. Это в некотором роде аналог магнитофонной записи сообщений. 
WH_KEYBOARD 
вставляемая НООК-функция следит за сообщениями клавиатуры 
WH_MOUSE 
вставляемая НООК-функция следит за сообщениями мыши 
WH_MSGFILTER 
WH_SHELL 
WH_SYSMSGFILTER 
lpfn 
указатель на непосредственно функцию. Обратите внимание, что если Вы ставите глобальный НООК, то НООК-функция обязательно должна находиться в некоторой DLL!!! 
hmod 
описатель DLL, в которой находится код функции. 
dwThreadId 
идентификатор потока, в который вставляется НООК 
Подробнее о НООК-функциях сотри справку по Win32API. 

Как удалять НООК?
НООК удаляется при помощи функции UnHookWindowsEx. 

Пример использования НООК.
Ставим НООК, следящий за мышью (WH_MOUSE). Программа следит за нажатием средней кнопки мыши, и когда она нажимается, делает окно, находящееся непосредственно под указателем, поверх всех остальных (TopMost). Код самой НООК-функции помещен в библиотеку lib2.dll, туда же помещены и функции Start - для установки НООК, и Remove - для удаления НООК. 

Файл sticker.dpr
program sticker;

uses windows, messages;


var wc : TWndClassEx;
MainWnd : THandle;
Mesg : TMsg;
//экспортируем две функции из библиотеки с НООК'ами
procedure Start; external 'lib2.dll' name 'Start';
procedure Remove; external 'lib2.dll' name 'Remove';

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var nCode, ctrlID : word;
Begin
case msg of
wm_destroy :
Begin
Remove;//удаляем НООК
postquitmessage(0); exit;
Result:=0;
End;

else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;


begin

wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:='WndClass1';

RegisterClassEx(wc);


MainWnd:=CreateWindowEx(0,'WndClass1',
'Caption',
ws_overlappedwindow,
cw_usedefault,cw_usedefault,cw_usedefault,cw_usedefault,0,0,
Hinstance,nil);


ShowWindow(MainWnd,CmdShow);

Start;//вставляем НООК

While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;

end.



Файл lib2.dpr
library lib2;


uses
windows, messages;
var
pt : TPoint;
theHook : THandle;

function MouseHook(nCode, wParam, lParam : integer) : Lresult; stdcall;
var
msg : PMouseHookStruct;
w : THandle;
style : integer;

Begin
if nCode<0 then begin
result := CallNextHookEx(theHook, nCode, wParam, lParam);
exit;
end;
msg := PMouseHookStruct(lParam);

case wParam of
WM_MBUTTONDOWN : pt := msg^.pt;
WM_MBUTTONUP : begin
w := WindowFromPoint(pt);
style := GetWindowLong(w, GWL_EXSTYLE);
if (style and WS_EX_TOPMOST) <> 0 then begin
//уже поверх всех - сделать обычным
ShowWindow(w, sw_hide);
SetWindowPos(w, HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE OR SWP_SHOWWINDOW);
end
else begin
//сделать поверх остальных 
ShowWindow(w, sw_hide);
SetWindowPos(w, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE OR SWP_NOSIZE OR SWP_SHOWWINDOW);
end;

end;
end;


result := CallNextHookEx(theHook, nCode, wParam, lParam);
End;


procedure Start;
begin

theHook := SetWindowsHookEx(wh_mouse, @mouseHook, hInstance, 0);
if theHook = 0 then messageBox(0,'Error!','Error!',mb_ok);
end;

procedure Remove;
begin
UnhookWindowsHookEx(theHook);
end;

exports
Start index 1 name 'Start',
Remove index 2 name 'Remove';

end.

Всё.




Рубрика: Разные статьи




9 правил для начинающего Ajax-разработчика.

AJAX

Эти девять правил несложны, никаких кусков кода — только общие советы начинающим Ajax-разработчикам. Крайне вольный перевод 9 AJAX Tips & Tricks.


Подробнее... | Рубрика: AJAX | Добавлено: 25.08.2008

ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения.

AJAX

Приветствуем наших читателей. Что-то в последнее время много новостей и я даже не успеваю все отобрать и написать о самых интересных технологиях и продуктах. А ведь ещё и работать иногда надо. Но мимо этой новости мы просто не могли пройти - ведь AJAX и ExtJS как его наглядное воплощения это наша основная технологическая платформа. А буквально вчера вышла следующая версия в текущей ветке 2.х - 2.2 Что же там нового, полезного и интересного мы сейчас и рассмотрим.


Подробнее... | Рубрика: AJAX | Добавлено: 25.08.2008

Windows 7: под покровом тайны.

Windows 7

О преемнице Windows Vista, носящей кодовое имя Windows 7, известно очень мало. Корпорация Microsoft, наученная горьким опытом, с крайней неохотой делится с журналистами информацией о разрабатываемой системе, дабы у пользователей и разработчиков программного обеспечения не сложилось искаженное представление о продукте, которое бы повлияло на продажи новой операционки, как это случилось с "Вистой". Тем не менее, некоторые скупые сведения хоть и изредка, но просачиваются из стен редмондского гиганта.


Подробнее... | Рубрика: Windows 7 | Добавлено: 25.08.2008

Остальные статьи:

Apache mod_ndb - MySQL кластер с доступом через HTTP и Ajax
Поиск уязвимостей в программах с помощью анализаторов кода
Как появилась библиотека VivaCore
Это сложно
ASP.NET и немного поисковой оптимизации
Protocol buffers: библиотека обмена данными для C++, Java, Python от Google
Описание VivaVisualCode
JQuery: Пара сотен плагинов в одной заметке
Касание сетки
Разработка элементов управления ASP.NET на примере навигационной панели
Сохранения параметров приложения в .Net
Custom cursors в .Net
Бегун убегает от хозяина
"Битрикс" выпустил седьмую версию CMS
Выбираем систему управления сайтом
Рынок CMS в Европе или впечатления с CeBIT 2008


Цитата дня (все,добавить):



    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 41
Пользователей: 0