Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-26403
KIR
2003-05-21 17:45
2003.06.09
Можно ли программно создать резервную копию базы IB?


7-26797
Islander
2003-03-31 09:04
2003.06.09
Выключить компьютер в XP


3-26347
Belkova
2003-05-20 13:00
2003.06.09
DBGRID


14-26699
бомонд
2003-05-26 10:16
2003.06.09
Песня


1-26506
Апатин Даниил
2003-05-29 16:39
2003.06.09
помогите написать управляющую часть для шифратора





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