2009-04-13 22 views
1

Ich habe versucht, 3 Hotkeys zu registrieren. Ich folgte this Beispiel (oder this).Mehrere globale Hotkeys können nicht registriert werden

Der Code funktioniert, wenn ich einen einzigen Hotkey registriere. Allerdings, wenn ich versuche, 3 Hotkeys zu registrieren, nur die letzte registrierte man arbeitet:

procedure TFrmSettings.FormCreate; 
begin 
atomN:= GlobalAddAtom(pchar('atomN'));  
atomT:= GlobalAddAtom(pchar('atomT')); 
atomH:= GlobalAddAtom(pchar('atomH')); 
end; 


procedure TFrmSettings.test1; 
begin 
RegisterHotShortCut(Handle, atomN, hotN.HotKey);  // first registered 
RegisterHotShortCut(Handle, atomH, hotH.HotKey);  // second registered 
RegisterHotShortCut(Handle, atomT, hotT.HotKey);  // third - only this works 
end; 

RegisterHotShortCut wird auf der Webseite erklärt oben erwähnt.

Wenn ich im obigen Code die letzte Zeile kommentiere, dann funktioniert der vorherige Hotkey (hotH). Das heißt, ich habe alles richtig erklärt, aber der letzte Hotkey übernimmt die Kontrolle über die anderen.

Oder anders gesagt, durch Drücken der Tastenkombination für die ersten registrierten Tastenkombinationen wird das Programm nicht in die TFrmSettings.HotyKeyMsg(VAR msg: TMessage) Prozedur eingetragen.

Irgendwelche Hinweise? Danke.


Edit1:

  1. Es gibt einfache Schnipsel, die für andere scheint zu funktionieren, aber ich brauche wirklich der Benutzer zu lassen, um die Verknüpfung zu ändern, damit ich die ShortCutToKey Verfahren benötigen.

  2. Ich sollte ein Atom für jede globale Verknüpfung deklarieren. Recht?


Edit2: GELÖST Der obige Code nicht nur, wenn ich die "GlobalAddAtom" Funktion verwenden. Wenn ich anstelle von Atomen nur die Zahlen 1, 2 und 3 verwende, funktioniert der Code. Wenn ich 4,5,6 verwende, schlägt der Code erneut fehl. Problem (halb) gelöst.

Antwort

0

Gelöst Der obige Code scheitert NUR, wenn ich die "GlobalAddAtom" -Funktion verwende. Wenn ich anstelle von Atomen nur die Zahlen 1, 2 und 3 verwende, funktioniert der Code. Wenn ich 4,5,6 verwende, schlägt der Code erneut fehl. Problem (halb) gelöst.

0

Auf der Suche nach RegisterHotShortCut auf Google gibt nur 5 Treffer zurück, und für mich bedeutet das, dass diese Funktion nicht die richtige Antwort ist. Die Suche nach "Delphi Register Hotkey" ergibt 235000 Treffer und der Artikel How to register a global hotkey (von 2007, unter Verwendung von RegisterHotKey) scheint dem Artikel ähnlich zu sein, den Sie angeschaut haben (ab 2003).

+0

Hallo. RegisterHotShortCut ist auf der oben genannten Webseite deklariert. – Ampere

+0

Hoppla, ja du hast Recht, ich sehe, dass du es jetzt in die Frage aufgenommen hast. Ich fürchte, ich kann nicht weiter helfen. – hlovdal

+0

Danke für die Hilfe trotzdem. – Ampere

0

Ja, Sie brauchen ein Atom für jede Abkürzung. Ich bin neugierig auf den Anruf, den Sie an UnregisterHotKey für jeden machen, bevor Sie ihn registrieren. Wenn Sie diesen Hotkey zuvor nicht registriert haben, brauchen Sie ihn nicht. Versuchen Sie, diese Zeile zu entfernen und zu sehen, ob das Problem behoben ist. Es klingt, als ob der UnregisterHotKey den vorherigen Hotkey entfernt, obwohl er ein anderes Atom hat. .

+0

Hallo Jim. Das habe ich schon gemacht. Das gleiche Ergebnis :( – Ampere

1

i'v wie dies für meine mehrere Hotkeys Code wurde, weiß ich nicht, ob dies ist, was Sie zu tun versuchen: erste

procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; 

dann in setzen diese in Form erklären.erstellen oder elsewehere

RegisterHotKey(Handle, 1, MOD_SHIFT, VK_F9); 
    RegisterHotKey(Handle, 2, MOD_WIN, VK_F8); 
    RegisterHotKey(Handle, 3, MOD_ALT, VK_F7); 

und der Hotkey Griff Prozedur

procedure TForm1.WMHOTKEY(var Msg: TWMHOTKEY); 
begin 
    case Msg.HotKey of 
    1 : ShowMEssage('this is 1 (shift+F9)'); 
    2 : ShowMessage('this is 2 (Win+F8)'); 
    3 : ShowMessage('this is 3 (ALT+F7)'); 
    end; 
end; 

vergessen Sie nicht, es zu deregistrieren, wenn ur App zu schließen. auf winxp + sp3 getestet, delphi 2006

+0

Hallo. Ihr Beitrag hat mir geholfen, herauszufinden, dass der Code nur funktioniert, wenn Sie Zahlen 12,3 anstelle von Atomen verwenden. – Ampere

+0

ja, weil es die Nachricht ist, die Sie mit WMHOTKEY-Prozedur erhalten, muss es Zahlen sein Denken Sie daran, und um Konflikte mit anderen Anwendungen zu vermeiden, sollten Sie höhere Zufallszahlen verwenden. 1,2,3 war nur ein Beispiel;) – avar

0

plz diesen Code überprüfen, verwendet es Atome und arbeitet Geldbußen (i geprüft) http://www.swissdelphicenter.ch/torry/showcode.php?id=147

edit1: bitte beachten Sie, dass ein Grund für das Scheitern Registrierung ist Wenn die Tastenkombination, die Sie registrieren möchten, bereits vom System oder einer anderen Anwendung registriert wurde. (siehe obigen Link)

Verwandte Themen