Hotkeys
In der Lektion über Tastatur-Nachrichten haben Sie unter anderem erfahren, dass
Eingaben über die Tastatur immer an das aktive Fenster gesendet werden. Dies stimmt
in der Regel. Jedoch bietet WINDOWS auch die Möglichkeit, sogenannte Hotkeys zu
definieren. Hotkeys sind systemglobale Tastenkombinationen die von einem Fenster
verarbeitet werden und dies unabhängig davon, ob es gerade aktiv ist oder nicht.
Um einen solchen Hotkey zu erstellen ist die API-Funktion RegisterHotKey(...).
aufzurufen. Die Funktion erhält als ersten Parameter das Fenster-Handle des Fensters,
das den Hotkey verarbeiten soll. Wenn hier der Wert NULL angegeben wird, so werden
die Hotkey-Nachrichten an den aufrufenden Thread gesendet. Danach folgt die ID für
den Hotkey. Diese ID muss innerhalb des Threads eindeutig sein. Über die ID lässt
sich im Nachrichtenbearbeiter der Hotkey-Nachricht (siehe weiter unten) der eingegebene
Hotkey identifizieren. Die ID sollte im Bereich 0x0000..0xBFFF liegen. Ausnahme:
der Hotkey soll innerhalb einer DLL verarbeitet werden. In diesem Fall ist der Identifier
über die API-Funktion GlobalAddAtom(...) zu bestimmen. Mehr dazu in der
Online-Hilfe zur Funktion. Im nächsten Parameter der Funktion können noch Zusatztasten,
die zusätzlich zur Hotkey-Taste gedrückt sein müssen, bestimmt werden, damit eine
Hotkey-Nachricht ausgelöst wird. Der letzte Parameter enthält die Angabe des virtuellen
Tastencode für die Hotkey-Taste.
Da der Hotkey systemglobal ist, sollte eine Anwendung einen belegten Hotkey am
Ende auch wieder freigeben. Dies erfolgt durch den Aufruf der API-Funktion UnregisterHotKey(...).
Nachdem ein Hotkey spezifiziert wurde erhält die Anwendung bei der Eingabe des
Hotkeys eine WM_HOTKEY Nachricht. Diese Nachricht wird immer am Anfang der Nachrichtenschlange
eingefügt, d.h. die nächste Nachricht, die die Anwendung nach dem Drücken des Hotkeys
erhält, ist immer die WM_HOTKEY Nachricht, egal wie viele weitere Nachrichten
inzwischen vorliegen. Und auch hier müssen Sie zum Bearbeiten der Nachrichten innerhalb
der MESSAGE_MAP das Makro ON_MESSAGE(...) verwenden da der Assistent diese
Nachrichten nicht kennt. Der Nachrichtenbearbeiter für die Hotkey-Nachricht erhält
im UINT-Parameter die ID des gedrückten Hotkeys und im High-Word des LONG-Parameters
den virtuellen Tastencode des Hotkeys. Das Low-Word enthält die gedrückten Zusatztasten
als MOD_xxx Konstanten.
Der nachfolgende Auszug aus dem Beispiel zu diesem Thema bringt das Fenster der
Anwendung beim Drücken der Tastenkombination STRG-ALT-M in den Vordergrund und aktiviert
es gleichzeitig:
// MainFrm.cpp : Implementierung
der Klasse CMainFrame
//
....
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()
....
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Speziellen Erstellungscode hier einfügen
// Hotkey fuer Fenster-Aktivierung
installieren
BOOL bRetCode = RegisterHotKey(GetSafeHwnd(),1,MOD_ALT|MOD_CONTROL,'M');
ASSERT(bRetCode);
return 0;
}
void CMainFrame::OnDestroy()
{
CFrameWnd::OnDestroy();
// TODO: Code für die Behandlungsroutine für Nachrichten hier
einfügen
BOOL bRetCode = UnregisterHotKey(GetSafeHwnd(),1);
ASSERT(bRetCode);
}
// Wird aufgerufen, wenn die Hotkey Taste
// (ALT-STRG-M) gedrueckt wird
LONG CMainFrame::OnHotKey(UINT, LONG)
{
// Falls Fensters zum Symbol
verkleinert,
// Fenster auf urspruengliche Groesse bringen
if (IsIconic())
ShowWindow(SW_RESTORE);
// Fenster nun in den Vordergrund
SetForegroundWindow();
return 0L;
} |
Das fertige Programm hierzu finden Sie unter 06Eingaben\HotKey.
Damit sind wir am Ende der Tipps&Tricks Reihe zum Thema Eingaben
angekommen und geht normal mit dem Kurs weiter.
|