English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 9|回复: 0

C#钩子(Hook) 捕获键盘鼠标所有事件

[复制链接]
查看: 9|回复: 0

C#钩子(Hook) 捕获键盘鼠标所有事件

[复制链接]
查看: 9|回复: 0

366

主题

0

回帖

1108

积分

金牌会员

积分
1108
a54546

366

主题

0

回帖

1108

积分

金牌会员

积分
1108
2025-2-6 18:04:00 | 显示全部楼层 |阅读模式
C# 钩子 捕获键盘鼠标所有事件,可用于:判断鼠标键盘无操作时,关闭 Winform 窗体
5分钟没有操作,自动关闭 Form 窗体
钩子(Hook)的作用主要体现在监视和拦截系统或进程中的各种事件消息,并进行自定义处理。钩子可以截获并处理相应的消息,例如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。钩子分为线程钩子和系统钩子,线程钩子监视指定线程的事件消息,而系统钩子监视系统中的所有线程的事件消息
钩子的具体应用场景和功能

  • 键盘和鼠标输入监控:钩子可以截获键盘和鼠标的输入,用于记录用户的操作或进行自动化测试。
  • 屏幕取词和日志监视:通过监控系统事件,钩子可以实现屏幕取词功能或记录系统的操作日志。
  • 应用程序监控:外壳钩子可以截取、启动和关闭应用程序的消息,用于监控或管理应用程序的行为。
钩子的种类及其功能

  • 键盘钩子:截获键盘消息,用于记录键盘输入或进行输入拦截。
  • 鼠标钩子:截获鼠标事件,用于监控鼠标操作。
  • 外壳钩子:截取、启动和关闭应用程序的消息,用于管理应用程序行为。
  • 日志钩子:监控系统日志事件,用于记录系统操作日志。
钩子的工作原理
钩子是Windows消息处理机制中的一个监视点,应用程序可以在这里安装一个监视子程序,从而在系统的消息流到达目的窗口的过程前监控它们。通过这种方式,钩子能够实现各种自定义的功能和处理逻辑

  • GlobalHook
  • KeyboardHook
  • MouseHook
  • KeyboardSimulator
  • MouseSimulator
GlobalHook

using System;using System.Text;using System.Runtime.InteropServices;using System.Reflection;using System.Windows.Forms;namespace VipSoft.BaseClass.Hook{    /// <summary>      /// Abstract base class for Mouse and Keyboard hooks      /// </summary>      public abstract class GlobalHook    {        #region Windows API Code          /// <summary>        /// 用于控制结构体或类的字段在内存中的布局方式        /// 具体来说,LayoutKind.Sequential 表示字段将按照它们在源代码中声明的顺序排列        /// 结构体字段将按照 x、y 的顺序在内存中排列        /// - Sequential:字段按声明顺序排列,不插入填充字节。                /// - Explicit:允许开发者精确控制每个字段的存储位置,使用 FieldOffset 属性指定偏移量。                /// - Auto:由编译器选择最优布局方式,通常不推荐用于与非托管代码交互的场景                          /// </summary>        [StructLayout(LayoutKind.Sequential)]        protected class POINT        {            public int x;            public int y;        }        [StructLayout(LayoutKind.Sequential)]        protected class MouseHookStruct        {            public POINT pt;            public int hwnd;            public int wHitTestCode;            public int dwExtraInfo;        }        [StructLayout(LayoutKind.Sequential)]        protected class MouseLLHookStruct        {            public POINT pt;            public int mouseData;            public int flags;            public int time;            public int dwExtraInfo;        }        [StructLayout(LayoutKind.Sequential)]        protected class KeyboardHookStruct        {            public int vkCode;            public int scanCode;            public int flags;            public int time;            public int dwExtraInfo;        }                /// <summary>                /// CallingConvention属性指定调用约定,它定义了函数如何接收参数和返回值。常见的调用约定包括:                                ///        - CallingConvention.Cdecl:调用者清理堆栈,多用于C/C++库。                ///        - CallingConvention.StdCall:被调用者清理堆栈,Windows API常用。                ///        - CallingConvention.ThisCall:用于C++类方法。                ///        - CallingConvention.FastCall:用于快速调用,较少使用。                 /// CharSet属性用于指定字符串的字符集,影响字符串的处理和传递方式。主要选项有:                                ///        - CharSet.Ansi:将字符串作为ANSI编码传递。                ///        - CharSet.Unicode:将字符串作为Unicode编码传递。                ///        - CharSet.Auto:根据平台自动选择ANSI或Unicode。                /// SetLastError属性指定是否在调用非托管函数后调用GetLastError。设置为true时,可以使用Marshal.GetLastWin32Error获取错误代码。                ///                /// idHook, 指示欲被安装的挂钩处理过程之类型        /// lpfn, 指向相应的挂钩处理过程.若参数dwThreadId为0或者指示了一个其他进程创建的线程之标识符,则参数lpfn必须指向一个动态链接中的挂钩处理过程.否则,参数lpfn可以指向一个与当前进程相关的代码中定义的挂钩处理过程                /// hMod 指示了一个动态链接的句柄,该动态连接库包含了参数lpfn 所指向的挂钩处理过程.若参数dwThreadId指示的线程由当前进程创建,并且相应的挂钩处理过程定义于当前进程相关的代码中,则参数hMod必须被设置为NULL(0)。                /// dwThreadId 指示了一个线程标识符,挂钩处理过程与线程相关.若此参数值为0,则该挂钩处理过程与所有现存的线程相关。                ///                /// </summary>        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]        protected static extern int SetWindowsHookEx(            int idHook,            HookProc lpfn,             IntPtr hMod,            int dwThreadId);        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]        protected static extern int UnhookWindowsHookEx(int idHook);        [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]        protected static extern int CallNextHookEx(            int idHook,            int nCode,            int wParam,            IntPtr lParam);        [DllImport("user32")]        protected static extern int ToAscii(            int uVirtKey,            int uScanCode,            byte[] lpbKeyState,            byte[] lpwTransKey,            int fuState);        [DllImport("user32")]        protected static extern int GetKeyboardState(byte[] pbKeyState);        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]        protected static extern short GetKeyState(int vKey);        protected delegate int HookProc(int nCode, int wParam, IntPtr lParam);        protected const int WH_MOUSE_LL = 14; //此挂钩只能在Windows NT中被安装,用来对底层的鼠标输入事件进行监视.详情参见LowLevelMouseProc挂钩处理过程.        protected const int WH_KEYBOARD_LL = 13; //此挂钩只能在Windows NT中被安装,用来对底层的键盘输入事件进行监视.详情参见LowLevelKeyboardProc挂钩处理过程.        protected const int WH_MOUSE = 7; //安装一个挂钩处理过程,对鼠标消息进行监视. 详情参见 MouseProc挂钩处理过程.        protected const int WH_KEYBOARD = 2; //安装一个挂钩处理过程对击键消息进行监视. 详情参见KeyboardProc挂钩处理过程.        protected const int WM_MOUSEMOVE = 0x200;   //鼠标移动        protected const int WM_LBUTTONDOWN = 0x201; //鼠标左健按下        protected const int WM_RBUTTONDOWN = 0x204; //鼠标右健按下        protected const int WM_MBUTTONDOWN = 0x207; //鼠标滚轮按下        protected const int WM_LBUTTONUP = 0x202;        protected const int WM_RBUTTONUP = 0x205;        protected const int WM_MBUTTONUP = 0x208;        protected const int WM_LBUTTONDBLCLK = 0x203;        protected const int WM_RBUTTONDBLCLK = 0x206;        protected const int WM_MBUTTONDBLCLK = 0x209;        protected const int WM_MOUSEWHEEL = 0x020A;        protected const int WM_KEYDOWN = 0x100;        protected const int WM_KEYUP = 0x101;        protected const int WM_SYSKEYDOWN = 0x104;        protected const int WM_SYSKEYUP = 0x105;        protected const byte VK_SHIFT = 0x10;        protected const byte VK_CAPITAL = 0x14;        protected const byte VK_NUMLOCK = 0x90;        protected const byte VK_LSHIFT = 0xA0;        protected const byte VK_RSHIFT = 0xA1;        protected const byte VK_LCONTROL = 0xA2;        protected const byte VK_RCONTROL = 0x3;        protected const byte VK_LALT = 0xA4;        protected const byte VK_RALT = 0xA5;        protected const byte LLKHF_ALTDOWN = 0x20;        #endregion        #region Private Variables          protected int _hookType;        protected int _handleToHook;        protected bool _isStarted;        protected HookProc _hookCallback;        #endregion        #region Properties          public bool IsStarted        {            get            {                return _isStarted;            }        }        #endregion        #region Constructor          public GlobalHook()        {            Application.ApplicationExit += new EventHandler(Application_ApplicationExit);        }        #endregion        #region Methods                  /// <summary>                /// 启用钩子                ///        </summary>                public void Start()        {            if (!_isStarted &&                _hookType != 0)            {                // Make sure we keep a reference to this delegate!                  // If not, GC randomly collects it, and a NullReference exception is thrown                  _hookCallback = new HookProc(HookCallbackProcedure);                _handleToHook = SetWindowsHookEx(                    _hookType,                    _hookCallback,                    Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),                    0);                // Were we able to sucessfully start hook?                  if (_handleToHook != 0)                {                    _isStarted = true;                }            }        }                        /// <summary>                /// 停止钩子                ///        </summary>                public void Stop()        {            if (_isStarted)            {                UnhookWindowsHookEx(_handleToHook);                _isStarted = false;            }        }        protected virtual int HookCallbackProcedure(int nCode, Int32 wParam, IntPtr lParam)        {            // This method must be overriden by each extending hook              return 0;        }        protected void Application_ApplicationExit(object sender, EventArgs e)        {            if (_isStarted)            {                Stop();            }        }        #endregion    }}KeyboardHook

using System;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;namespace VipSoft.BaseClass.Hook{    /// <summary>      /// Captures global keyboard events      /// </summary>      public class KeyboardHook : GlobalHook    {        #region Events          public event KeyEventHandler KeyDown;        public event KeyEventHandler KeyUp;        public event KeyPressEventHandler KeyPress;        #endregion        #region Constructor          public KeyboardHook()        {            _hookType = WH_KEYBOARD_LL;        }        #endregion        #region Methods          protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)        {            bool handled = false;            if (nCode > -1 && (KeyDown != null || KeyUp != null || KeyPress != null))            {                KeyboardHookStruct keyboardHookStruct =                    (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));                // Is Control being held down?                  bool control = ((GetKeyState(VK_LCONTROL) & 0x80) != 0) ||                               ((GetKeyState(VK_RCONTROL) & 0x80) != 0);                // Is Shift being held down?                  bool shift = ((GetKeyState(VK_LSHIFT) & 0x80) != 0) ||                             ((GetKeyState(VK_RSHIFT) & 0x80) != 0);                // Is Alt being held down?                  bool alt = ((GetKeyState(VK_LALT) & 0x80) != 0) ||                           ((GetKeyState(VK_RALT) & 0x80) != 0);                // Is CapsLock on?                  bool capslock = (GetKeyState(VK_CAPITAL) != 0);                // Create event using keycode and control/shift/alt values found above                  KeyEventArgs e = new KeyEventArgs(                    (Keys)(                        keyboardHookStruct.vkCode |                        (control ? (int)Keys.Control : 0) |                        (shift ? (int)Keys.Shift : 0) |                        (alt ? (int)Keys.Alt : 0)                        ));                // Handle KeyDown and KeyUp events                  switch (wParam)                {                    case WM_KEYDOWN:                    case WM_SYSKEYDOWN:                        if (KeyDown != null)                        {                            KeyDown(this, e);                            handled = handled || e.Handled;                        }                        break;                    case WM_KEYUP:                    case WM_SYSKEYUP:                        if (KeyUp != null)                        {                            KeyUp(this, e);                            handled = handled || e.Handled;                        }                        break;                }                // Handle KeyPress event                  if (wParam == WM_KEYDOWN &&                   !handled &&                   !e.SuppressKeyPress &&                    KeyPress != null)                {                    byte[] keyState = new byte[256];                    byte[] inBuffer = new byte[2];                    GetKeyboardState(keyState);                    if (ToAscii(keyboardHookStruct.vkCode,                              keyboardHookStruct.scanCode,                              keyState,                              inBuffer,                              keyboardHookStruct.flags) == 1)                    {                        char key = (char)inBuffer[0];                        if ((capslock ^ shift) && Char.IsLetter(key))                            key = Char.ToUpper(key);                        KeyPressEventArgs e2 = new KeyPressEventArgs(key);                        KeyPress(this, e2);                        handled = handled || e.Handled;                    }                }            }            if (handled)            {                return 1;            }            else            {                return CallNextHookEx(_handleToHook, nCode, wParam, lParam);            }        }        #endregion    }}MouseHook

using System;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;namespace VipSoft.BaseClass.Hook{    /// <summary>      /// Captures global mouse events      /// </summary>      public class MouseHook : GlobalHook    {        #region MouseEventType Enum          private enum MouseEventType        {            None,            MouseDown,            MouseUp,            DoubleClick,            MouseWheel,            MouseMove        }        #endregion        #region Events          public event MouseEventHandler MouseDown;        public event MouseEventHandler MouseUp;        public event MouseEventHandler MouseMove;        public event MouseEventHandler MouseWheel;        public event EventHandler Click;        public event EventHandler DoubleClick;        #endregion        #region Constructor          public MouseHook()        {            _hookType = WH_MOUSE_LL;        }        #endregion        #region Methods          protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)        {            if (nCode > -1 && (MouseDown != null || MouseUp != null || MouseMove != null))            {                MouseLLHookStruct mouseHookStruct =                    (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));                MouseButtons button = GetButton(wParam);                MouseEventType eventType = GetEventType(wParam);                MouseEventArgs e = new MouseEventArgs(                    button,                    (eventType == MouseEventType.DoubleClick ? 2 : 1),                    mouseHookStruct.pt.x,                    mouseHookStruct.pt.y,                    (eventType == MouseEventType.MouseWheel ? (short)((mouseHookStruct.mouseData >> 16) & 0xffff) : 0));                // Prevent multiple Right Click events (this probably happens for popup menus)                  if (button == MouseButtons.Right && mouseHookStruct.flags != 0)                {                    eventType = MouseEventType.None;                }                switch (eventType)                {                    case MouseEventType.MouseDown:                        if (MouseDown != null)                        {                            MouseDown(this, e);                        }                        break;                    case MouseEventType.MouseUp:                        if (Click != null)                        {                            Click(this, new EventArgs());                        }                        if (MouseUp != null)                        {                            MouseUp(this, e);                        }                        break;                    case MouseEventType.DoubleClick:                        if (DoubleClick != null)                        {                            DoubleClick(this, new EventArgs());                        }                        break;                    case MouseEventType.MouseWheel:                        if (MouseWheel != null)                        {                            MouseWheel(this, e);                        }                        break;                    case MouseEventType.MouseMove:                        if (MouseMove != null)                        {                            MouseMove(this, e);                        }                        break;                    default:                        break;                }            }            return CallNextHookEx(_handleToHook, nCode, wParam, lParam);        }        private MouseButtons GetButton(Int32 wParam)        {            switch (wParam)            {                case WM_LBUTTONDOWN:                case WM_LBUTTONUP:                case WM_LBUTTONDBLCLK:                    return MouseButtons.Left;                case WM_RBUTTONDOWN:                case WM_RBUTTONUP:                case WM_RBUTTONDBLCLK:                    return MouseButtons.Right;                case WM_MBUTTONDOWN:                case WM_MBUTTONUP:                case WM_MBUTTONDBLCLK:                    return MouseButtons.Middle;                default:                    return MouseButtons.None;            }        }        private MouseEventType GetEventType(Int32 wParam)        {            switch (wParam)            {                case WM_LBUTTONDOWN:                case WM_RBUTTONDOWN:                case WM_MBUTTONDOWN:                    return MouseEventType.MouseDown;                case WM_LBUTTONUP:                case WM_RBUTTONUP:                case WM_MBUTTONUP:                    return MouseEventType.MouseUp;                case WM_LBUTTONDBLCLK:                case WM_RBUTTONDBLCLK:                case WM_MBUTTONDBLCLK:                    return MouseEventType.DoubleClick;                case WM_MOUSEWHEEL:                    return MouseEventType.MouseWheel;                case WM_MOUSEMOVE:                    return MouseEventType.MouseMove;                default:                    return MouseEventType.None;            }        }        #endregion    }}KeyboardSimulator

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 VipSoft.BaseClass.Hook{    /// <summary>      /// Standard Keyboard Shortcuts used by most applications      /// </summary>      public enum StandardShortcut    {        Copy,        Cut,        Paste,        SelectAll,        Save,        Open,        New,        Close,        Print    }    /// <summary>      /// Simulate keyboard key presses      /// </summary>      public static class KeyboardSimulator    {        #region Windows API Code          const int KEYEVENTF_EXTENDEDKEY = 0x1;        const int KEYEVENTF_KEYUP = 0x2;        [DllImport("user32.dll")]        static extern void keybd_event(byte key, byte scan, int flags, int extraInfo);        #endregion        #region Methods          public static void KeyDown(Keys key)        {            keybd_event(ParseKey(key), 0, 0, 0);        }        public static void KeyUp(Keys key)        {            keybd_event(ParseKey(key), 0, KEYEVENTF_KEYUP, 0);        }        public static void KeyPress(Keys key)        {            KeyDown(key);            KeyUp(key);        }        public static void SimulateStandardShortcut(StandardShortcut shortcut)        {            switch (shortcut)            {                case StandardShortcut.Copy:                    KeyDown(Keys.Control);                    KeyPress(Keys.C);                    KeyUp(Keys.Control);                    break;                case StandardShortcut.Cut:                    KeyDown(Keys.Control);                    KeyPress(Keys.X);                    KeyUp(Keys.Control);                    break;                case StandardShortcut.Paste:                    KeyDown(Keys.Control);                    KeyPress(Keys.V);                    KeyUp(Keys.Control);                    break;                case StandardShortcut.SelectAll:                    KeyDown(Keys.Control);                    KeyPress(Keys.A);                    KeyUp(Keys.Control);                    break;                case StandardShortcut.Save:                    KeyDown(Keys.Control);                    KeyPress(Keys.S);                    KeyUp(Keys.Control);                    break;                case StandardShortcut.Open:                    KeyDown(Keys.Control);                    KeyPress(Keys.O);                    KeyUp(Keys.Control);                    break;                case StandardShortcut.New:                    KeyDown(Keys.Control);                    KeyPress(Keys.N);                    KeyUp(Keys.Control);                    break;                case StandardShortcut.Close:                    KeyDown(Keys.Alt);                    KeyPress(Keys.F4);                    KeyUp(Keys.Alt);                    break;                case StandardShortcut.Print:                    KeyDown(Keys.Control);                    KeyPress(Keys.P);                    KeyUp(Keys.Control);                    break;            }        }        static byte ParseKey(Keys key)        {            // Alt, Shift, and Control need to be changed for API function to work with them              switch (key)            {                case Keys.Alt:                    return (byte)18;                case Keys.Control:                    return (byte)17;                case Keys.Shift:                    return (byte)16;                default:                    return (byte)key;            }        }        #endregion    }}MouseSimulator

using System;using System.Text;using System.Runtime.InteropServices;using System.Drawing;using System.Windows.Forms;namespace VipSoft.BaseClass.Hook{    /// <summary>      /// And X, Y point on the screen      /// </summary>      public struct MousePoint    {        public MousePoint(Point p)        {            X = p.X;            Y = p.Y;        }        public int X;        public int Y;        public static implicit operator Point(MousePoint p)        {            return new Point(p.X, p.Y);        }    }    /// <summary>      /// Mouse buttons that can be pressed      /// </summary>      public enum MouseButton    {        Left = 0x2,        Right = 0x8,        Middle = 0x20    }    /// <summary>      /// Operations that simulate mouse events      /// </summary>      public static class MouseSimulator    {        #region Windows API Code          [DllImport("user32.dll")]        static extern int ShowCursor(bool show);        [DllImport("user32.dll")]        static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);        const int MOUSEEVENTF_MOVE = 0x1;        const int MOUSEEVENTF_LEFTDOWN = 0x2;        const int MOUSEEVENTF_LEFTUP = 0x4;        const int MOUSEEVENTF_RIGHTDOWN = 0x8;        const int MOUSEEVENTF_RIGHTUP = 0x10;        const int MOUSEEVENTF_MIDDLEDOWN = 0x20;        const int MOUSEEVENTF_MIDDLEUP = 0x40;        const int MOUSEEVENTF_WHEEL = 0x800;        const int MOUSEEVENTF_ABSOLUTE = 0x8000;        #endregion        #region Properties          /// <summary>          /// Gets or sets a structure that represents both X and Y mouse coordinates          /// </summary>          public static MousePoint Position        {            get            {                return new MousePoint(Cursor.Position);            }            set            {                Cursor.Position = value;            }        }        /// <summary>          /// Gets or sets only the mouse's x coordinate          /// </summary>          public static int X        {            get            {                return Cursor.Position.X;            }            set            {                Cursor.Position = new Point(value, Y);            }        }        /// <summary>          /// Gets or sets only the mouse's y coordinate          /// </summary>          public static int Y        {            get            {                return Cursor.Position.Y;            }            set            {                Cursor.Position = new Point(X, value);            }        }        #endregion        #region Methods          /// <summary>          /// Press a mouse button down          /// </summary>          /// <param name="button"></param>          public static void MouseDown(MouseButton button)        {            mouse_event(((int)button), 0, 0, 0, 0);        }        public static void MouseDown(MouseButtons button)        {            switch (button)            {                case MouseButtons.Left:                    MouseDown(MouseButton.Left);                    break;                case MouseButtons.Middle:                    MouseDown(MouseButton.Middle);                    break;                case MouseButtons.Right:                    MouseDown(MouseButton.Right);                    break;            }        }        /// <summary>          /// Let a mouse button up          /// </summary>          /// <param name="button"></param>          public static void MouseUp(MouseButton button)        {            mouse_event(((int)button) * 2, 0, 0, 0, 0);        }        public static void MouseUp(MouseButtons button)        {            switch (button)            {                case MouseButtons.Left:                    MouseUp(MouseButton.Left);                    break;                case MouseButtons.Middle:                    MouseUp(MouseButton.Middle);                    break;                case MouseButtons.Right:                    MouseUp(MouseButton.Right);                    break;            }        }        /// <summary>          /// Click a mouse button (down then up)          /// </summary>          /// <param name="button"></param>          public static void Click(MouseButton button)        {            MouseDown(button);            MouseUp(button);        }        public static void Click(MouseButtons button)        {            switch (button)            {                case MouseButtons.Left:                    Click(MouseButton.Left);                    break;                case MouseButtons.Middle:                    Click(MouseButton.Middle);                    break;                case MouseButtons.Right:                    Click(MouseButton.Right);                    break;            }        }        /// <summary>          /// Double click a mouse button (down then up twice)          /// </summary>          /// <param name="button"></param>          public static void DoubleClick(MouseButton button)        {            Click(button);            Click(button);        }        public static void DoubleClick(MouseButtons button)        {            switch (button)            {                case MouseButtons.Left:                    DoubleClick(MouseButton.Left);                    break;                case MouseButtons.Middle:                    DoubleClick(MouseButton.Middle);                    break;                case MouseButtons.Right:                    DoubleClick(MouseButton.Right);                    break;            }        }        /// <summary>          /// Show a hidden current on currently application          /// </summary>          public static void Show()        {            ShowCursor(true);        }        /// <summary>          /// Hide mouse cursor only on current application's forms          /// </summary>          public static void Hide()        {            ShowCursor(false);        }        #endregion    }}测试类:

using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Linq;  using System.Text;  using System.Windows.Forms;    using MouseKeyboardLibrary;    namespace SampleApplication  {      /*       上面的5个类编译成Dll引用,使用例子      */      public partial class HookTestForm : Form      {            //用于判断,窗休是否自动关闭        System.Windows.Forms.Timer mTimer = new System.Windows.Forms.Timer();                //记录鼠标键盘操作时间,用于判断 Form 窗体自动关闭        private DateTime mRecordTime = DateTime.Now;         MouseHook mouseHook = new MouseHook();          KeyboardHook keyboardHook = new KeyboardHook();            public HookTestForm()          {              InitializeComponent();          }            private void TestForm_Load(object sender, EventArgs e)          {             mTimer.Tick += mTimer_Tick;           mTimer.Interval = 2000;           mTimer.Start(); //开启定时器                                            mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);              mouseHook.MouseDown += new MouseEventHandler(mouseHook_MouseDown);              mouseHook.MouseUp += new MouseEventHandler(mouseHook_MouseUp);              mouseHook.MouseWheel += new MouseEventHandler(mouseHook_MouseWheel);                keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);              keyboardHook.KeyUp += new KeyEventHandler(keyboardHook_KeyUp);              keyboardHook.KeyPress += new KeyPressEventHandler(keyboardHook_KeyPress);                mouseHook.Start();              keyboardHook.Start();                SetXYLabel("", MouseSimulator.X.ToString(), MouseSimulator.Y.ToString());          }            void keyboardHook_KeyPress(object sender, KeyPressEventArgs e)          {                AddKeyboardEvent(                  "KeyPress",                  "",                  e.KeyChar.ToString(),                  "",                  "",                  ""                  );            }            void keyboardHook_KeyUp(object sender, KeyEventArgs e)          {                AddKeyboardEvent(                  "KeyUp",                  e.KeyCode.ToString(),                  "",                  e.Shift.ToString(),                  e.Alt.ToString(),                  e.Control.ToString()                  );            }            void keyboardHook_KeyDown(object sender, KeyEventArgs e)          {                  AddKeyboardEvent(                  "KeyDown",                  e.KeyCode.ToString(),                  "",                  e.Shift.ToString(),                  e.Alt.ToString(),                  e.Control.ToString()                  );            }            void mouseHook_MouseWheel(object sender, MouseEventArgs e)          {                AddMouseEvent(                  "MouseWheel",                  "",                  "",                  "",                  e.Delta.ToString()                  );            }            void mouseHook_MouseUp(object sender, MouseEventArgs e)          {                  AddMouseEvent(                  "MouseUp",                  e.Button.ToString(),                  e.X.ToString(),                  e.Y.ToString(),                  ""                  );            }            void mouseHook_MouseDown(object sender, MouseEventArgs e)          {                  AddMouseEvent(                  "MouseDown",                  e.Button.ToString(),                  e.X.ToString(),                  e.Y.ToString(),                  ""                  );              }            void mouseHook_MouseMove(object sender, MouseEventArgs e)          {              SetXYLabel("", e.X.ToString(), e.Y.ToString());        }          void SetXYLabel(string keyName, string x, string y)        {            this.Text = $"Current keyName={keyName} Point: X={x}, y={y} {DateTime.Now.ToString("HH:mm:ss")}";            mRecordTime = DateTime.Now;        }          void AddMouseEvent(string eventType, string button, string x, string y, string delta)          {                 //this.Text = $"Current Mouse eventType ={eventType} button ={button} delta ={delta} X ={x}, y ={y}";             SetXYLabel(button, x, y);        }            void AddKeyboardEvent(string eventType, string keyCode, string keyChar, string shift, string alt, string control)          {                 //this.Text = $"Current Mouse eventType ={eventType} keyCode ={keyCode} keyChar ={keyChar} shift ={shift}, alt ={alt} control={control}";              SetXYLabel(button, x, y);        }            private void TestForm_FormClosed(object sender, FormClosedEventArgs e)          {                // Not necessary anymore, will stop when application exits                //mouseHook.Stop();              //keyboardHook.Stop();            }                          private bool stopForm = false;          //定时器        private void mTimer_Tick(object sender, EventArgs e)        {            if (stopForm)            {                return;            }            if ((DateTime.Now - mRecordTime).TotalMinutes >= 5) //记录时间大于5分钟            {                stopForm = true;                for (int i = Application.OpenForms.Count - 1; i >= 0; i--)                {                    Form item = Application.OpenForms;                    if (item.Name != this.Name && item.Name != "UserLogin") //关闭不是主窗体的打开窗体                    {                        item.Close();                    }                }                this.WindowState = FormWindowState.Maximized;                stopForm = false;            }        }    }  }  引用:https://www.cnblogs.com/gc2013/p/4036414.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

366

主题

0

回帖

1108

积分

金牌会员

积分
1108

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-3-10 15:25 , Processed in 0.768508 second(s), 27 queries .

Powered by 智能设备

©2025

|网站地图