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

C#全局監(jiān)聽(tīng)鍵盤(pán)事件

這篇具有很好參考價(jià)值的文章主要介紹了C#全局監(jiān)聽(tīng)鍵盤(pán)事件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

C#如何獲取鍵盤(pán)和鼠標(biāo)處于空閑狀態(tài)下的時(shí)間? 可以通過(guò)windows api 函數(shù) GetLastInputInfo或者全局鉤子HOOK來(lái)實(shí)現(xiàn)

用 GetLastInputInfo 寫(xiě)(鍵鼠空閑15分鐘自動(dòng)彈出一個(gè)頁(yè)面)

新建windows 應(yīng)用程序項(xiàng)目

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace APPDEMO
{
    static class Program
    {
        private static VedioForm vf = null;
        private static System.Windows.Forms.Timer timer1 = null;
        /// <summary>
        /// 應(yīng)用程序的主入口點(diǎn)。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //啟用定時(shí)器
            if (timer1 == null)
            {
                timer1 = new Timer();
            }
            timer1.Interval = 60 * 1000;
            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Start();
            Application.Run(new MainForm());
        }
        private static void timer1_Tick(object sender, EventArgs e)
        {
            //判斷空閑時(shí)間是否超過(guò)15分鐘,超過(guò)則自動(dòng)彈出視頻播放窗口
            if (GetIdleTick() / 1000 >= 15 * 60)
            {
                ShowVidioForm();
            }
        }
        /// <summary>
        /// 打開(kāi)視頻播放窗口
        /// </summary>
        private static void ShowVidioForm()
        {
            try
            {
                if (vf == null)
                {
                    vf = new VedioForm();
                }
                vf.ShowDialog();
            }
            catch
            {
            }
        }
        /// <summary>
        /// 獲取鼠標(biāo)鍵盤(pán)空閑時(shí)間
        /// </summary>
        /// <returns></returns>
        public static long GetIdleTick()
        {
            LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
            lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo);
            if (!GetLastInputInfo(ref lastInputInfo)) return 0;
            return Environment.TickCount - (long)lastInputInfo.dwTime;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct LASTINPUTINFO
        {
            [MarshalAs(UnmanagedType.U4)]
            public int cbSize;
            [MarshalAs(UnmanagedType.U4)]
            public uint dwTime;
        }
        /// <summary>
        /// 調(diào)用windows API獲取鼠標(biāo)鍵盤(pán)空閑時(shí)間
        /// </summary>
        /// <param name="plii"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
    }
}

用HOOK鉤子來(lái)實(shí)現(xiàn) 創(chuàng)建鉤子類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TengDa.Core
{
    class KeyboardHook
    {
        public event KeyEventHandler KeyDownEvent;
        public event KeyPressEventHandler KeyPressEvent;
        public event KeyEventHandler KeyUpEvent;

        public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
        static int hKeyboardHook = 0; //聲明鍵盤(pán)鉤子處理的初始值
                                      //值在Microsoft SDK的Winuser.h里查詢
        public const int WH_KEYBOARD_LL = 13;   //線程鍵盤(pán)鉤子監(jiān)聽(tīng)鼠標(biāo)消息設(shè)為2,全局鍵盤(pán)監(jiān)聽(tīng)鼠標(biāo)消息設(shè)為13
        HookProc KeyboardHookProcedure; //聲明KeyboardHookProcedure作為HookProc類型
                                        //鍵盤(pán)結(jié)構(gòu)
        [StructLayout(LayoutKind.Sequential)]
        public class KeyboardHookStruct
        {
            public int vkCode;  //定一個(gè)虛擬鍵碼。該代碼必須有一個(gè)價(jià)值的范圍1至254
            public int scanCode; // 指定的硬件掃描碼的關(guān)鍵
            public int flags;  // 鍵標(biāo)志
            public int time; // 指定的時(shí)間戳記的這個(gè)訊息
            public int dwExtraInfo; // 指定額外信息相關(guān)的信息
        }
        //使用此功能,安裝了一個(gè)鉤子
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);


        //調(diào)用此函數(shù)卸載鉤子
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnhookWindowsHookEx(int idHook);


        //使用此功能,通過(guò)信息鉤子繼續(xù)下一個(gè)鉤子
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);

        // 取得當(dāng)前線程編號(hào)(線程鉤子需要用到)
        [DllImport("kernel32.dll")]
        static extern int GetCurrentThreadId();

        //使用WINDOWS API函數(shù)代替獲取當(dāng)前實(shí)例的函數(shù),防止鉤子失效
        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);

        public void Start()
        {
            // 安裝鍵盤(pán)鉤子
            if (hKeyboardHook == 0)
            {
                KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);
                //hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
                //************************************
                //鍵盤(pán)線程鉤子
                SetWindowsHookEx(13, KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId());//指定要監(jiān)聽(tīng)的線程idGetCurrentThreadId(),
                                                                                               //鍵盤(pán)全局鉤子,需要引用空間(using System.Reflection;)
                                                                                               //SetWindowsHookEx( 13,MouseHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
                                                                                               //
                                                                                               //關(guān)于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函數(shù)將鉤子加入到鉤子鏈表中,說(shuō)明一下四個(gè)參數(shù):
                                                                                               //idHook 鉤子類型,即確定鉤子監(jiān)聽(tīng)何種消息,上面的代碼中設(shè)為2,即監(jiān)聽(tīng)鍵盤(pán)消息并且是線程鉤子,如果是全局鉤子監(jiān)聽(tīng)鍵盤(pán)消息應(yīng)設(shè)為13,
                                                                                               //線程鉤子監(jiān)聽(tīng)鼠標(biāo)消息設(shè)為7,全局鉤子監(jiān)聽(tīng)鼠標(biāo)消息設(shè)為14。lpfn 鉤子子程的地址指針。如果dwThreadId參數(shù)為0 或是一個(gè)由別的進(jìn)程創(chuàng)建的
                                                                                               //線程的標(biāo)識(shí),lpfn必須指向DLL中的鉤子子程。 除此以外,lpfn可以指向當(dāng)前進(jìn)程的一段鉤子子程代碼。鉤子函數(shù)的入口地址,當(dāng)鉤子鉤到任何
                                                                                               //消息后便調(diào)用這個(gè)函數(shù)。hInstance應(yīng)用程序?qū)嵗木浔?。?biāo)識(shí)包含lpfn所指的子程的DLL。如果threadId 標(biāo)識(shí)當(dāng)前進(jìn)程創(chuàng)建的一個(gè)線程,而且子
                                                                                               //程代碼位于當(dāng)前進(jìn)程,hInstance必須為NULL??梢院芎?jiǎn)單的設(shè)定其為本應(yīng)用程序的實(shí)例句柄。threaded 與安裝的鉤子子程相關(guān)聯(lián)的線程的標(biāo)識(shí)符
                                                                                               //如果為0,鉤子子程與所有的線程關(guān)聯(lián),即為全局鉤子
                                                                                               //************************************
                                                                                               //如果SetWindowsHookEx失敗
                if (hKeyboardHook == 0)
                {
                    Stop();
                    throw new Exception("安裝鍵盤(pán)鉤子失敗");
                }
            }
        }
        public void Stop()
        {
            bool retKeyboard = true;


            if (hKeyboardHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
                hKeyboardHook = 0;
            }

            if (!(retKeyboard)) throw new Exception("卸載鉤子失?。?);
        }
        //ToAscii職能的轉(zhuǎn)換指定的虛擬鍵碼和鍵盤(pán)狀態(tài)的相應(yīng)字符或字符
        [DllImport("user32")]
        public static extern int ToAscii(int uVirtKey, //[in] 指定虛擬關(guān)鍵代碼進(jìn)行翻譯。
                                         int uScanCode, // [in] 指定的硬件掃描碼的關(guān)鍵須翻譯成英文。高階位的這個(gè)值設(shè)定的關(guān)鍵,如果是(不壓)
                                         byte[] lpbKeyState, // [in] 指針,以256字節(jié)數(shù)組,包含當(dāng)前鍵盤(pán)的狀態(tài)。每個(gè)元素(字節(jié))的數(shù)組包含狀態(tài)的一個(gè)關(guān)鍵。如果高階位的字節(jié)是一套,關(guān)鍵是下跌(按下)。在低比特,如果設(shè)置表明,關(guān)鍵是對(duì)切換。在此功能,只有肘位的CAPS LOCK鍵是相關(guān)的。在切換狀態(tài)的NUM個(gè)鎖和滾動(dòng)鎖定鍵被忽略。
                                         byte[] lpwTransKey, // [out] 指針的緩沖區(qū)收到翻譯字符或字符。
                                         int fuState); // [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise.

        //獲取按鍵的狀態(tài)
        [DllImport("user32")]
        public static extern int GetKeyboardState(byte[] pbKeyState);


        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern short GetKeyState(int vKey);

        private const int WM_KEYDOWN = 0x100;//KEYDOWN
        private const int WM_KEYUP = 0x101;//KEYUP
        private const int WM_SYSKEYDOWN = 0x104;//SYSKEYDOWN
        private const int WM_SYSKEYUP = 0x105;//SYSKEYUP

        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            // 偵聽(tīng)鍵盤(pán)事件
            if ((nCode >= 0) && (KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null))
            {
                KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
                // raise KeyDown
                if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
                {
                    Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    KeyEventArgs e = new KeyEventArgs(keyData);
                    KeyDownEvent(this, e);
                }

                //鍵盤(pán)按下
                if (KeyPressEvent != null && wParam == WM_KEYDOWN)
                {
                    byte[] keyState = new byte[256];
                    GetKeyboardState(keyState);

                    byte[] inBuffer = new byte[2];
                    if (ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags) == 1)
                    {
                        KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
                        KeyPressEvent(this, e);
                    }
                }

                // 鍵盤(pán)抬起
                if (KeyUpEvent != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
                {
                    Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    KeyEventArgs e = new KeyEventArgs(keyData);
                    KeyUpEvent(this, e);
                }

            }
            //如果返回1,則結(jié)束消息,這個(gè)消息到此為止,不再傳遞。
            //如果返回0或調(diào)用CallNextHookEx函數(shù)則消息出了這個(gè)鉤子繼續(xù)往下傳遞,也就是傳給消息真正的接受者
            return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
        }
        ~KeyboardHook()
        {
            Stop();
        }
   }
}

調(diào)用 方法文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-506940.html

 private void hook_KeyDown(object sender, KeyEventArgs e)
        {
            //  這里寫(xiě)具體實(shí)現(xiàn)
            if (e.KeyCode.Equals(Keys.PrintScreen))
            {

            }
        }

        /// <summary>
        /// 開(kāi)始監(jiān)聽(tīng)
        /// </summary>
        public void startListen()
        {
            myKeyEventHandeler = new KeyEventHandler(hook_KeyDown);
            k_hook.KeyDownEvent += myKeyEventHandeler;//鉤住鍵按下
            k_hook.Start();//安裝鍵盤(pán)鉤子
        }

        /// <summary>
        /// 結(jié)束監(jiān)聽(tīng)
        /// </summary>
        public void stopListen()
        {
            if (myKeyEventHandeler != null)
            {
                k_hook.KeyDownEvent -= myKeyEventHandeler;//取消按鍵事件
                myKeyEventHandeler = null;
                k_hook.Stop();//關(guān)閉鍵盤(pán)鉤子
            }
        }

到了這里,關(guān)于C#全局監(jiān)聽(tīng)鍵盤(pán)事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • python 監(jiān)聽(tīng)鍵盤(pán)事件和鼠標(biāo)事件

    鍵盤(pán)監(jiān)聽(tīng): python有一個(gè)很強(qiáng)大的鍵盤(pán)監(jiān)聽(tīng)?zhēng)欤蔷褪?keyboard 。他的父類庫(kù) pynput 可以實(shí)現(xiàn)鼠標(biāo)監(jiān)聽(tīng) 可以自行下載 pip install keyboard | pip install pynput 代碼參考

    2024年02月13日
    瀏覽(42)
  • vue監(jiān)聽(tīng)鼠標(biāo)與鍵盤(pán)事件

    vue監(jiān)聽(tīng)鼠標(biāo)與鍵盤(pán)事件

    ?效果: ?

    2024年02月16日
    瀏覽(31)
  • Qt實(shí)現(xiàn)全局鍵盤(pán)事件監(jiān)聽(tīng)器-Windows

    Qt實(shí)現(xiàn)全局鍵盤(pán)事件監(jiān)聽(tīng)器-Windows

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

    2024年02月09日
    瀏覽(30)
  • Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽(tīng)器-Windows

    Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽(tīng)器-Windows

    更多精彩內(nèi)容 ??個(gè)人內(nèi)容分類匯總 ?? ??Qt自定義模塊、工具?? Qt版本:V5.12.5 兼容系統(tǒng): Windows:這里測(cè)試了Windows10,其它的版本沒(méi)有測(cè)試; Linux:這里測(cè)試了ubuntu18.04、20.04,其它的沒(méi)有測(cè)試; Mac:等啥時(shí)候我有了Mac電腦再說(shuō)。 有時(shí)候我們想獲取到【系統(tǒng)全局鼠標(biāo)事件】

    2024年02月16日
    瀏覽(15)
  • Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽(tīng)器-Linux

    Qt實(shí)現(xiàn)全局鼠標(biāo)事件監(jiān)聽(tīng)器-Linux

    更多精彩內(nèi)容 ??個(gè)人內(nèi)容分類匯總 ?? ??Qt自定義模塊、工具?? Qt版本:V5.12.5 兼容系統(tǒng): Windows:這里測(cè)試了Windows10,其它的版本沒(méi)有測(cè)試; Linux:這里測(cè)試了ubuntu18.04、20.04,其它的沒(méi)有測(cè)試; Mac:等啥時(shí)候我有了Mac電腦再說(shuō)。 有時(shí)候我們想獲取到【系統(tǒng)全局鼠標(biāo)事件】

    2024年02月11日
    瀏覽(17)
  • js之 事件監(jiān)聽(tīng)(鼠標(biāo)、焦點(diǎn)、鍵盤(pán)、文本)

    js之 事件監(jiān)聽(tīng)(鼠標(biāo)、焦點(diǎn)、鍵盤(pán)、文本)

    目標(biāo) :能夠給DOM元素添加事件監(jiān)聽(tīng) 什么是事件 :事件是在編程時(shí)系統(tǒng)內(nèi)發(fā)生的動(dòng)作或者發(fā)生的事情,比如用戶在網(wǎng)頁(yè)上單擊一個(gè)按鈕 什么是事件監(jiān)聽(tīng) : ? ? ? ?就是讓程序檢測(cè)是否有事件產(chǎn)生,一旦有事件觸發(fā),就立即調(diào)用一個(gè)函數(shù)做出響應(yīng),也稱為 綁定事件或者注冊(cè)事

    2024年02月14日
    瀏覽(27)
  • python——實(shí)現(xiàn)鼠標(biāo)與鍵盤(pán)監(jiān)聽(tīng)與事件處理

    python——實(shí)現(xiàn)鼠標(biāo)與鍵盤(pán)監(jiān)聽(tīng)與事件處理

    偵聽(tīng)按鍵 偵聽(tīng)鼠標(biāo) 監(jiān)聽(tīng)按鍵 需要注意的是必須使用cv加載圖像,只有點(diǎn)擊圖像窗口才能偵聽(tīng)點(diǎn)擊窗口時(shí)所使用的按鍵 ord和chr的用法我這里重復(fù)一下,可以實(shí)現(xiàn)對(duì)于acall碼的解釋,方便直接看到按鍵結(jié)果 ord()函數(shù)主要用來(lái)返回對(duì)應(yīng)字符的ascii碼, chr()主要用來(lái)表示ascii碼對(duì)應(yīng)的

    2024年02月06日
    瀏覽(29)
  • C#使用SnsSharp實(shí)現(xiàn)鼠標(biāo)鍵盤(pán)鉤子,實(shí)現(xiàn)全局按鍵響應(yīng)

    CSDN下載地址:https://download.csdn.net/download/sns1991sns/88041637 gitee下載地址:https://gitee.com/linsns/snssharp 一、鍵盤(pán)事件,使用 SnsKeyboardHook 按鍵事件共有3個(gè): ????????KeyDown (按鍵按下)???????? ????????KeyUp (按鍵松開(kāi))????????? ????????KeyPress (按鍵按下并松開(kāi)) 以

    2024年02月14日
    瀏覽(24)
  • Vue中 如何監(jiān)聽(tīng)鍵盤(pán)事件中的按鍵

    Vue中 如何監(jiān)聽(tīng)鍵盤(pán)事件中的按鍵

    在Web前端開(kāi)發(fā)中,鍵盤(pán)事件的處理是非常常見(jiàn)的需求之一。而在Vue框架中,如何監(jiān)聽(tīng)鍵盤(pán)事件中的按鍵是一個(gè)相對(duì)簡(jiǎn)單但又很實(shí)用的功能。本文將為你介紹如何在Vue中監(jiān)聽(tīng)鍵盤(pán)事件,并演示一些常用的按鍵操作。 首先,在Vue中監(jiān)聽(tīng)鍵盤(pán)事件的方式有兩種:一種是直接在DOM元素

    2024年02月20日
    瀏覽(24)
  • Qt鍵盤(pán)事件處理——如何在Qt中監(jiān)聽(tīng)按鍵操作

    Qt鍵盤(pán)事件處理——如何在Qt中監(jiān)聽(tīng)按鍵操作 在Qt中,使用鍵盤(pán)是很常見(jiàn)的操作。如何通過(guò)代碼來(lái)實(shí)現(xiàn)鍵盤(pán)事件的監(jiān)聽(tīng)和響應(yīng)呢?本文將詳細(xì)介紹在Qt中如何監(jiān)聽(tīng)鍵盤(pán)事件,并實(shí)現(xiàn)一些基本的按鍵操作。 在Qt中,所有的鍵盤(pán)事件都被封裝成了一個(gè)QKeyEvent對(duì)象,我們只需要在需要

    2024年02月11日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包