| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
f627
10年前发布

C#钩子类 几乎捕获键盘鼠标所有事件

    using System;        using System.Text;        using System.Runtime.InteropServices;        using System.Reflection;        using System.Windows.Forms;                namespace MouseKeyboardLibrary        {                    /// <summary>            /// Abstract base class for Mouse and Keyboard hooks            /// </summary>            public abstract class GlobalHook            {                       #region Windows API Code                        [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;                }                        [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;                protected const int WH_KEYBOARD_LL = 13;                        protected const int WH_MOUSE = 7;                protected const int WH_KEYBOARD = 2;                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                        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;                        }                            }                        }                        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                    }                }      [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片        using System;        using System.Text;        using System.Windows.Forms;        using System.Runtime.InteropServices;                namespace MouseKeyboardLibrary        {                    /// <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                    }                }      [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片        using System;        using System.Text;        using System.Runtime.InteropServices;        using System.Windows.Forms;                namespace MouseKeyboardLibrary        {                    /// <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                    }                }      [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片        using System;        using System.Text;        using System.Windows.Forms;        using System.Runtime.InteropServices;                namespace MouseKeyboardLibrary        {                    /// <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                            }                }      [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片        using System;        using System.Text;        using System.Runtime.InteropServices;        using System.Drawing;        using System.Windows.Forms;                namespace MouseKeyboardLibrary        {                    /// <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                    }                }      [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片        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            {                        MouseHook mouseHook = new MouseHook();                KeyboardHook keyboardHook = new KeyboardHook();                        public HookTestForm()                {                    InitializeComponent();                }                        private void TestForm_Load(object sender, EventArgs e)                {                            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, MouseSimulator.Y);                        }                        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, e.Y);                        }                        void SetXYLabel(int x, int y)                {                            curXYLabel.Text = String.Format("Current Mouse Point: X={0}, y={1}", x, y);                        }                        void AddMouseEvent(string eventType, string button, string x, string y, string delta)                {                            listView1.Items.Insert(0,                        new ListViewItem(                            new string[]{                                eventType,                                 button,                                x,                                y,                                delta                            }));                        }                        void AddKeyboardEvent(string eventType, string keyCode, string keyChar, string shift, string alt, string control)                {                            listView2.Items.Insert(0,                         new ListViewItem(                             new string[]{                                eventType,                                 keyCode,                                keyChar,                                shift,                                alt,                                control                        }));                        }                        private void TestForm_FormClosed(object sender, FormClosedEventArgs e)                {                            // Not necessary anymore, will stop when application exits                            //mouseHook.Stop();                    //keyboardHook.Stop();                        }                            }        }