Регистрация “горячих клавиш”
Регистрация «горячих клавиш»
Регистрация "горячих клавиш" Если честно признаться, то я не писатель . Но эту статью меня вынудила написать наглость компоненты hotkey. Она никак не хотела работать и насмешливо мне улыбалась с палитры компонентов . Ну вот, и доулыбалась. В этой статье я напишу, как же всё-таки стереть с лица эту наглую улыбку . Для лучшего усвоения информации я опишу метод глобальной регистрации "горячих клавиш" на примере. Перво-наперво нам необходимо создать две формы: одна форма будет главной (form1), а другая будет как бы окном настроек программы (form2). На form1 надо предусмотреть возможность вызова form2, незнаю, что это будет, кнопка или контекстное меню, неважно, главное, шоб было . Так вот, На form2 необходимо расположить компоненту hotkey с закладки win32 и кнопку "ОК" для сохранения настроек, а на form1 - три кнопки: "Выход", "Настройки", "Свернуть". Настройки будем сохранять в ini-файле, который будет автоматически, при первом запуске, создаваться в корне папки с установленной программой. Также, для наглядного примера, необходимо установить компоненту cooltrayicon, иначе пример будет не пример и исходник не запустится. Ниже привожу листинги примера программы, которая будет "разворачиваться из трея" при нажатии Вами же заданными "горячими клавишами". <-- project 1--> program hotkeyglobal; uses forms, hotunit in 'hotunit.pas' {form1}, setunit in 'setunit.pas' {form2}; {$r *.res} begin application.initialize; application.title := 'hotkeyglobal'; application.createform(tform1, form1); application.createform(tform2, form2); application.showmainform := false; application.run; end. <-- unit 1--> unit hotunit; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls, cooltrayicon, comctrls, buttons, extctrls, shellapi; type tform1 = class(tform) cooltrayicon1: tcooltrayicon; button1: tbutton; button2: tbutton; button3: tbutton; procedure cooltrayicon1click(sender: tobject); procedure formcreate(sender: tobject); procedure formclose(sender: tobject; var action: tcloseaction); procedure button3click(sender: tobject); procedure button1click(sender: tobject); procedure button2click(sender: tobject); private hotkeycontacts:tshortcut; procedure wmhotkey(var msg: twmhotkey); message wm_hotkey; { private declarations } public function reghotkey(hotkey:tshortcut):boolean; { public declarations } end; var form1: tform1; implementation uses setunit; {$r *.dfm} function tform1.reghotkey(hotkey:tshortcut):boolean; var thekey:word; theshiftstate:tshiftstate; modifiers:cardinal; begin unregisterhotkey(handle,0); hotkeycontacts:=hotkey; shortcuttokey(hotkeycontacts, thekey, theshiftstate); modifiers:=0; if ssalt in theshiftstate then modifiers:=modifiers or mod_alt; if ssshift in theshiftstate then modifiers:=modifiers or mod_shift; if ssctrl in theshiftstate then modifiers:=modifiers or mod_control; result:=registerhotkey(handle,0,modifiers,thekey); end; procedure tform1.wmhotkey(var msg:twmhotkey); begin if msg.hotkey=0 then begin form1.show; end; end; procedure tform1.cooltrayicon1click(sender: tobject); begin form1.show; end; procedure tform1.formcreate(sender: tobject); begin hotkeycontacts:=0; end; procedure tform1.formclose(sender: tobject; var action: tcloseaction); begin unregisterhotkey(handle,0); end; procedure tform1.button3click(sender: tobject); begin form1.close; end; procedure tform1.button1click(sender: tobject); begin form1.hide; end; procedure tform1.button2click(sender: tobject); begin form2.showmodal; end; end. <-- unit 2--> unit setunit; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls, buttons, comctrls, spin, inifiles, extctrls; type tform2 = class(tform) hotkey1: thotkey; button1: tbutton; procedure readparams; procedure writeparams; procedure formcreate(sender: tobject); procedure button1click(sender: tobject); procedure button2click(sender: tobject); private { private declarations } public { public declarations } end; var form2: tform2; a:integer; implementation uses hotunit; {$r *.dfm} procedure tform2.readparams; var inifile:tinifile; begin inifile := tinifile.create(changefileext(paramstr(0),'.ini')); form2.hotkey1.hotkey:=inifile.readinteger ('form2','hotkey1hotkey',form2.hotkey1.hotkey); inifile.free; end; procedure tform2.writeparams; var inifile:tinifile; begin inifile := tinifile.create(changefileext(paramstr(0),'.ini')); inifile.writeinteger('form2','hotkey1hotkey',form2.hotkey1.hotkey); inifile.free; end; procedure tform2.formcreate(sender: tobject); begin readparams; form1.reghotkey(hotkey1.hotkey); end; procedure tform2.button1click(sender: tobject); var fullprogpath: pchar; begin writeparams; fullprogpath := pchar(application.exename); winexec(fullprogpath, sw_show); application.terminate; end; procedure tform2.button2click(sender: tobject); begin form2.close; end; end. Вот собственно и всё, что я хотел сказать. Исходники примера можно скачать здесь http://www.ssgroup.fatal.ru/clicks/clicks.php?uri=sources/hkg.zip (273 Кб.), а компоненту cooltrayicon - здесь http://www.ssgroup.fatal.ru/clicks/clicks.php?uri=components/cti.zip (377 Кб).