Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

Hook в KOL   Найти похожие ветки 

 
Kirill ©   (2002-09-04 11:25) [0]

У меня вопрос как в чистом KOL сделать глобальный hook на клавиатуру. Т.е. у меня работает программа и находится в трее. Хочу по нажатию на Ctrl+F11 она появлялась (восстанавливалась). Желательно с примером.


 
HekTo   (2002-09-04 11:36) [1]


> У меня вопрос как в чистом KOL сделать глобальный hook на
> клавиатуру.

IMHO так же как и на VCL т.к. это все делается через винапи. Посмотри в справке по Win32S функции SetWindowsHookEx и KeyboardProc.


 
Kirill ©   (2002-09-04 11:41) [2]

Смотрел, пока не получилось. Не можешь мне помочь написать, как это должно выглядеть. DLL не хочу делать (хочу чтобы ловушка была в exeшнике).


 
BorisMor   (2002-09-04 12:53) [3]

Если мне не изменяет память то глобальный хук без dll не пройдет.
Вобщем то в разделе статьи на delphi.mastak.ru есть публикация по данной теме.


 
Kirill ©   (2002-09-04 13:18) [4]

Читал. Там даже примеры есть, но с использованием dll. А хотелось бы одним файлом отделаться.


 
Gandalf   (2002-09-04 18:14) [5]

Насколько помню в SDK есть слова мол "must ... dll".
Не факт но возможно иначе нельзя. Уточни в АПИ-форум. Как сделаешь на АПИ к нам иди.


 
Vladimir Kladov   (2002-09-05 08:34) [6]

При чем здесь хук, если надо только на определенную комбинацию
среагировать своей программе, а не фильтровать все сообщения от
клавиатуры, тогда достаточно RegisterHotKey. И для системы менее
напряжно, и dll не нужна.


 
Kirill ©   (2002-09-05 11:21) [7]

Владимир, а как зарегистрировать. Я пробовал, но не знаю как для него определить обработчик.


 
Kirill ©   (2002-09-05 11:35) [8]

Посмотрел пример
http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988621065&n=16
или
http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988621066&n=15
Но при компиляции ругается на директиву message
Unknown directive: "message"


 
pongo   (2002-09-05 19:24) [9]

для VCL есть компонент KeySpy, который позволяет отлавливать нажатия клавиш без DLL. Но, в KOL он не работает.

Так же на сем сайте(или на Королевсте Дельфи) были помещены исходники одной программы, где происходило, то, что тебе нужно. но я не смог найти в коде этот участок. вот ссылка:

http://delphi.mtu-net.ru/zip/warp.zip


 
Vladimir Kladov   (2002-09-05 22:13) [10]

OnMessage, обрабатывать в нем WM_HOTKEY.


 
Kirill ©   (2002-09-06 10:20) [11]

OnMessage для чего? Для формы? Как она получит это сообщение, если она находтся в трее?


 
Vladimir Kladov   (2002-09-06 17:11) [12]

Для Applet. И RegisterHotKey( Applet.Handle, ... а не формы.


 
Kirill ©   (2002-09-06 17:58) [13]

Виснит.
function OnMess(Dummy: Pointer; var Msg: TMsg; var Rslt: Integer): boolean;
begin
if (msg.message=WM_HOTKEY) and (msg.lParam=MOD_CONTROL) and (msg.wParam=VK_F12) then begin
ShowMessage("Ctrl + F12!");
end;
end;
...
indHK:=GlobalAddAtom("Test");
RegisterHotKey(Applet.Handle,indHK,MOD_CONTROL,VK_F12);
Applet.OnMessage:=TOnMessage(MakeMethod(nil,@OnMess));
...


 
Vladimir Kladov   (2002-09-07 17:09) [14]

Result := false в OnMess.


 
Kirill ©   (2002-09-09 14:10) [15]


> if (msg.message=WM_HOTKEY) and (msg.lParam=MOD_CONTROL)
> and (msg.wParam=VK_F12) then begin
> MsgOk("Ctrl + F12!");
> end;
> result:=false;
> end;

Это правильный обработчик hotkey? Он не ловит нажатие Ctrl+F12.


 
Vladimir Kladov   (2002-09-09 16:05) [16]

Нет, просто надо так:

function TForm1.KOLApplet1Message(var Msg: tagMSG;
var Rslt: Integer): Boolean;
begin
Result := FALSE;
if (msg.message=WM_HOTKEY) and (msg.wParam=1001) then
begin
ShowMessage( "Hot key!" );
end;
end;

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
RegisterHotkey( Applet.Handle, 1001, MOD_CONTROL, VK_F12 );
end;


 
Kirill ©   (2002-09-09 16:39) [17]

Заработало!


 
Kirill ©   (2002-09-09 18:30) [18]

Рано обрадовался. Код рабодает только под IDE. Ехе-шник один без IDE не работает.


 
Kirill ©   (2002-09-09 18:46) [19]

Прошу прощения. Поторопился с предыдущим сообщением.
2Владимир:
Посмотри, пожалуйста, почему ошибка программы не в IDE появлялась в этой строчке

pmnTray:=NewMenu(edBox,0,["Показать","-","Выход"],TOnMenuItem(MakeMethod(nil,@OnPMClick))

А в IDE работала нормально.
В общем-то я ее перенес на событие от мыши в трее и она заработала.


 
Vladimir Kladov   (2002-09-11 09:53) [20]

Что значит в IDE работало? Когда Delphi запущен? Компилировалось? Я в растерянности, выражайтесь точнее, пожалуйства.


 
Kirill ©   (2002-09-11 10:51) [21]

Прошу прощения. Я имел ввиду, когда в IDE нажимал F9, то оно работало. А когда запускал exe-шник из проводника то программа выдавала ошибку.


 
Vladimir Kladov   (2002-09-13 08:15) [22]

Да, это я стормозил. Теперь перечитал - понятно.

Result.PopupMenu1 := NewMenu( Result.Form, 0, [
"Minimize me", "Close me", "" ], nil );
Result.PopupMenu1.AssignEvents( 0, [ Result.PopupMenu1N2Menu ] );
Result.PopupMenu1.AssignEvents( 1, [ Result.PopupMenu1N1Menu ] );


- вот такой код сгенерировался у меня, и все работает. В IDE, и без него. А как OnPMClick выглядит?


 
Kirill ©   (2002-09-13 13:35) [23]

case Item of
0: ShowWin;
1: begin
flClose:=true;
frmM.Close;
end;
end;//case
end; //OnPMClick

procedure ShowWin;
begin
flTray:=false;
frmM.Visible:=not flTray;
trIcon.Active:=flTray;
frmM.StayOnTop:=true;
frmM.BringToFront;
frmM.Focused:=true;
end;


 
Vladimir Kladov   (2002-09-14 11:22) [24]

Мало, меня еще заголовок интересует. Там есть dummy: Pointer для
замещения Self?


 
Kirill ©   (2002-09-18 18:53) [25]

procedure OnPMClick(Dummy: Pointer; Sender: PMenu; Item: Integer);
begin
case Item of
0: ShowWin;
1: begin
flClose:=true;
frmM.Close;
end;
end;//case
Free_And_Nil(pmnTray);
end;


 
Vladimir Kladov   (2002-09-20 11:26) [26]

Я эффекта не достиг. Кто может еще повторить?
(А может, хот-кей не назначился - перекрыт какой-нибудь программой?
Другой попробуйте. Ctrl+Alt+1, например.)

Единственное отличие, которое может повлиять на программу при запуске не из под IDE - это то, что текущая директория будет не обязательно совпадать с директорией, где лежит программа.



Страницы: 1 вся ветка

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.021 c
4-26844
Gefest
2003-04-11 21:03
2003.06.09
Как создать StringGrid только через API?


1-26605
Project111
2003-05-28 17:10
2003.06.09
Excel...елки палки...


1-26428
pirat
2003-05-28 19:05
2003.06.09
Как определить наличие нода в XML документе ?


3-26385
HelDet
2003-05-21 13:01
2003.06.09
TDBImage (извлечь из Microsoft Access)


3-26395
som
2003-05-21 14:26
2003.06.09
Paradox