Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.045 c
1-1090562943
ilgam
2004-07-23 10:09
2004.08.08
Вопрос по потокам: создание компопнента в потоке


1-1090908343
Blick
2004-07-27 10:05
2004.08.08
Системные службы


6-1086523457
lena19
2004-06-06 16:04
2004.08.08
установка и разрыв соединения


1-1090490575
ted
2004-07-22 14:02
2004.08.08
Задание и смена пароля приложения


3-1089902181
Leech
2004-07-15 18:36
2004.08.08
SQL запрос на Paradox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский