C# 獲取鍵盤鉤子,屏蔽鍵盤按鍵

来源:https://www.cnblogs.com/wangyonglai/archive/2020/02/27/12373060.html
-Advertisement-
Play Games

static int hHook = 0; public delegate int HookProc(int nCode, int wParam, IntPtr lParam); //LowLevel鍵盤截獲,如果是WH_KEYBOARD=2,並不能對系統鍵盤截取,Acrobat Reader會在你 ...


 

 

static int hHook = 0;
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
        //LowLevel鍵盤截獲,如果是WH_KEYBOARD=2,並不能對系統鍵盤截取,Acrobat Reader會在你截取之前獲得鍵盤。 
        HookProc KeyBoardHookProcedure;
        public const int WH_KEYBOARD_LL = 13;
        //鍵盤Hook結構函數 
        [StructLayout(LayoutKind.Sequential)]
        public class KeyBoardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        //設置鉤子 
        [DllImport("user32.dll")]
        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);
        [DllImport("user32.dll")]
        //調用下一個鉤子 
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

        [DllImport("kernel32.dll")]
        public static extern int GetCurrentThreadId();

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);

        public void Hook_Start()
        {
            // 安裝鍵盤鉤子 
            if (hHook == 0)
            {
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);


                hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                          KeyBoardHookProcedure,
                        GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);

                //如果設置鉤子失敗. 
                if (hHook == 0)
                {
                    Hook_Clear();
                    //throw new Exception("設置Hook失敗!"); 
                }


            }


        }

        //取消鉤子事件 
        public void Hook_Clear()
        {
            bool retKeyboard = true;
            if (hHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hHook);
                hHook = 0;
            }
            //如果去掉鉤子失敗. 
            if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
        }

        //這裡可以添加自己想要的信息處理 
        public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
                if (kbh.vkCode == 91)  // 截獲左win(開始菜單鍵) 
                {
                    return 1;
                }
                if (kbh.vkCode == 92)// 截獲右win 
                {
                    return 1;
                }
                if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control) //截獲Ctrl+Esc 
                {
                    return 1;
                }
                if (kbh.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)  //截獲alt+f4 
                {
                    return 1;
                }
                if (kbh.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt) //截獲alt+tab 
                {
                    return 1;
                }
                if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截獲Ctrl+Shift+Esc 
                {
                    return 1;
                }
                if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Alt)  //截獲alt+空格 
                {
                    return 1;
                }
                if (kbh.vkCode == 241)                  //截獲F1 
                {
                    return 1;
                }
                //if (kbh.vkCode == (int)Keys.Delete && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)      //截獲Ctrl+Alt+Delete 
                //{
                //    return 1;
                //}
                if (kbh.vkCode == 122)  //截取F11
                {
                    return 1;
                }

            }
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 考察知識點 本題考察的知識點有以下幾個: 1. Keys 和 Scan 的區別 2. Keys 查詢的缺點 3. Scan 如何使用? 4. Scan 查詢的特點 2 解答思路 1. Keys 查詢存在的問題 2. Scan 的使用 3. Scan 的特點 3 Keys 使用相關 1)Keys ...
  • springBoot1.x升級到springBoot2.x,出現預設的mysql驅動包版本的問題,需要修改jdbc驅動類和連接字元串 ...
  • 直接使用 CIL - .NET 上的彙編語言編寫 .NET Standard 類庫 ...
  • 目 錄 1. 概述... 1 2. iNeuDaemon部署... 2 3. iNeuDaemon配置監控服務項... 3 4. 應用效果... 3 1. 概述 iNeuDaemon是Windows平臺後臺守護進程,用於監測服務進程,如果出現異常退出、遠程運維重新啟動等場景,那麼可以部署iNeuDa ...
  • 實現方式:WinForm自定義控制項,繼承系統Label控制項實現。 第1步:創建“組件”,取名為:MarkLabel 第2步:修改添加如下代碼: /* 添加命名空間引用: * using System.Windows.Forms; * using System.Drawing; * */ public ...
  • 1,博圖數據塊的數據排列原則: 數據對齊演算法: 將當前地址對齊到整數:numBytes = (int)Math.Ceiling(numBytes); 將當前地址對齊到偶整數: numBytes = Math.Ceiling(numBytes); if ((numBytes / 2 - Math.Fl... ...
  • ABP框架 .NetCore3.x版本 1.首先找到xxx.Core 項目,添加引用Microsoft.EntityFrameworkCore.Tools 2.找到xxx.EntityFrameworkCore項目,將原有sqlserver的引用改為mysql引用 3. 找到Host項目中的配置文件 ...
  • 0x01 前言 ASP.NET Core在預設發佈情況下,會啟動預編譯將試圖編譯成 xx.Views.dll ,也許在視圖中打算修改一處很細小的地方我們需要再重新編譯視圖進行發佈。下麵我將從 ASP.NET Core 3 之前版本到 ASP.NET Core 3X 之後版本的一個配置列下下方供大家參 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...