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.



Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470