zoukankan      html  css  js  c++  java
  • 黑客来了。。。键盘钩子,听起来很高端。

    首先是这个公共的类:globalKeyboardHook.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace Utilities {
        /// <summary>
        /// A class that manages a global low level keyboard hook
        /// </summary>
        class globalKeyboardHook {
            #region Constant, Structure and Delegate Definitions
            /// <summary>
            /// defines the callback type for the hook
            /// </summary>
            public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);
    
            public struct keyboardHookStruct {
                public int vkCode;
                public int scanCode;
                public int flags;
                public int time;
                public int dwExtraInfo;
            }
    
            const int WH_KEYBOARD_LL = 13;
            const int WM_KEYDOWN = 0x100;
            const int WM_KEYUP = 0x101;
            const int WM_SYSKEYDOWN = 0x104;
            const int WM_SYSKEYUP = 0x105;
            #endregion
    
            #region Instance Variables
            /// <summary>
            /// The collections of keys to watch for
            /// </summary>
            public List<Keys> HookedKeys = new List<Keys>();
            /// <summary>
            /// Handle to the hook, need this to unhook and call the next hook
            /// </summary>
            IntPtr hhook = IntPtr.Zero;
            #endregion
    
            #region Events
            /// <summary>
            /// Occurs when one of the hooked keys is pressed
            /// </summary>
            public event KeyEventHandler KeyDown;
            /// <summary>
            /// Occurs when one of the hooked keys is released
            /// </summary>
            public event KeyEventHandler KeyUp;
            #endregion
    
            #region Constructors and Destructors
            /// <summary>
            /// Initializes a new instance of the <see cref="globalKeyboardHook"/> class and installs the keyboard hook.
            /// </summary>
            public globalKeyboardHook() {
                hook();
            }
    
            /// <summary>
            /// Releases unmanaged resources and performs other cleanup operations before the
            /// <see cref="globalKeyboardHook"/> is reclaimed by garbage collection and uninstalls the keyboard hook.
            /// </summary>
            ~globalKeyboardHook() {
                unhook();
            }
            #endregion
    
            #region Public Methods
            /// <summary>
            /// Installs the global hook
            /// </summary>
            public void hook() {
                IntPtr hInstance = LoadLibrary("User32");
                hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0);
            }
    
            /// <summary>
            /// Uninstalls the global hook
            /// </summary>
            public void unhook() {
                UnhookWindowsHookEx(hhook);
            }
    
            /// <summary>
            /// The callback for the keyboard hook
            /// </summary>
            /// <param name="code">The hook code, if it isn't >= 0, the function shouldn't do anyting</param>
            /// <param name="wParam">The event type</param>
            /// <param name="lParam">The keyhook event information</param>
            /// <returns></returns>
            public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) {
                if (code >= 0) {
                    Keys key = (Keys)lParam.vkCode;
                    if (HookedKeys.Contains(key)) {
                        KeyEventArgs kea = new KeyEventArgs(key);
                        if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) {
                            KeyDown(this, kea) ;
                        } else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) {
                            KeyUp(this, kea);
                        }
                        if (kea.Handled)
                            return 1;
                    }
                }
                return CallNextHookEx(hhook, code, wParam, ref lParam);
            }
            #endregion
    
            #region DLL imports
            /// <summary>
            /// Sets the windows hook, do the desired event, one of hInstance or threadId must be non-null
            /// </summary>
            /// <param name="idHook">The id of the event you want to hook</param>
            /// <param name="callback">The callback.</param>
            /// <param name="hInstance">The handle you want to attach the event to, can be null</param>
            /// <param name="threadId">The thread you want to attach the event to, can be null</param>
            /// <returns>a handle to the desired hook</returns>
            [DllImport("user32.dll")]
            static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId);
    
            /// <summary>
            /// Unhooks the windows hook.
            /// </summary>
            /// <param name="hInstance">The hook handle that was returned from SetWindowsHookEx</param>
            /// <returns>True if successful, false otherwise</returns>
            [DllImport("user32.dll")]
            static extern bool UnhookWindowsHookEx(IntPtr hInstance);
    
            /// <summary>
            /// Calls the next hook.
            /// </summary>
            /// <param name="idHook">The hook id</param>
            /// <param name="nCode">The hook code</param>
            /// <param name="wParam">The wparam.</param>
            /// <param name="lParam">The lparam.</param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam);
    
            /// <summary>
            /// Loads the library.
            /// </summary>
            /// <param name="lpFileName">Name of the library</param>
            /// <returns>A handle to the library</returns>
            [DllImport("kernel32.dll")]
            static extern IntPtr LoadLibrary(string lpFileName);
            #endregion
        }
    }

    调用方式:

    public partial class Form1 : Form {
            globalKeyboardHook gkh = new globalKeyboardHook();
    
            public Form1() {
                InitializeComponent();
            }
            [DllImport("user32.dll")]
            public static extern int FindWindow(
                string lpClassName, // class name 
                string lpWindowName // window name 
            );
    
            [DllImport("user32.dll")]
            public static extern int SetForegroundWindow(
                int hWnd // handle to window
                );
            private void Form1_Load(object sender, EventArgs e) {
                gkh.HookedKeys.Add(Keys.A);
                gkh.HookedKeys.Add(Keys.B);
                gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
                gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);
            }
    
            void gkh_KeyUp(object sender, KeyEventArgs e) {
                lstLog.Items.Add("Up	" + e.KeyCode.ToString());
                int iHandle = FindWindow(null, "1 - Notepad");
    
                SetForegroundWindow(iHandle);
    
                string keys = "Z";//Here is the keys you want to send.
    
                System.Windows.Forms.SendKeys.Send(keys);
                e.Handled = true;
            }
    
            void gkh_KeyDown(object sender, KeyEventArgs e) {
                lstLog.Items.Add("Down	" + e.KeyCode.ToString());
                e.Handled = true;
            }
        }

    效果自己测吧,直接可以改另一个app的触发事件。

  • 相关阅读:
    超简单开发自己的php框架一点都不难
    .htaccess技巧: URL重写(Rewrite)与重定向
    htaccess附录:正则表达式、重定向代码
    编写自己的PHP MVC框架笔记
    微信企业号-上传、获取临时素材文件
    练习6.43:、6.45、6.46
    关于函数的特殊用途的语言特性的注意事项
    练习6.40、6.41
    练习6.39
    练习6.30、6.31、6.32
  • 原文地址:https://www.cnblogs.com/tony-MSDN/p/4422306.html
Copyright © 2011-2022 走看看