Форум: "KOL";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "KOL";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c