Главная страница
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.045 c
14-1090192400
K.o.Z
2004-07-19 03:13
2004.08.08
Oxygen Phone Manager for Nokia


9-1082144201
Shopot
2004-04-16 23:36
2004.08.08
Биллиард.


6-1086586737
vovan
2004-06-07 09:38
2004.08.08
баг с расшариванием ресурса


1-1090593728
fess
2004-07-23 18:42
2004.08.08
Приемы работы с Chart


4-1088081391
S.A.S.
2004-06-24 16:49
2004.08.08
шина PCI