Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Перехват нажатия клавиши неактивной формой   Найти похожие ветки 

 
cvg   (2004-07-22 09:02) [0]

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 09:14) [1]

Sorry, ошибочка у меня там! Надо:

handle := FindWindow(nil,pchar("keyemul"));


 
CHES ©   (2004-07-22 09:22) [2]

В случае статической загрузки dll объяви в приложении:

procedure SetHook; stdcall; external "keyspy.dll";
procedure UnHook; stdcall; external "keyspy.dll";

dll должна находится в каталоге с программой или в Windows\System32 или что там еще у тебя в PATH прописано.


 
cvg   (2004-07-22 09:37) [3]

Хм, это в каком разделе? Type? Компилятор говорит Field definition not allowed after method and properties :(


 
cvg   (2004-07-22 09:39) [4]

О, кажется в разделе implementation...


 
CHES ©   (2004-07-22 09:44) [5]

Вообще-то в interface или implementation
Уж точно не в type


 
cvg   (2004-07-22 09:50) [6]

OK. Только вот все равно ни фига не происходит. Перед

handle := FindWindow(nil,pchar("keyemul"));

вставил

showMessage("qqq");

и -- никакой реакции! Why? :/


 
CHES ©   (2004-07-22 10:21) [7]

Установи свойство KeyPreview формы в true.

Учти что если у тебя в обработчике wm_KeyDown ShowMessage  то увидишь ты его только после того как форма снова будет в фокусе.


 
cvg   (2004-07-22 10:39) [8]

Эге, да ты волшебник, однако!!! Короче, сообщения так и не появилось, но прога завершилась -- как и порразумевалось в самом начале моих кропений. Вот.


 
cvg   (2004-07-22 15:03) [9]

К сожалению, финт не прошел Ж:(. Дело в том, что в основном цикле прога грабит данные с экрана, поэтому эмуляция нажатия на любую клавишу просто попадает Clipboard, как я полагаю... Поэтому после перехвата нажатия клавиши в DLLине хотелось бы сгенерить какое-нить Windовое сообщение (что-то из сереии OnMessage), а потом в основной проге перехватить уже его... Весь вопрос: а как это делается?



Страницы: 1 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.089 c
1-1090827149
Delphi5.01
2004-07-26 11:32
2004.08.08
Preview QReport


14-1089997964
Undert
2004-07-16 21:12
2004.08.08
SQL + IP диапазон


1-1090575798
Павел_
2004-07-23 13:43
2004.08.08
Чем отличается (Sender as TLabel) и TLabel(Sender)?


1-1090497810
Mielofon
2004-07-22 16:03
2004.08.08
Куда девать файлы?


1-1090927556
alex_sc
2004-07-27 15:25
2004.08.08
Вопрос