Главная страница
    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.46 MB
Время: 0.036 c
6-1086645049
SergP
2004-06-08 01:50
2004.08.08
Прикол с TWebBrowser...


1-1090567631
segor
2004-07-23 11:27
2004.08.08
перекрыть метод закрытия формы


1-1090829144
oss
2004-07-26 12:05
2004.08.08
присоединение файла obj


8-1085061971
Nic2
2004-05-20 18:06
2004.08.08
JPG ---> GIF


1-1090930435
GrayFace
2004-07-27 16:13
2004.08.08
Чем отличаются GetMem и AllocMem?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский