![]() |
Hotkey speichern laden nutzen
Habe wahrscheinlich heute ein Brett vorm Kopf....
Ich habe eine App.exe mit separater setup.exe. Ich möchte Tastendrücke auch als Tastenkombinationen mit ALT, SHIFT etc.. vom Setup über eine ini zur App bringen. In der alten Fassung (nur einfache Tastendrücke) habe ich im Setup das Hotkey ausgewertet und als Integer gespeichert
Delphi-Quellcode:
In der App dann
...
Ini.WriteInteger('Shortcuts','Shortcut_3',HotKey3.HotKey); ...
Delphi-Quellcode:
sowie im FormKeyDown die Aktionen:
...
Shortcut_3 := Ini.Readinteger('Shortcuts','Shortcut_3',0); ...
Delphi-Quellcode:
Shortcut_FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
begin if Key = Shortcut_10 then begin // end; end; In der neuen Fassung bin ich wie folgt angefangen: In der Setup habe ich Hotkey-Komponenten , die ich mit shortcutToText in eine ini bringe. In der App lade ich die ini und will mit textToShortcut, die shortcuts wieder einbringen. Oder muss ich dort wieder Hotkeys erstellen, in die ich mit textToShortcut einbringe ? Es sollen keine globalen HotKeys erstellt werden, langt Programmbezogen aus. Wie kann ich am einfachsten die Tastenkombination wieder in meine Aktionen bringen ? gruß, bluescreen25 |
Re: Hotkey speichern laden nutzen
Damit wenigstens einer geantwortet hat, hier meine funktionierende Fassung: (relevante Teile)
(Die Tasten des Ziffernblocks gehen nicht, in ShortCutToText scheint ein Bug zu sein) Speichern von Hotkeys wie folgt:
Delphi-Quellcode:
Laden wie folgt:
procedure TForm1.SpeicherShortCuts;
begin Ini.WriteString('Shortcuts','Shortcut_1',ShortCutToText(HotKey1.HotKey)); Ini.WriteString('Shortcuts','Shortcut_2',ShortCutToText(HotKey2.HotKey)); Ini.WriteString('Shortcuts','Shortcut_3',ShortCutToText(HotKey3.HotKey)); end;
Delphi-Quellcode:
als Globale Shortcuts einrichten und nutzen:
uses
Shortcuts; var Shortcut_1,Shortcut_2,Shortcut_3: TShortCut; ... ... procedure TForm1.FormCreate(Sender: TObject); begin ... SetupHotkey(self); LadeShortCuts; ... end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ... ShortCut_Unregister; ... end; // Hotkey aus Shortcut übernehmen procedure TForm1.SetupHotkey(Sender: TObject); begin ShortCut_SetupHotkey(Sender); //Unit Shortcuts end; procedure TForm1.LadeShortCuts; begin Shortcut_1 := TextToShortCut(Ini.ReadString('Shortcuts','Shortcut_1','')); Shortcut_2 := TextToShortCut(Ini.ReadString('Shortcuts','Shortcut_2','')); Shortcut_3 := TextToShortCut(Ini.ReadString('Shortcuts','Shortcut_3','')); end; // Hotkey gedrückt procedure TForm1.WMHotkey( var msg: TWMHotkey ) ; begin ShortCut_WMHotkey(msg); //Unit Shortcuts end;
Delphi-Quellcode:
unit Shortcuts;
... ... procedure ShortCut_SetupHotkey(Sender: TObject); function SetHotkey(aHandle:THandle; HotkeyID:cardinal; Shortcut:TShortcut; AutoRegister:boolean=true):boolean; procedure ShortCut_WMHotkey( var msg: TWMHotkey) ; procedure ShortCut_Unregister; ... ... const Hotkey_ID1 = 1; Hotkey_ID2 = 2; Hotkey_ID3 = 3; ... ... procedure ShortCut_SetupHotkey(Sender: TObject); begin SetHotkey(Form1.Handle,1,ShortCut_1); SetHotkey(Form1.Handle,2,ShortCut_2); SetHotkey(Form1.Handle,3,ShortCut_3); end; // Hotkey registrieren function SetHotkey(aHandle:THandle; HotkeyID:cardinal; Shortcut:TShortcut; AutoRegister:boolean=true):boolean; var Key: Word; Shift:TShiftstate; Modifiers:integer; begin result:=false; if Shortcut = 0 then exit; Modifiers:=0; Unregisterhotkey(aHandle,HotkeyID); ShortCutToKey(ShortCut, Key, Shift); // unit Menus; if ssCtrl in Shift then Modifiers:=MOD_CONTROL; if ssAlt in Shift then Modifiers:=Modifiers or MOD_ALT; if ssShift in Shift then Modifiers:=Modifiers or MOD_SHIFT; if AutoRegister then result:=RegisterHotKey(aHandle, HotkeyID, Modifiers, Key) else result:=true; end; procedure ShortCut_WMHotkey( var msg: TWMHotkey ) ; begin if msg.HotKey = Hotkey_ID1 then begin //do something end; if msg.HotKey = Hotkey_ID2 then begin //do something end; if msg.HotKey = Hotkey_ID3 then begin //do something end; end; procedure ShortCut_Unregister; begin UnregisterHotkey(Form1.handle,Hotkey_ID1); UnregisterHotkey(Form1.handle,Hotkey_ID2); UnregisterHotkey(Form1.handle,Hotkey_ID3); end; Ich hoffe, ich habe nix vergessen. Gruß, bluescreen25 |
Re: Hotkey speichern laden nutzen
Es gibt aber ein Problem beim Laden:
Delphi-Quellcode:
Beim Speichern
procedure TForm1.LadeShortCuts;
begin Shortcut_1 := TextToShortCut(Ini.ReadString('Shortcuts','Shortcut_1','')); z.B. wenn die Sprache meines PC englisch ist, wie kann mein System diesen Text in ShortCut umwandern : Umsch+A oder Strg+A Das Sytem erkennt also CTRL+A und nicht STRG+A :gruebel: |
Re: Hotkey speichern laden nutzen
Wieso willst du unbedingt den Shortcut als Text abspeichern? Das mag ja zum manuellen editieren der Ini-Datei per Text-Editor einfacher sein, aber ich gehe mal davon aus, dass das eher die Ausnahme ist.
Ich speichere solche Shortcuts einfach mit WriteIntegr() weg und lese sie mit ReadInteger() wieder ein. Dann habe ich keinerlei Sprachabhängigkeiten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz