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


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


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


Перехват нажатия клавиши в 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».

 

Интересное

Запуск mergemaster для...
В статье рассматривается работа с программой mermemaster при обновлении ОС FreeBSDDisclaimer Я ни в коем разе не претендую, что установка сделана правильно, корректно, «так как надо» и...
Подробнее...
Режим редактирования в IE
Оказывается ie может редактировать открытые им документы, и не только текст, но и в том числе вставлять имиджи и т.п. По сути дела полноценный html-editor у нас в руках, но только об этом...
Подробнее...
Корпоративный интернет-счётчик
В данной статье рассказывается как создать интернет-счётчик для корпоративного порталаСчётчик должен вести подробную информацию о посетителях: адрес откуда пришёл посетитель, адрес страницы,...
Подробнее...
FAQ по разделу CGI интерфейс
Как мне сделать аутентификацию на Перле, а не средствами веб-сервера?:Для того, чтобы браузер выдал запрос логина и пароля, скрипт должен выдать следующие заголовки: print «WWW-Authenticate:...
Подробнее...
Коды ответов сервера
В первой строке ответа HTTP-сервера содержится информация о том, был запрос клиента успешным или нет, а также данные о причинах успешного либо неуспешного завершения запроса. Эта информация...
Подробнее...
Поиск файлов с расширением...
Чтобы убедиться в этом, создайте текстовый файл и запишите в него одно слово (например, «поиск»). Сохраните этот файл с расширением log или cpp. Теперь запустите поиск файлов (Пуск > Поиск),...
Подробнее...
Откат обновлений драйверов...
Обновляя драйвер, чтобы решить существующие проблемы или улучшить работу устройства, не стоит забывать, что установка нового драйвера может привести к неожиданным результатам или воспрепятствовать...
Подробнее...
Основы работы с базами данных
Умение обращаться с файлами данных — чуть ли не одна из самых важных ступений в обучении программированию на Visual Basic! Здесь я постараюсь выложить только самые основные приёмы работы с...
Подробнее...
Сделать первый небольшой...
С чего начать?Я думаю, сейчас самое время перейти от слов к делу — сделать первый небольшой скрипт.Возьмем для примера следующую задачу. Нужно сделать базу с книгами, которые появились или скоро...
Подробнее...
Увеличение...
Настройка сетевой подсистемы FreeBSDЭта статья описывает несколько простых шагов, которые можно выполнить,для получения прироста производительности сетевой подсистемы, а такжеправильно выбрать...
Подробнее...