Discussion:
Globale Hotkeys
(zu alt für eine Antwort)
Dietmar Braun
2014-11-21 23:59:17 UTC
Permalink
Hi,

ich habe eine StayOnTop-Anwendung, die nicht immer den Fokus hat.
Wie erreiche ich es, dass sie Hotkeys trotzdem "mitbekommt"? Also quasi
globale Hotkeys?

Laesst sich dies sogar so "verfeinern", dass diese Hotkeys nur von
meiner Anwendung verarbeitet werden, damit nicht in anderen laufenden
Applikationen evtl. unerwuenschte "Nebeneffekte" (z.B. durch Ausloesen
einer Funktion durch den Hotkey) auftreten?

Dank und Gruss,
Dietmar
Peter
2014-11-22 10:09:22 UTC
Permalink
Post by Dietmar Braun
Hi,
ich habe eine StayOnTop-Anwendung, die nicht immer den Fokus hat.
Wie erreiche ich es, dass sie Hotkeys trotzdem "mitbekommt"? Also
quasi globale Hotkeys?
Laesst sich dies sogar so "verfeinern", dass diese Hotkeys nur von
meiner Anwendung verarbeitet werden, damit nicht in anderen laufenden
Applikationen evtl. unerwuenschte "Nebeneffekte" (z.B. durch
Ausloesen einer Funktion durch den Hotkey) auftreten?
Dank und Gruss,
Dietmar
Eine Windows-Anwendung kann die API-Funktion RegisterHotkey verwenden,
um eine Tastenkombination für sich zu registrieren. Man gibt bei der
Registrierung ein Fenster-Handle an (z. B. die Handle-Eigenschaft des
Mainforms) und dieses Fenster bekommt dann ein WM_HOTKEY-Meldung, wenn
der Benutzer die Tastenkombination drückt.

Geh mal nach http://www.codenewsfast.com und suche nach RegisterHotkey,
da sollte sich einiges an Beispielen finden lassen.

Siehe auch
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.
85%29.aspx für die offizielle Dokumentation.

Die Funktion schlägt fehl, wenn die Tastenkombination schon von einer
anderen Anwendung registriert worden ist. Da das OS die Registrierung
nicht automatisch löscht, wenn die registrierende Anwendung beendet
wird, ist es essentiell, UnregisterHotkey aufzurufen, um die
Registrierung (wenn sie denn erfolgreich war) wieder zurückzunehmen. Da
sich das Handle eines Delphi-Forms während der Lebenszeit des Forms
ändern kann ist es ratsam, die CreateWnd und DestroyWnd-Methoden zu
überschreiben. In CreateWnd ruft man RegisterHotkey *nach* inherited
auf, in DestroyWnd UnregisterHotkey *bevor* inherited.

Soweit ich weis bekommt eine Anwendung den registrierten Hotkey bevor
die aktuelle Vordergrundanwendung ihn überhaupt sieht, man kann damit
also wirklich Funktionalität in der aktiven Anwendung blockieren.

Es gibt noch einen zweiten Mechanismus für Hotkeys: die WM_SETHOTKEY
Message. Siehe
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646284%28v=vs.85%29.aspx
Falls deine Anwendung in den Vordergrund kommen soll, wenn der Benutzer
die registrierte Tastenkombination drückt, ist das eventuell die
bessere Wahl, da sich eine Anwendung schon seit einigen
Windows-Versionen nicht mehr so einfach selbst in den Vordergrund
drängeln kann...
--
Peter Below
Marc Santhoff
2014-11-22 13:19:42 UTC
Permalink
Post by Peter
Post by Dietmar Braun
ich habe eine StayOnTop-Anwendung, die nicht immer den Fokus hat.
Wie erreiche ich es, dass sie Hotkeys trotzdem "mitbekommt"? Also
quasi globale Hotkeys?
Laesst sich dies sogar so "verfeinern", dass diese Hotkeys nur von
meiner Anwendung verarbeitet werden, damit nicht in anderen
laufenden Applikationen evtl. unerwuenschte "Nebeneffekte" (z.B.
durch Ausloesen einer Funktion durch den Hotkey) auftreten?
Eine Windows-Anwendung kann die API-Funktion RegisterHotkey verwenden,
um eine Tastenkombination für sich zu registrieren. Man gibt bei der
Registrierung ein Fenster-Handle an (z. B. die Handle-Eigenschaft des
Mainforms) und dieses Fenster bekommt dann ein WM_HOTKEY-Meldung, wenn
der Benutzer die Tastenkombination drückt.
Siehe auch
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.
85%29.aspx für die offizielle Dokumentation.
Es gibt noch einen zweiten Mechanismus für Hotkeys: die WM_SETHOTKEY
Message. Siehe
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646284%28v=vs.85%29.aspx
Falls deine Anwendung in den Vordergrund kommen soll, wenn der
Benutzer die registrierte Tastenkombination drückt, ist das eventuell
die bessere Wahl, da sich eine Anwendung schon seit einigen
Windows-Versionen nicht mehr so einfach selbst in den Vordergrund
drängeln kann...
Und für den Fall, daß man noch mehr Schweinereien anstellen muß/möchte,
gibt es noch "SetWindowsHookEx(WH_KEYBOARD, ...".

Fragen dazu, da ich sehr lange nicht unter Windows programmiert habe:

1.
Braucht man Admin-Rechte, um die drei Möglichkeiten zu benutzen?
Insbesondere die von mir vorgeschlagene API-Fkt ist ja nun _die_
Keylogger-Bastelhilfe.

2. Vielleicht weiß das jemand:
Gibt es bei Microsoft irgendwo eine abgrenzende Auflistung, welche API
zu welchem System gehört? Und welche man besser wegen altersschwäche
meiden sollte?
Also WIn32-API ist das ja eigentlich noch, und meine letzen Exkursionen
auf dieses OS sind aber entstanden, als es noch Win98 und 2000 am
häufigsten gab. Deswegen möchte ich wissen, was mit XP, 7 und 8 anders
geworden ist.

Marc
Peter Below (TeamB)
2014-11-23 11:01:57 UTC
Permalink
Post by Marc Santhoff
Und für den Fall, daß man noch mehr Schweinereien anstellen
muß/möchte, gibt es noch "SetWindowsHookEx(WH_KEYBOARD, ...".
1.
Braucht man Admin-Rechte, um die drei Möglichkeiten zu benutzen?
Insbesondere die von mir vorgeschlagene API-Fkt ist ja nun die
Keylogger-Bastelhilfe.
Nein, im Prinzip nicht. Allerdings erfordern *globale* hooks ja eine
DLL, die in die laufenden Prozesse gemapped wird, wenn der Event, den
man abfangen will, zum ersten mal für diesen Prozess auftritt, und da
gibt es durchaus Limitierungen. Die haben aber mehr mit 32 vs 64 bit
Prozessen zu tun.
Post by Marc Santhoff
Gibt es bei Microsoft irgendwo eine abgrenzende Auflistung, welche API
zu welchem System gehört? Und welche man besser wegen altersschwäche
meiden sollte?
Naja, die jeweils aktuelle Dokumentation findet man normalerweise unter
http://msdn.microsoft.com/en-US/windows/desktop als Startseite. Die
Seiten für die einzelnen Funktionen haben normalerweise eine Hinweis
darauf, ab welcher Windows-Version die Funktion verfügbar ist und auch
Verweise auf alternative Methoden, die bei der aktuellen Version
eventuell vorzuziehen sind.
Post by Marc Santhoff
Also WIn32-API ist das ja eigentlich noch, und meine letzen
Exkursionen auf dieses OS sind aber entstanden, als es noch Win98 und
2000 am häufigsten gab. Deswegen möchte ich wissen, was mit XP, 7 und
8 anders geworden ist.
eine ganze Menge, aber die alten APIs funktionieren eigentlich alle
noch. Es gibt halt nur mehr Ergänzungen, besonders auf der User
Interface Seite (DPI-Awareness, neue Desktop-Features, User access
control, Direct2D als Alternative zu GDI etc. etc.)
--
Peter Below (TeamB)
Marc Santhoff
2014-11-23 12:39:13 UTC
Permalink
Post by Peter Below (TeamB)
Post by Marc Santhoff
Und für den Fall, daß man noch mehr Schweinereien anstellen
muß/möchte, gibt es noch "SetWindowsHookEx(WH_KEYBOARD, ...".
1.
Braucht man Admin-Rechte, um die drei Möglichkeiten zu benutzen?
Insbesondere die von mir vorgeschlagene API-Fkt ist ja nun die
Keylogger-Bastelhilfe.
Nein, im Prinzip nicht. Allerdings erfordern *globale* hooks ja eine
DLL, die in die laufenden Prozesse gemapped wird, wenn der Event, den
man abfangen will, zum ersten mal für diesen Prozess auftritt, und da
gibt es durchaus Limitierungen. Die haben aber mehr mit 32 vs 64 bit
Prozessen zu tun.
In der 32-Bit-Welt war das kein Problem, ein Tastatur-Beeper für
Sehbehinderte, den ich vor langer Zeit damit gebaut habe, funktionierte
(bis auf die Tonerzeugungsfunktion) unter Win98 ebenso wie unter 2000.
Wie man Programme für beide Fälle fit macht, weiß ich nicht, vielleicht
beide Versionen in einem Installer verpacken und nur die richtige
installieren. Oder dem Nutzer bzw. der Updatefunktion die Entscheidung
überlassen.

Natürlich braucht man erstmal für die Installation die passenden Rechte.

Wenn ich Langeweile habe, werfe ich das alte Programm mal einem
Viren- und Malware-Scanner, da sollten alle Lampen angehen. ;)
Post by Peter Below (TeamB)
Post by Marc Santhoff
Gibt es bei Microsoft irgendwo eine abgrenzende Auflistung, welche
API zu welchem System gehört? Und welche man besser wegen
altersschwäche meiden sollte?
Naja, die jeweils aktuelle Dokumentation findet man normalerweise
unter http://msdn.microsoft.com/en-US/windows/desktop als Startseite.
Die Seiten für die einzelnen Funktionen haben normalerweise eine
Hinweis darauf, ab welcher Windows-Version die Funktion verfügbar ist
und auch Verweise auf alternative Methoden, die bei der aktuellen
Version eventuell vorzuziehen sind.
OK, hatte ich bei SetWindowsHookEx() und RegisterHotkey() nicht
gesehen, dann sind das also zumindest keine veralteten APIs.
Post by Peter Below (TeamB)
Post by Marc Santhoff
Also WIn32-API ist das ja eigentlich noch, und meine letzen
Exkursionen auf dieses OS sind aber entstanden, als es noch Win98
und 2000 am häufigsten gab. Deswegen möchte ich wissen, was mit XP,
7 und 8 anders geworden ist.
eine ganze Menge, aber die alten APIs funktionieren eigentlich alle
noch. Es gibt halt nur mehr Ergänzungen, besonders auf der User
Interface Seite (DPI-Awareness, neue Desktop-Features, User access
control, Direct2D als Alternative zu GDI etc. etc.)
Irgendwann während oder nach XP hatte Microsoft zum großen Rundschlag
ausgeholt, ein Akronym war WPF, Windows Presentation Foundation iirc,
und andere mehr, aber ob sich das etabliert hat ... gab ja schon öfter
den Fall, daß die Programmschaffenden neue Technik einfach nicht
angenommen haben.

Aber mit dem Einzug des Touch Screen und Mobiltechnik dürfte sich doch
einiges getan haben.

Marc

Loading...