国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用Windows API實現(xiàn)鍵盤鼠標監(jiān)控鉤子

這篇具有很好參考價值的文章主要介紹了使用Windows API實現(xiàn)鍵盤鼠標監(jiān)控鉤子。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用鍵盤鼠標監(jiān)控鉤子

本節(jié)將介紹如何使用Windows API中的SetWindowsHookExRegisterHotKey函數(shù)來實現(xiàn)鍵盤鼠標的監(jiān)控。這些函數(shù)可以用來設置全局鉤子,通過對特定熱鍵掛鉤實現(xiàn)監(jiān)控的效果,兩者的區(qū)別在于SetWindowsHookEx函數(shù)可以對所有線程進行監(jiān)控,包括其他進程中的線程,而RegisterHotKey函數(shù)只能對當前線程進行監(jiān)控。

首先我們來實現(xiàn)注冊熱鍵功能,注冊熱鍵可以使用RegisterHotKey()函數(shù),該函數(shù)可以將一個熱鍵與當前應用程序或線程綁定,使得當用戶按下熱鍵時,系統(tǒng)會自動將該熱鍵的消息發(fā)送到該應用程序或線程中,該函數(shù)原型如下;

BOOL RegisterHotKey(
  HWND hWnd,
  int id,
  UINT fsModifiers,
  UINT vk);

其中,參數(shù)的含義如下:

  • hWnd:熱鍵所屬的窗口句柄,通常設置為NULL,表示與當前線程綁定

  • id:熱鍵的ID號,用于區(qū)分不同的熱鍵

  • fsModifiers:熱鍵的修飾鍵,可以使用組合鍵,例如CtrlAlt、Shift

  • vk:熱鍵的虛擬鍵碼,例如VK_F1表示F1VK_LEFT表示左箭頭鍵等

函數(shù)需要傳入一個窗口句柄、熱鍵ID、熱鍵組合鍵等參數(shù)來設置熱鍵。當熱鍵被按下時,系統(tǒng)會自動將一個WM_HOTKEY消息發(fā)送給注冊了該熱鍵的窗口,口,應用程序需要重載該窗口的消息處理函數(shù)來響應該事件,從而實現(xiàn)相應的響應操作。該函數(shù)會返回一個BOOL類型的值,表示熱鍵設置是否成功。

當熱鍵被注冊后則就需要接收熱鍵消息,通??梢允褂?code>GetMessage函數(shù),該函數(shù)用于從消息隊列中獲取一個消息并將其存儲在一個結(jié)構(gòu)體中,通常用于在一個循環(huán)中不斷地獲取消息,從而實現(xiàn)對Windows消息的處理。

該函數(shù)的原型定義如下所示;

BOOL GetMessage(
  LPMSG lpMsg,
  HWND hWnd,
  UINT wMsgFilterMin,
  UINT wMsgFilterMax);

其中,參數(shù)的含義如下:

  • lpMsg:指向MSG結(jié)構(gòu)體的指針,用于存儲獲取到的消息

  • hWnd:消息接收者的窗口句柄,通常設置為NULL,表示接收所有窗口的消息

  • wMsgFilterMin:指定獲取消息的最小消息值,通常設置為0

  • wMsgFilterMax:指定獲取消息的最大消息值,通常設置為0

GetMessage函數(shù)需要傳入一個指向MSG結(jié)構(gòu)體的指針,該結(jié)構(gòu)體包含了消息的各種信息,例如消息的類型、發(fā)送者、接收者、時間戳等等。讀者只需要通過判斷函數(shù)內(nèi)的WM_HOTKEY消息,并監(jiān)控是否為我們所需要的即可,如下代碼是一段注冊熱鍵的實現(xiàn),分別注冊了Ctrl+F1, Ctrl+F2, Ctrl+F3三個熱鍵組;

#include <iostream>#include <Windows.h>using namespace std;int main(int argc, char* argv[]){

    // 分別注冊三個熱鍵 Ctrl+F1 , Ctrl+F2 , Ctrl+F3
    if (0 == RegisterHotKey(NULL, 1, MOD_CONTROL, VK_F1))
    {
        cout << GetLastError() << endl;
    }

    if (0 == RegisterHotKey(NULL, 2, MOD_CONTROL, VK_F2))
    {
        cout << GetLastError() << endl;
    }

    if (0 == RegisterHotKey(NULL, 3, MOD_CONTROL, VK_F3))
    {
        cout << GetLastError() << endl;
    }

    //做此線程的消息循環(huán),查出所有窗口的WM_HOTKEY消息,實際業(yè)務我們就是在消息處理過程中處理
    MSG msg = { 0 };
    while (::GetMessage(&msg,NULL,0,0))
    {
        if (msg.message == WM_HOTKEY)
        {
            if (msg.wParam == 1)
            {
                std::cout << "CTRL + F1" << std::endl;
            }
            else if(msg.wParam  == 2)
            {
                std::cout << "CTRL + F2" << std::endl;
            }
            else if (msg.wParam == 3)
            {
                std::cout << "CTRL + F3" << std::endl;
            }
        }

    }  
  
    return 0;}

Windows API,鍵盤鼠標監(jiān)控鉤子,鼠標監(jiān)控

當然上述方法是局部的,讀者只能在當前進程內(nèi)使用,如果離開了進程窗體則這類熱鍵將會失效,此時我們就需要使用SetWindowsHookEx函數(shù)注冊全局鉤子,該函數(shù)可以在系統(tǒng)中安裝鉤子,以便監(jiān)視或攔截特定的事件或消息。

以下是SetWindowsHookEx的函數(shù)原型:

HHOOK SetWindowsHookEx(
  int       idHook,
  HOOKPROC  lpfn,
  HINSTANCE hMod,
  DWORD     dwThreadId);

參數(shù)說明:

  • idHook:鉤子類型,可以是WH_KEYBOARD(鍵盤鉤子)或WH_MOUSE(鼠標鉤子)等

  • lpfn:回調(diào)函數(shù),當特定事件或消息發(fā)生時,操作系統(tǒng)會調(diào)用此函數(shù)。該函數(shù)的返回值由鉤子類型和參數(shù)決定

  • hMod:包含lpfnDLL句柄。如果lpfn參數(shù)在當前進程內(nèi),則該參數(shù)可以為NULL

  • dwThreadId:線程標識符,指定與鉤子相關(guān)聯(lián)的線程。如果dwThreadId參數(shù)為0,則鉤子將應用于所有線程

函數(shù)會返回一個類型為HHOOK的句柄,該句柄可以在卸載鉤子時使用,讀者需要注意由于全局鉤子會影響系統(tǒng)性能,因此在使用SetWindowsHookEx函數(shù)時應謹慎,并在使用結(jié)束后及時的通過UnhookWindowsHookEx釋放鉤子句柄。

如下所示代碼則是一個鍵盤鉤子監(jiān)控案例,在該案例中我們通過SetWindowsHookEx注冊一個全局鉤子,并設置回調(diào)函數(shù)LowLevelKeyboardProc通過使用PeekMessageA監(jiān)控鍵盤事件,當有鍵盤事件產(chǎn)生時則自動路由到LowLevelKeyboardProc函數(shù)內(nèi),此時即可得到按鍵的類型以及按下鍵位,如下所示;

#include <iostream>#include <Windows.h>using namespace std;//鍵盤鉤子句柄HHOOK keyboardHook = NULL;// 鍵盤鉤子LRESULT CALLBACK LowLevelKeyboardProc(_In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam){
    KBDLLHOOKSTRUCT* ks = (KBDLLHOOKSTRUCT*)lParam;


    if (ks->flags == 128 || ks->flags == 129)
    {
        //監(jiān)控按鍵狀態(tài)
        if (nCode >= 0)
        {
            if (wParam == WM_KEYDOWN)
            {
                cout << "普通按鍵抬起" << endl;
            }
            else if (wParam == WM_KEYUP)
            {
                cout << "普通按鍵按下" << endl;
            }
            else if (wParam == WM_SYSKEYDOWN)
            {
                cout << "系統(tǒng)按鍵抬起" << endl;
            }
            else if (wParam == WM_SYSKEYUP)
            {
                cout << "系統(tǒng)按鍵按下" << endl;

            }
        }
    }

    if (ks->vkCode == 0x41)
    {
        cout << "檢測到按鍵:" << "A" << endl;
    }
    else if (ks->vkCode == 0x0D)
    {
        cout << "檢測到按鍵:" << "Enter" << endl;
    }
    else if (ks->vkCode == 0xA0 || ks->vkCode == 0xA1)
    {
        cout << "檢測到按鍵:" << "Shift" << endl;
    }
    else if (ks->vkCode == 0x08)
    {
        cout << "檢測到按鍵:" << "Backspace(刪除鍵)" << endl;
    }
    else if (ks->vkCode == 0x20)
    {
        cout << "檢測到按鍵:" << "Space(空格鍵)" << endl;
    }

    // 直接返回1可以使按鍵失效
    //return 1;

    return CallNextHookEx(NULL,nCode,wParam,lParam);}int main(int argc, char* argv[]){

    // 安裝鍵盤鉤子,WH_KEYBOARD_LL為鍵盤鉤子
    keyboardHook = ::SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0);
    if (!keyboardHook)
    {
        cout << "無法注冊鍵盤鉤子!" << endl;
        return -1;
    }

    MSG msg = { 0 };
    while (1)
    {
        if (::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
        else
        {
            //...
        }

    }

    ::UnhookWindowsHookEx(keyboardHook);
    return 0;



   
  
    return 0;}

Windows API,鍵盤鼠標監(jiān)控鉤子,鼠標監(jiān)控

鼠標鉤子的掛鉤與鍵盤基本一致,只是在調(diào)用SetWindowsHookEx傳遞參數(shù)時設置了WH_MOUSE_LL鼠標事件,當有鼠標消息時則通過MouseProc鼠標回調(diào)函數(shù)執(zhí)行,

#include <iostream>#include <Windows.h>using namespace std;//鼠標鉤子句柄HHOOK mouseHook = NULL;// 鼠標鉤子LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam){
    MSLLHOOKSTRUCT* ms = (MSLLHOOKSTRUCT*)lParam;
    POINT pt = ms->pt;
    DWORD mouseData = ms->time;
    LPCSTR tipMsg = NULL;


    
    if (nCode >= 0)
    {
        if (wParam == WM_MOUSEMOVE)
        {
            tipMsg = "鼠標 [移動]";
        }
        else if (wParam == WM_LBUTTONDOWN)
        {
            tipMsg = "鼠標 [左鍵] 按下";
        }
        else if (wParam == WM_LBUTTONUP)
        {
            tipMsg = "鼠標 [左鍵] 抬起";
        }
        else if(wParam == WM_LBUTTONDBLCLK)
        {
            tipMsg = "鼠標 [左鍵] 雙擊";
        }
        else if (wParam == WM_RBUTTONDOWN)
        {
            tipMsg = "鼠標 [右鍵] 按下";
        }
        else if (wParam == WM_RBUTTONUP)
        {
            tipMsg = "鼠標 [右鍵] 抬起";
        }
        else if (wParam == WM_RBUTTONDBLCLK)
        {
            tipMsg = "鼠標 [右鍵] 雙擊";
        }
        else if (wParam == WM_MBUTTONDOWN)
        {
            tipMsg = "鼠標 [滾輪] 按下";
        }
        else if (wParam == WM_MBUTTONUP)
        {
            tipMsg = "鼠標 [滾輪] 抬起";
        }
        else if (wParam == WM_MBUTTONDBLCLK)
        {
            tipMsg = "鼠標 [滾輪] 雙擊";
        }
        else if (wParam == WM_MOUSEWHEEL)
        {
            tipMsg = "鼠標 [滾輪] 滾動";
        }
    }


    std::cout << "鼠標狀態(tài): " << tipMsg << std::endl;
    std::cout << "X: " << pt.x << " Y: " << pt.y << std::endl;
    std::cout << "附加數(shù)據(jù): " << mouseData << std::endl;
  
    return CallNextHookEx(NULL, nCode, wParam, lParam);
    }int main(int argc, char* argv[]){

    

    mouseHook = ::SetWindowsHookEx(WH_MOUSE_LL, MouseProc, GetModuleHandle(NULL), NULL);

    if (!mouseHook)
    {
        cout << "錯誤!安裝鼠標鉤子失??!" << endl;
    }

    MSG msg = { 0 };
    while (true)
    {
        if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            // 把按鍵消息傳遞給字符消息
            ::TranslateMessage(&msg);

            //將消息分派給窗口程序
            ::DispatchMessage(&msg);
        }
        else
        {
            //some thing todo ..
        }
    }


    UnhookWindowsHookEx(mouseHook);

 
  
    return 0;}

讀者可自行編譯并運行上述代碼片段,當掛鉤后我們就可以看到鼠標的移動位置以及鼠標擊鍵情況,如下圖所示;

    // 把按鍵消息傳遞給字符消息
        ::TranslateMessage(&msg);

        //將消息分派給窗口程序
        ::DispatchMessage(&msg);
    }
    else
    {
        //some thing todo ..
    }
}


UnhookWindowsHookEx(mouseHook);



return 0;
}

讀者可自行編譯并運行上述代碼片段,當掛鉤后我們就可以看到鼠標的移動位置以及鼠標擊鍵情況,如下圖所示;

 Windows API,鍵盤鼠標監(jiān)控鉤子,鼠標監(jiān)控文章來源地址http://www.zghlxwxcb.cn/news/detail-766037.html

到了這里,關(guān)于使用Windows API實現(xiàn)鍵盤鼠標監(jiān)控鉤子的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 【小沐學C++】C++ 實現(xiàn)鼠標鍵盤鉤子HOOK

    【小沐學C++】C++ 實現(xiàn)鼠標鍵盤鉤子HOOK

    https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-hooks 掛鉤是應用程序截獲消息、鼠標操作和擊鍵等事件的機制。 截獲特定類型的事件的函數(shù)稱為 掛鉤過程。 掛鉤過程可以對其接收的每個事件執(zhí)行操作,然后修改或放棄該事件。 掛鉤是系統(tǒng)消息處理機制中的一個點,其中應用

    2024年02月02日
    瀏覽(27)
  • c#使用Hook鉤子全局監(jiān)聽鍵盤和鼠標

    背景:今天接到客戶一個需求,就是在收銀員在用掃碼槍掃顧客會員碼或者微信付款碼的時候判斷用戶有沒有加企微好友和進企微群,然后根據(jù)這個狀態(tài)進行語音播報,判斷顧客能不能享受優(yōu)惠價。關(guān)鍵難點就是用戶用的收銀系統(tǒng)是別家的,線上小程序用的是我們家的,兩家

    2024年01月22日
    瀏覽(15)
  • 鼠標連點器(VB.net 全局鍵盤鉤子+模擬鼠標 左鍵、右鍵)

    鼠標連點器(VB.net 全局鍵盤鉤子+模擬鼠標 左鍵、右鍵)

    相信大家在玩游戲的時候會把 “攻擊” 設置為鼠標左鍵,但是自己手速不夠快,被人家秒了 廢話不多說,立馬進入主題: 一、新建一個vb.net工程(窗體應用程序) 大概是這樣,timer1控制鼠標左鍵,timer2控制鼠標右鍵 二、新建一個模塊(Module1.vb) 寫入:注意,本模塊由C

    2024年02月09日
    瀏覽(24)
  • C# Windows登錄界面進行截圖,控制鼠標鍵盤等操作實現(xiàn)(二)

    上一篇:C# Windows登錄界面進行截圖,控制鼠標鍵盤等操作實現(xiàn)(一) - log9527 - 博客園 (cnblogs.com)?我們了解了要實現(xiàn)在Windows登錄界面進行截圖等操作必須滿足的條件,這一篇我們主要通過代碼實現(xiàn)這些條件。 首先先建一個項目A 下面一些windows自帶非托管dll的調(diào)用類。 外部調(diào)用

    2024年02月12日
    瀏覽(19)
  • C# Windows登錄界面進行截圖,控制鼠標鍵盤等操作實現(xiàn)(三)

    在Windows登錄界面進行截圖,目前嘗試到的以下的截圖方法可以截取到圖,其它的方式要么卡住,要么截出來是黑屏的,直接上代碼: 操作鼠標鍵盤等操作可以參考本人另一篇文章:使用C#制作可以錄制自動化執(zhí)行Windows操作腳本工具——類似于按鍵精靈 - log9527 - 博客園 (cnbl

    2024年02月12日
    瀏覽(17)
  • 使用windows鉤子(HOOK)實現(xiàn)DLL注入

    使用windows鉤子(HOOK)實現(xiàn)DLL注入

    在Windows中,每個進程有自己私有的地址空間。當我們用指針來引用內(nèi)存的時候,指針的值表示的是進程自己的地址空間中的一個內(nèi)存地址。進程不能創(chuàng)建一個指針來引用屬于其他進程的內(nèi)存。因此,如果進程有一個缺陷會覆蓋隨機地址處的內(nèi)存,那么這個缺陷不會影響到其他

    2024年02月04日
    瀏覽(18)
  • python操作windows桌面實現(xiàn)鼠標、鍵盤操作,python之pyautogui庫文檔詳解

    PyAutoGUI是一個純Python的GUI自動化工具,其目的是可以用程序自動控制鼠標和鍵盤操作,多平臺支持(Windows,OS X,Linux)。 源碼地址: https://github.com/asweigart/pyautogui 官方文檔: https://github.com/asweigart/pyautogui/blob/master/docs/simplified-chinese.ipynb PyAutoGUI可以模擬鼠標的移動、點擊、拖

    2024年02月04日
    瀏覽(19)
  • LabVIEW監(jiān)控操縱桿,鍵盤或鼠標

    LabVIEW監(jiān)控操縱桿,鍵盤或鼠標

    LabVIEW監(jiān)控操縱桿,鍵盤或鼠標 在LabVIEW中從操縱桿/鼠標/鍵盤獲取數(shù)據(jù) 在LabVIEW中監(jiān)控我的輸入設備 如何知道鍵盤上按了哪些鍵? 用輪詢的方式監(jiān)控鼠標,鍵盤或操縱桿的動作。 要在LabVIEW中監(jiān)控這些設備,可以使用內(nèi)置的輸入設備采集VI。這些VI允許監(jiān)視附加的鍵盤,鼠標和

    2024年02月09日
    瀏覽(22)
  • API Monitor簡易使用教程 監(jiān)控Windows dll調(diào)用 監(jiān)控Windows API調(diào)用 查看函數(shù)名,參數(shù)類型,參數(shù),返回值

    API Monitor簡易使用教程 監(jiān)控Windows dll調(diào)用 監(jiān)控Windows API調(diào)用 查看函數(shù)名,參數(shù)類型,參數(shù),返回值

    1、API Filter窗口:選定要監(jiān)聽的dll函數(shù)或windows API,可以打斷點 選中并右鍵勾上Breakpoint 選 Before Call 2、Monitor New Process 窗口 :選擇要運行的exe 3、Summary窗口:會列出所有調(diào)用的函數(shù)。點函數(shù),查看函數(shù)名,參數(shù)類型,參數(shù),返回值等。還能設斷點。 當調(diào)用到斷點的函數(shù)調(diào)用時

    2024年01月21日
    瀏覽(34)
  • 關(guān)于使用C#調(diào)用Win32API,抓取第三方句柄,模擬鼠標點擊,鍵盤發(fā)送事件(C2Prog.exe)

    關(guān)于使用C#調(diào)用Win32API,抓取第三方句柄,模擬鼠標點擊,鍵盤發(fā)送事件(C2Prog.exe)

    因為最近工作需要用就把基本知識整理了一下 主要操作這個軟件寫程序和選配置 ? 下面例子和Win32以及自己封裝的庫全在工程文件里面 2023.7.10 :以前寫的代碼丟了重新寫了一下優(yōu)化了不少 ,所以特此更新一下 以前是1.7的版本目前用的是1.9版本有些不一樣需要注意 ?這里放最新

    2024年02月14日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包