Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват нажатия клавиши неактивной формой [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'));


Наверх

Титульная страница Поиск, карта сайта Написать письмо