![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват нажатия клавиши неактивной формой [D7, WinXP]
cvg © (2004-07-22 09:02:00)Hi all! Спасибо всем, кто мне, как чайнику, уже помогал в данном вопросе. IMHO остается доделать всего ничего.
Итак, на основании совета по адресу http://msk.nestor.minsk.by/kg/2003/26/kg32602.htmlя написал такую DLLину:
library keyspy;// имя библиотеки
uses
Windows, Messages;
var
MyHookHandle:HHook = 0;
function MyCoolHook(Code: integer; wParam: word; lParam: Longint):LongInt;stdCall;
var handle:HWND;
begin
if code < 0
then Result := CallNextHookEx(MyHookHandle,Code, wParam, lParam)
else//проверка, какая кнопка нажата
begin
result:=0;
if wParam = VK_F2
then
begin
handle := FindWindow('TMainForm',pchar('keyemul'));
postmessage(handle,wm_KeyDown,vk_F2,0);
Result := 1;//для того, чтобы windows не обрабатывал это сообщение
CallNextHookEx(MyHookHandle,Code, wParam, lParam)//вызываю следующую ловушку
end;{if}
end;
end;
{===========================}
procedure SetHook;stdCall;Export;
begin
MyHookHandle := SetWindowsHookEx(WH_Keyboard, @MyCoolHook, hInstance, 0);//устанавливаю хук
end;
{===========================}
procedure UnHook;stdCall;Export;
begin
UnhookWindowsHookEx(MyHookHandle);//снимаю хук
end;
{===========================}
exports//экспортирую функции
SetHook,
Unhook;
Begin
SetHook;//устанавливаю ловушку
end.
В основном проекте присутствует такая функция:
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
f := Key = VK_F2;
end;
В результате ничего не происходит. Возможно, проблема в том, что при запуске основной проги я не гружу keyspy.dll. Но как это сделать?
cvg (2004-07-22 15:03:00) [1]К сожалению, финт не прошел Ж:(. Дело в том, что в основном цикле прога грабит данные с экрана, поэтому эмуляция нажатия на любую клавишу просто попадает Clipboard, как я полагаю... Поэтому после перехвата нажатия клавиши в DLLине хотелось бы сгенерить какое-нить Windовое сообщение (что-то из сереии OnMessage), а потом в основной проге перехватить уже его... Весь вопрос: а как это делается?
cvg (2004-07-22 10:39:00) [2]Эге, да ты волшебник, однако!!! Короче, сообщения так и не появилось, но прога завершилась -- как и порразумевалось в самом начале моих кропений. Вот.
CHES (2004-07-22 10:21:00) [3]Установи свойство KeyPreview формы в true.
Учти что если у тебя в обработчике wm_KeyDown ShowMessage то увидишь ты его только после того как форма снова будет в фокусе.
cvg (2004-07-22 09:50:00) [4]OK. Только вот все равно ни фига не происходит. Перед
handle := FindWindow(nil,pchar('keyemul'));
вставил
showMessage('qqq');
и -- никакой реакции! Why? :/
CHES (2004-07-22 09:44:00) [5]Вообще-то в interface или implementation
Уж точно не в type
cvg (2004-07-22 09:39:00) [6]О, кажется в разделе implementation...
cvg (2004-07-22 09:37:00) [7]Хм, это в каком разделе? Type? Компилятор говорит Field definition not allowed after method and properties :(
CHES (2004-07-22 09:22:00) [8]В случае статической загрузки dll объяви в приложении:
procedure SetHook; stdcall; external 'keyspy.dll';
procedure UnHook; stdcall; external 'keyspy.dll';
dll должна находится в каталоге с программой или в Windows\System32 или что там еще у тебя в PATH прописано.
cvg (2004-07-22 09:14:00) [9]Sorry, ошибочка у меня там! Надо:
handle := FindWindow(nil,pchar('keyemul'));