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

c#使用Hook鉤子全局監(jiān)聽鍵盤和鼠標

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

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

Hook鉤子

Windows是一個不斷處理消息的系統(tǒng),每次的鼠標點擊移動鍵盤輸入都是消息。鉤子是系統(tǒng)消息處理的一環(huán),可以使用鉤子處理函數(shù)來監(jiān)聽消息傳送,并處理消息。文章來源地址http://www.zghlxwxcb.cn/news/detail-815035.html

思路

  1. 用WPF做一個無邊框小小的半透明圓形窗體使用TopMost長駐留在桌面上。
  2. 增加一個ContextMenu 菜單,安裝鉤子和卸載鉤子
  3. 接入鉤子API
#region 第一步:聲明API函數(shù)。
// 安裝鉤子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
// 卸載鉤子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
// 繼續(xù)下一個鉤子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
// 取得當前線程編號
[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId();
#endregion

  1. 聲明鍵盤消息結構和鼠標消息結構
public struct KeyMSG
{
    public int vkCode;
    public int scanCode;
    public int flags;
    public int time;
    public int dwExtraInfo;
}
public struct MSG
{
    public Point p;
    public IntPtr HWnd;
    public uint wHitTestCode;
    public int dwExtraInfo;
}

  1. 安裝鍵盤鉤子和鼠標鉤子
#region 第二步:聲明,定義委托
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
static int hKeyboardHook = 0;//如果hKeyboardHook不為0則說明鉤子安裝成功
HookProc KeyboardHookProcedure;
static int hMouseHook = 0;
HookProc mouseHookProcedure;
#endregion
private void install_Click(object sender, RoutedEventArgs e)
{
    HookStart();
}
private void HookStart()
{
    if (hKeyboardHook == 0)//如果hKeyboardHook==0,鉤子安裝失敗
    {
        //創(chuàng)建HookProc實例
        KeyboardHookProcedure = new HookProc(KeyboardHookProc);
        //設置全局鉤子
        hKeyboardHook = SetWindowsHookEx(13, KeyboardHookProcedure,
   Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
        if (hKeyboardHook == 0)
        {
            //終止鉤子
            throw new Exception("安裝鉤子失敗");
        }
        Trace.WriteLine("鍵盤鉤子安裝成功");
    }
    if(hMouseHook == 0)
    {
        mouseHookProcedure = new HookProc(MouseHookProc);
        hMouseHook = SetWindowsHookEx(14, mouseHookProcedure,
   Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); 
        if(hMouseHook == 0)
        {
            throw new Exception("安裝鼠標鉤子失敗");
        }
        Trace.WriteLine("鼠標鉤子安裝成功");
    }
}
  1. 增加鍵盤鉤子和鼠標鉤子處理函數(shù)
private StringBuilder codes = new StringBuilder(); //接收掃碼槍輸入的數(shù)據(jù)
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
    if (nCode >= 0)
    {
        if(wParam == 0x100)
        {
            KeyMSG m = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));
            if (m.vkCode == 0x31)
            {
                codes.Append(1);
            }
            else if (m.vkCode == 0x32)
            {
                codes.Append(2);
            }
            else if (m.vkCode == 0x33)
            {
                codes.Append(3);
            }
            else if (m.vkCode == 0x34)
            {
                codes.Append(4);
            }
            else if (m.vkCode == 0x35)
            {
                codes.Append(5);
            }
            else if (m.vkCode == 0x36)
            {
                codes.Append(6);
            }
            else if (m.vkCode == 0x37)
            {
                codes.Append(7);
            }
            else if (m.vkCode == 0x38)
            {
                codes.Append(8);
            }
            else if (m.vkCode == 0x39)
            {
                codes.Append(9);
            }
            else if (m.vkCode == 0x30)
            {
                codes.Append(0);
            }
            else if (m.vkCode == 0x60)
            {
                codes.Append(0);
            }
            else if (m.vkCode == 0x61)
            {
                codes.Append(1);
            }
            else if (m.vkCode == 0x62)
            {
                codes.Append(2);
            }
            else if (m.vkCode == 0x63)
            {
                codes.Append(3);
            }
            else if (m.vkCode == 0x64)
            {
                codes.Append(4);
            }
            else if (m.vkCode == 0x65)
            {
                codes.Append(5);
            }
            else if (m.vkCode == 0x66)
            {
                codes.Append(6);
            }
            else if (m.vkCode == 0x67)
            {
                codes.Append(7);
            }
            else if (m.vkCode == 0x68)
            {
                codes.Append(8);
            }
            else if (m.vkCode == 0x69)
            {
                codes.Append(9);
            }
            if (m.vkCode == 0x0D)
            {
                // 回車鍵
                string code = codes.ToString();
                Trace.WriteLine(code);
                if(code.Length == 18)
                {
                    StatausHandle(code);
                    codes.Clear();
                }                        
            }
        }                
    }
    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
  1. 卸載鍵盤鉤子和鼠標鉤子
private void unInstall_Click(object sender, RoutedEventArgs e)
{
    HookStop();
}
private void HookStop()
 {
     bool retKeyboard = true;
     if (hKeyboardHook != 0)
     {
         retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
         hKeyboardHook = 0;
     }
     if (!retKeyboard)
         throw new Exception("鉤子卸載失敗");

     Trace.WriteLine("鍵盤鉤子卸載成功");
     if (hMouseHook != 0)
     {
         retKeyboard = UnhookWindowsHookEx(hMouseHook);
         hMouseHook = 0;
     }
     if (!retKeyboard)
         throw new Exception("鼠標鉤子卸載失敗");
     Trace.WriteLine("鼠標鉤子卸載成功");
 }
  1. 好了,拿到的code就算掃碼槍輸入的條碼,根據(jù)這個條碼實現(xiàn)自己的判斷邏輯來進行語音播報就行了。

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

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

領支付寶紅包贊助服務器費用

相關文章

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

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

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

    2024年02月09日
    瀏覽(24)
  • C#全局監(jiān)聽鍵盤事件

    C#如何獲取鍵盤和鼠標處于空閑狀態(tài)下的時間? 可以通過windows api 函數(shù) GetLastInputInfo或者全局鉤子HOOK來實現(xiàn) 用 GetLastInputInfo 寫(鍵鼠空閑15分鐘自動彈出一個頁面) 新建windows 應用程序項目 用HOOK鉤子來實現(xiàn) 創(chuàng)建鉤子類 調用 方法

    2024年02月11日
    瀏覽(23)
  • C# 監(jiān)測全局鍵盤和鼠標事件

    在 C# 中,我們可以編寫代碼來監(jiān)測全局鍵盤和鼠標事件。通過捕捉這些事件,我們可以實現(xiàn)一些有趣的功能,比如記錄按鍵操作、截獲特定的快捷鍵,或者在鼠標點擊時執(zhí)行特定的操作。 下面是一個示例代碼,演示了如何在 C# 中監(jiān)測全局鍵盤和鼠標事件:

    2024年02月02日
    瀏覽(18)
  • 12.1 使用鍵盤鼠標監(jiān)控鉤子

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

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

    2024年02月08日
    瀏覽(23)
  • C#版本的按鍵精靈,全局鍵盤鼠標事件

    代碼參考: 鉤子類:

    2024年02月14日
    瀏覽(21)
  • 使用Windows API實現(xiàn)鍵盤鼠標監(jiān)控鉤子

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

    本文介紹了如何使用Windows API中的SetWindowsHookEx和RegisterHotKey函數(shù)來監(jiān)控鍵盤和鼠標活動。特別地,我們將詳細討論RegisterHotKey函數(shù)的用法,該函數(shù)允許開發(fā)者注冊全局熱鍵并定義這些熱鍵觸發(fā)時的行為。

    2024年02月04日
    瀏覽(22)
  • WindowsAPI——使用Windows API中鍵盤、鼠標監(jiān)控鉤子

    WindowsAPI——使用Windows API中鍵盤、鼠標監(jiān)控鉤子

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

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

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

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

    2024年02月04日
    瀏覽(18)
  • Qt實現(xiàn)全局鍵盤事件監(jiān)聽器-Windows

    Qt實現(xiàn)全局鍵盤事件監(jiān)聽器-Windows

    更多精彩內容 ??個人內容分類匯總 ?? ??Qt自定義模塊、工具?? Qt版本:V5.12.5 兼容系統(tǒng): Windows:這里測試了Windows10,其它的版本沒有測試; Linux:這里測試了ubuntu18.04、20.04,其它的沒有測試; Mac:等啥時候我有了Mac電腦再說。 有時候我們想獲取到全局鍵盤事件,使用

    2024年02月09日
    瀏覽(30)
  • vue監(jiān)聽鼠標與鍵盤事件

    vue監(jiān)聽鼠標與鍵盤事件

    ?效果: ?

    2024年02月16日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包