Лю-ю-ю-ю-ю-ди!!! Помоги-и-и-и-и-те!!! Замаялся код дрючить Мож кто подкинет бедному прогеру советик Ниже привожу код регистрации горячей клавиши, которую юзер назначет сам через компоненту HotKey вкладки Win32 в Delphi 6. Подскажите, что надо сделать для регистрации нескольких горячих клавиш, которые будут вводится, соответственно с нескольких HotKey'ев.
private HotKeyContacts:TShortCut; procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; { Private declarations } public function RegHotKey(HotKey:TShortCut):boolean; { Public declarations } end;
var fhot: Tfhot;
implementation
uses MSG_Unit;
{$R *.dfm}
{ Tfhot }
function Tfhot.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 Tfhot.WMHotKey(var Msg: TWMHotKey); begin if Msg.HotKey=0 then fmsg.Show;..Открываем форму №2 end;
procedure Tfhot.ReadParams; Var IniFile:TIniFile; begin IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini'));// создаём .ini в корне каталога с программой fhot.hk1.HotKey:=IniFile.ReadInteger('Приложение','Горячая клавиша №1',fhot.hk1.HotKey); fhot.hk2.HotKey:=IniFile.ReadInteger('Приложение','Горячая клавиша №2',fhot.hk2.HotKey);; IniFile.Free; end;
procedure Tfhot.WriteParams; Var IniFile:TIniFile; begin IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini')); IniFile.WriteInteger('Приложение','Горячая клавиша №1',fhot.hk1.HotKey); IniFile.WriteInteger('Приложение','Горячая клавиша №2',fhot.hk2.HotKey); IniFile.Free; end;
procedure Tfhot.FormCreate(Sender: TObject); begin ReadParams; HotKeyContacts:=0; RegHotKey(hk1.HotKey); end;
procedure Tfhot.BitBtn1Click(Sender: TObject); begin WriteParams; end;
procedure Tfhot.FormDestroy(Sender: TObject); begin UnRegisterHotKey(Handle,0); end;
end.
Буду рад любому дельному совету С уважением, Serik.
SuperAdm, 5.09.2005 - 1:41
Правда здесь есть лишнее, но думаю разберешься... регистрируются два нажатия CTRL+F11, CTRL+F12
Проблема решается легко. Проверь вышеуказанный вариант, неполучится - приведу свой
Serik, 6.09.2005 - 23:12
Слушай, а нельзя ли не регистрировать фиксированные горячие клавиши, которые задаются в процессе разработки, а регистрировать имеено с компоненты HotKey, которую обрабатывает юзверь?
private procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; { Private declarations } public function RegHotKey0(HotKey0:TShortCut):boolean; function RegHotKey1(HotKey1:TShortCut):boolean; { Public declarations } end;
var fhot: Tfhot;
implementation
uses MSG_Unit;
{$R *.dfm}
{ Tfhot }
function Tfhot.RegHotKey0(HotKey0:TShortCut):boolean; var TheKey:Word; TheShiftState:TShiftState; Modifiers:Cardinal; begin UnRegisterHotKey(Handle,0); HotKeyContacts:=HotKey0; 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;
function Tfhot.RegHotKey1(HotKey1:TShortCut):boolean; var TheKey:Word; TheShiftState:TShiftState; Modifiers:Cardinal; begin UnRegisterHotKey(Handle,1); HotKeyContacts:=HotKey1; ShortCutToKey(HotKeyContacts, TheKey, TheShiftState); Modifiers:=1; 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,1,Modifiers,TheKey); end;
procedure Tfhot.WMHotKey(var Msg: TWMHotKey); begin if Msg.HotKey=0 then ShowMessage ('Test_0'); if Msg.HotKey=1 then ShowMessage ('Test_1'); end;
procedure Tfhot.ReadParams; Var IniFile:TIniFile; begin IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini'));// создаём .ini в корне каталога с программой fhot.hk1.HotKey:=IniFile.ReadInteger('Приложение','Горячая клавиша №1',fhot.hk1.HotKey); fhot.hk2.HotKey:=IniFile.ReadInteger('Приложение','Горячая клавиша №2',fhot.hk2.HotKey);; IniFile.Free; end;
procedure Tfhot.WriteParams; Var IniFile:TIniFile; begin IniFile := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini')); IniFile.WriteInteger('Приложение','Горячая клавиша №1',fhot.hk1.HotKey); IniFile.WriteInteger('Приложение','Горячая клавиша №2',fhot.hk2.HotKey); IniFile.Free; end;
procedure Tfhot.FormCreate(Sender: TObject); begin ReadParams; //----- RegHotKey(hk1.HotKey0); RegHotKey(hk2.HotKey1); end;
procedure Tfhot.BitBtn1Click(Sender: TObject); begin WriteParams; end;
procedure Tfhot.FormDestroy(Sender: TObject); begin UnRegisterHotKey(Handle,0); UnRegisterHotKey(Handle,1); end;
end.
ZaHack, 22.03.2006 - 19:27
Ну вот полезная инфа появилась в "Программировании". Почитаю, разберусь на досуге... . Хотя через инишку довольно оригинальное решение. Я бы делал через реестр...Инерция мышления, блин...
Serik, 23.03.2006 - 10:17
Работа с INI чисто с эстетических соображений, шоб реестр не мусорить