共用方式為


RegisterHotKey 函式 (winuser.h)

定義全系統熱鍵。

語法

BOOL RegisterHotKey(
  [in, optional] HWND hWnd,
  [in]           int  id,
  [in]           UINT fsModifiers,
  [in]           UINT vk
);

參數

[in, optional] hWnd

類型:HWND

視窗的句柄,將接收由作用鍵產生的 WM_HOTKEY 訊息。 如果此參數 NULLWM_HOTKEY 訊息會張貼至呼叫線程的訊息佇列,而且必須在訊息循環中處理。

[in] id

類型:int

作用中索引鍵的標識碼。 如果 hWnd 參數為 NULL,則作用中索引鍵會與目前的線程相關聯,而不是與特定視窗相關聯。 如果熱鍵已存在具有相同 hWnd標識元 參數,請參閱以取得動作。

[in] fsModifiers

類型:UINT

必須與 vk 參數所指定的按鍵組合按下的按鍵,才能產生 WM_HOTKEY 訊息。 fsModifiers 參數可以是下列值的組合。

意義
MOD_ALT
0x0001
必須按住任一 ALT 鍵。
MOD_CONTROL
0x0002
必須按住 CTRL 鍵。
MOD_NOREPEAT
0x4000
變更快速鍵行為,讓鍵盤自動重複不會產生多個快捷鍵通知。
Windows Vista: 不支援此旗標。
MOD_SHIFT
0x0004
必須按住任一 SHIFT 鍵。
MOD_WIN
0x0008
必須按住任一個 WINDOWS 金鑰。 這些索引鍵會加上 Windows 標誌的標籤。 牽涉到 WINDOWS 鍵的鍵盤快捷方式會保留供作業系統使用。

[in] vk

類型:UINT

作用中金鑰的虛擬金鑰程式代碼。 請參閱 虛擬金鑰碼

傳回值

類型:BOOL

如果函式成功,則傳回值為非零值。

如果函式失敗,傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

如果您嘗試將熱鍵與另一個線程所建立的視窗產生關聯,此函式會失敗。

一般而言,如果針對熱鍵指定的擊鍵已經登錄另一個熱鍵,RegisterHotKey 也會失敗。 不過,當其中一個應用程式的視窗位於前景時,OS 註冊的一些預先存在的預設快捷鍵(例如啟動 Snipping 工具的 PrintScreen)可能會覆寫另一個熱鍵註冊。

言論

按下按鍵時,系統會尋找所有熱鍵的相符專案。 尋找相符專案時,系統會將 WM_HOTKEY 訊息張貼至與作用中索引鍵相關聯之視窗的訊息佇列。 如果熱鍵與視窗沒有關聯,則會將 WM_HOTKEY 訊息張貼至與作用中索引鍵相關聯的線程。

如果作用中索引鍵已存在相同的 hWnd,且 標識碼 參數,則會與新的熱鍵一起維護。 應用程式必須明確地呼叫 unregisterHotKey ,才能取消註冊舊的熱鍵。

F12 金鑰會保留供調試程式隨時使用,因此不應將其註冊為經常性密鑰。 即使您未偵錯應用程式,如果內核模式調試程式或 Just-In-Time 調試程式是常駐的,則會保留 F12。

應用程式必須在範圍中指定標識碼值,0x0000到0xBFFF。 共用 DLL 必須透過 0xFFFF 指定範圍中的值0xC000 (GlobalAddAtom 函式所傳回的範圍)。 為了避免與其他共用 DLL 所定義的熱鍵標識符發生衝突,DLL 應該使用 GlobalAddAtom 函式來取得經常性密鑰標識碼。

**Windows Server 2003:**如果熱鍵已存在相同的 hWnd,且 標識符 參數,則會由新的熱鍵取代。

例子

下列範例示範如何使用 RegisterHotKey 函式搭配 MOD_NOREPEAT 旗標。

在此範例中,主線程會註冊快捷鍵 『ALT+b』。 按下快捷鍵時,線程會收到 WM_HOTKEY 訊息,這會在 getMessage 呼叫 中取得。 由於此範例使用 MOD_ALT 搭配 fsModifiersMOD_NOREPEAT 值,因此線程只會在 'b' 鍵放開時收到另一則 WM_HOTKEY 訊息,然後在按下 'ALT' 鍵時再次按下。

#include "stdafx.h"

int _cdecl _tmain (
    int argc, 
    TCHAR *argv[])
{           
    if (RegisterHotKey(
        NULL,
        1,
        MOD_ALT | MOD_NOREPEAT,
        0x42))  //0x42 is 'b'
    {
        _tprintf(_T("Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag\n"));
    }
 
    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0) != 0)
    {
        if (msg.message == WM_HOTKEY)
        {
            _tprintf(_T("WM_HOTKEY received\n"));            
        }
    } 
 
    return 0;
}

要求

要求 價值
最低支援的用戶端 Windows Vista [僅限傳統型應用程式]
支援的最低伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平臺 窗戶
標頭 winuser.h (包括 Windows.h)
連結庫 User32.lib
DLL User32.dll

另請參閱

GlobalAddAtom

鍵盤輸入

為目前應用程式註冊熱鍵 (CSRegisterHotkey)

為目前應用程式註冊熱鍵 (CppRegisterHotkey)

UnregisterHotKey

WM_HOTKEY