Ошибка: Failed to parse the Currency Converter XML document.
$1 901.97


Ошибка: Failed to parse the Currency Converter XML document.
$2 727.29


Ошибка: Failed to parse the Currency Converter XML document.
$16 461.40


Перехват нажатия клавиши в Windows

Существуют приложения, которым необходимо перехватывать все нажатия клавиш в windows, даже если в данный момент активно другое приложение. Это может быть, например, программа, переключающая раскладку клавиатуры, резидентный словарь или программа, выполняющая иные действия по нажатию «горячей» комбинации клавиш.

Перехват всех событий в windows (в том числе и событий от клавиатуры) выполняется с помощью вызова функции setwindowshook(). Данная функция регистрирует в системе windows ловушку (hook) для определенного типа событий/сообщений. Ловушка — это пользовательская процедура, которая будет обрабатывать указанное событие.


Основное здесь то, что эта процедура должна всегда присутствовать в памяти windows. Поэтому ловушку помещают в dll и загружают эту dll из программы. Пока хоть одна программа использует dll, та не может быть выгружена из памяти. Приведем пример такой dll и программы, ее использующей. В примере ловушка перехватывает нажатие клавиш на клавиатуре, проверяет их и, если это клавиши «+» или «-», посылает соответствующее сообщение в конкретное приложение (окно). Окно ищется по имени его класса («t form1») и заголовку (caption, «xxx»).


{текст библиотеки}

library s endkey;

uses

wintypes, winprocs, messages;

const

{пользовательские сообщения}

wm_nextshow_event = wm_user + 133;

wm_prevshow_event = wm_user + 134;

{handle для ловушки}

hookhandle: hhook = 0;

var

saveexitproc : pointer;

{собственно ловушка}

function key_hook(code: integer; wparam: word; lparam: longint): longint; export;

var

h: hwnd;

begin

{если code>=0, то ловушка может обработать событие}

if code >= 0 then

begin

{это те клавиши?}

if ((wparam = vk_add)or(wparam = vk_subtract)) and

(lparam and 000000 = 0) then

begin

{ищем окно по имени класса и по заголовку}

h := findwindow(«t form1», «xxx»);

{посылаем сообщение}

if wparam = vk_add then

s endmessage(h, wm_nextshow_event, 0, 0)

else

s endmessage(h, wm_prevshow_event, 0, 0);

end;

{если 0, то система должна дальше обработать это событие}

{если 1 - нет}

result:=0;

end

else

{если code<0, то нужно вызвать следующую ловушку}

result := callnexthookex(hookhandle,code, wparam, lparam);

end;

{при выгрузке dll надо снять ловушку}

procedure localexitproc; far;

begin

if hookhandle<>0 then

begin

unhookwindowshookex(hookhandle);

exitproc := saveexitproc;

end;

end;

{инициализация dll при загрузке ее в память}

begin

{устанавливаем ловушку}

hookhandle := setwindowshookex(wh_keyboard, key_hook,

hinstance, 0);

if hookhandle = 0 then

messagebox(0, «unable to set hook!», «error», mb_ok)

else begin

saveexitproc := exitproc;

exitproc := @localexitproc;

end;

end.

Размер такой dll в скомпилированном виде будет около 3Кб, поскольку в ней не используются объекты из vcl.

Далее приведен код модуля в delphi, который загружает dll и обрабатывает сообщения от ловушки, просто отображая их в label1.

unit unit1;

interface

uses

sysutils, wintypes, winprocs, messages, classes, graphics, controls, forms, dialogs, stdctrls;

{пользовательские сообщения}

const

wm_nextshow_event = wm_user + 133;

wm_prevshow_event = wm_user + 134;

type

t form1 = class(t form)

label1: tlabel;

procedure formcreate(s ender: tobject);

private

{обработчики сообщений}

procedure wm_nextmsg ( var m : tmessage);

message wm_nextshow_event;

procedure wm_prevmsg ( var m : tmessage);

message wm_prevshow_event;

end;

var

form1: t form1;

p : pointer;

implementation

{$r *.dfm}

{загрузка dll}

function key_hook : longint; far; external «s endkey»;

procedure t form1.wm_nextmsg ( var m : tmessage);

begin

label1.caption:=«next message»;

end;

procedure t form1.wm_prevmsg ( var m : tmessage);

begin

label1.caption:=«previous message»;

end;

procedure t form1. formcreate(s ender: tobject);

begin

{если не использовать вызов процедуры из dll в программе,

то компилятор удалит загрузку dll из программы}

p:=@key_hook;

end;

end.

Конечно, свойство caption в этой форме должно быть установлено в «xxx».

 

Интересное

Выявление признаков...
Наблюдение за состоянием жёстких дисков.По грубым подсчётам, 60% всех случаев повреждения винчестеров имеют механическую природу (износ подшипников, хрупких дисков и головок чтения/записи)....
Подробнее...
Про Хакеров
«Уважаемый г-н Иванов! Коpпоpация Microsoft пpоводит беспpецедентную акцию и пpедлагает Вам участие в пpогpамме »Лицензия-Плюс«. Суть пpогpаммы заключается в том, что мы пеpеводим на Ваш...
Подробнее...
Чтение почты через...
В последнее время довольно популярными стали почтовые системы с web-интерфейсом.Надо заметить, это довольно удобно, особенно для пользователей,которые выходят в интернет с разных машин.Для...
Подробнее...
Unix-сервер: Установка и...
Несмотря на то, что для полного описания установки и настройки операционной системы и серверного ПО нужна целая книга, эта статья поможет вам увидеть основные сложности процесса и покажет...
Подробнее...
Проблемы программы...
Illustrator — странная программа, она не похожа на другие продукты Adobe. Порой складывается впечатление, что ее выпускает не Adobe столько проблем она делает. С самой первой из них пользователь...
Подробнее...
GSM – шлюз: Как через...
У меня возникла необходимость по нескольку раз в день принимать и отправлять фак- сы на даче, где нет городского телефона. Слышал, что для таких целей можно каким-то образом приспособить мобильный...
Подробнее...
Использование сессий в PHP
Очень часто при написании скриптов на php необходимо хранить некоторую информацию о посетителе в течение всего сеанса его работы. Типичным примером такой ситуации является необходимость...
Подробнее...
Собираем Apache + PHP +...
Итак попробуем все это собрать. Для начала нам понадобиться apache, php, sablot, xpat, iconv. Последние три представляют собой программы для обработки XML/XSLT файлов.
Подробнее...
Как за нами шпионят
Spyware – это термин, определяющий приложения, которые записывают информацию о поведении пользователя в сети Интернет и сообщают об этом своим создателям. Результатом их действия может стать как...
Подробнее...
Перенаправление stdout в...
Для перенаправления stdout в область памяти (или файл) необходимо написать небольшую конструкцию.Редирект в память или строку (std::string)
Подробнее...