Форум: "Основная";
Текущий архив: 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