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


1-1090434833
Случайно забежавший
2004-07-21 22:33
2004.08.08
Двоичный код


14-1090495528
ИМХО
2004-07-22 15:25
2004.08.08
Просмотрщик дайджестов этих форумов


1-1090974268
Господин со спичками
2004-07-28 04:24
2004.08.08
СРОЧНО - Как "занять" место на экране подобно Панели Задач?


1-1090507285
bloodman
2004-07-22 18:41
2004.08.08
прередача строк из Dll в программу.





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