日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

快捷键(加速键),系统热键,键盘钩子的不同

發布時間:2024/1/4 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 快捷键(加速键),系统热键,键盘钩子的不同 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

昨天剛剛了解到系統熱鍵的API: RegisterHotKey(),當時很感慨,因為這些年來,經常用到的是【快捷鍵】或用【鍵盤鉤子】實現的全局快鍵鍵,因為我不知道有現成的系統熱鍵的API可用,有點丟人了。

現在想想,系統的快捷鍵,系統熱鍵,鍵盤鉤子他們各有各的特點,簡單做個總結:

1. 快捷鍵(Accelerator:加速鍵),特點是:窗口必須在獲得焦點(激活的狀態)下,才能響應快捷鍵。

我一般都是在 res.rc 中添加:

//
// Accelerator resources  加速鍵
// 詳細介紹: https://docs.microsoft.com/en-us/windows/win32/menurc/accelerators-resource
//
LANGUAGE 0, SUBLANG_NEUTRAL
IDR_ACCELERATOR1 ACCELERATORS
{
    /*
    //快捷鍵的映射關系
    "^C",  ID_ACCELERATOR_DELETE                          // control C
    "K",   ID_ACCELERATOR_DELETE                          // shift K
    "k",   ID_ACCELERATOR_DELETE, ALT                     // alt k
    98,    ID_ACCELERATOR_DELETE, ASCII                   // b
    66,    ID_ACCELERATOR_DELETE, ASCII                   // B (shift b)
    "g",   ID_ACCELERATOR_DELETE                          // g
    "G",   ID_ACCELERATOR_DELETE                          // G (shift G)
    VK_F1, ID_ACCELERATOR_DELETE, VIRTKEY                 // F1
    VK_F1, ID_ACCELERATOR_DELETE, CONTROL, VIRTKEY        // control F1
    VK_F1, ID_ACCELERATOR_DELETE, SHIFT, VIRTKEY          // shift F1
    VK_F1, ID_ACCELERATOR_DELETE, ALT, VIRTKEY            // alt F1
    VK_F2, ID_ACCELERATOR_DELETE, ALT, SHIFT, VIRTKEY     // alt shift F2
    VK_F2, ID_ACCELERATOR_DELETE, CONTROL, SHIFT, VIRTKEY // ctrl shift F2
    VK_F2, ID_ACCELERATOR_DELETE, ALT, CONTROL, VIRTKEY   // alt control F2
    */

    //"H",        ID_ACCELERATOR_SCREENSHOT_STATIC, ALT, CONTROL, VIRTKEY  // ctrl + alt + h, 注意, 前面必須使用大寫的 "H"
    VK_DELETE, ID_ACCELERATOR_DELETE, VIRTKEY
}

然后在主程序中 main() 中添加:

HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1)); // 加載加速鍵表
    //printf("hAccelTable:%ld
", hAccelTable);


    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        //參考 - http://dec3.jlu.edu.cn/webcourse/T000024/files/bjjx/bjjx3.htm 和 http://itzone.hk/article/article.php?aid=200406211205229426
        //TranslateAccelerator()函數確定存放在msg消息結構中的消息是不是鍵盤消息。
        //如果是,該函數將查找句柄為hAccel的加速鍵表。如果找到了一個匹配,則調用句桶為hwnd的窗口的窗口過程。
        //如果加速鍵ID與系統菜單的菜單項一致,則消息就是WM_SYSCOMMAND;否則,消息為WM_COMMAND。

        if(!TranslateAccelerator(hwnd, hAccelTable, &messages)) //啟用加速鍵
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);

            /* Send message to WindowProcedure */
            DispatchMessage(&messages);

        }
        else
        {
            //printf("按下了加速鍵...
");
        }
    }

2. 系統熱鍵,特點:窗口不激活也能接收到鍵盤消息。使用RegisterHotKey() 注冊,操作上很簡單,但由于是全局性的,容易和別的軟件發生熱鍵沖突,導致熱鍵注冊失敗。

3. 鍵盤鉤子,特點:窗口不激活也能接收到鍵盤消息。使用上有點麻煩,但是這玩意一般情況下不會因與別軟件沖突,而無法接收鍵盤消息。當然如果別的軟件也有鍵盤鉤子,同時禁止了鍵盤消息向下傳遞,會不會也無法接收鍵盤消息,我沒測試)

//全局鍵盤鉤子
//參考 - http://blog.csdn.net/one_six_mix/article/details/52044406
hook_keyboard = SetWindowsHookExA(WH_KEYBOARD_LL, keyboardHook, GetModuleHandleA(0), 0); //GetModuleHandleA(0)或 NULL, 都行
//鉤子回調 - 全局鍵盤鉤子
LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode == HC_ACTION) //當 nCode等于HC_ACTION時,要求得到處理
    {
        //參考 - http://bbs.csdn.net/topics/320236776
        //參考 - http://www.51hei.com/bbs/dpj-30393-1.html

        //BOOL bControlKeyDown = GetAsyncKeyState(VK_CONTROL) >> ((sizeof(SHORT) * 8 ) - 1);// 檢查是否Ctrl鍵被按下

        KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;

        //printf("是否Ctrl鍵被按下:%d
", bControlKeyDown);
        //printf("ks->vkCode:%c
", ks->vkCode);

        if(ks->vkCode == VK_ESCAPE)
        {
            //printf("esc
");

            if(currentMouseLocationTarget == TARGET_NULL)
            {

            }
            else
            {
                ...               

               

                if(hook_keyboard)
                {
                    UnhookWindowsHookEx(hook_keyboard); //解鎖
                    hook_keyboard = NULL;
                }

                return 1; //屏蔽掉, 不再向下傳遞
            }
        }
    }

    return CallNextHookEx(hook_keyboard, nCode, wParam, lParam); //返回給下一個鉤子子程處理 (==不屏蔽)
}

總結

以上是生活随笔為你收集整理的快捷键(加速键),系统热键,键盘钩子的不同的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。