Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hotkey speichern laden nutzen (https://www.delphipraxis.net/102173-hotkey-speichern-laden-nutzen.html)

bluescreen25 24. Okt 2007 15:40


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:
...
Ini.WriteInteger('Shortcuts','Shortcut_3',HotKey3.HotKey);
...
In der App dann
Delphi-Quellcode:
...
Shortcut_3 := Ini.Readinteger('Shortcuts','Shortcut_3',0);
...
sowie im FormKeyDown die Aktionen:

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

bluescreen25 16. Feb 2008 21:10

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:
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;
Laden wie folgt:

Delphi-Quellcode:
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;
als Globale Shortcuts einrichten und nutzen:

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

thomas2009 1. Mär 2009 16:38

Re: Hotkey speichern laden nutzen
 
Es gibt aber ein Problem beim Laden:
Delphi-Quellcode:
procedure TForm1.LadeShortCuts;
begin
  Shortcut_1 := TextToShortCut(Ini.ReadString('Shortcuts','Shortcut_1',''));
Beim Speichern

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:

Phoner 1. Mär 2009 17:33

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 03:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz