许明会的计算机技术主页

Language:C,C++,.NET Framework(C#)
Thinking:Design Pattern,Algorithm,WPF,Windows Internals
Database:SQLServer,Oracle,MySQL,PostSQL
IT:MCITP,Exchange,Lync,Virtualization,CCNP

导航

C#利用WIN32实现按键注册

using System.Runtime.InteropServices;
using System.Collections.Generic;
using System;
using System.Windows.Forms;

namespace Phoenix
{
    //注册系统按键消息
    class HotKeys
    {
        [DllImport("user32.dll")]
        private static extern bool RegisterHotKey(IntPtr hWnd, int id, int modifiers, Keys vk);
        [DllImport("user32.dll")]
        private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        public enum HotkeyModifiers
        {
            Alt = 1, Control = 2, Shift = 4, Win = 8
        }

        public delegate void HotkeyCallbackHandler();
        int keyId = 10;
        Dictionary<int, HotkeyCallbackHandler> keyMap = new Dictionary<int, HotkeyCallbackHandler>();

        /// <summary>
        /// 注册快捷键
        /// </summary>
        /// <param name="hWnd">持有快捷键窗口的句柄</param>
        /// <param name="modifiers">组合键</param>
        /// <param name="vk">快捷键的虚拟码</param>
        /// <param name="callback">回调函数,在按下快捷键后调用</param>
        public void Regist(IntPtr hWnd, int modifiers, Keys vk, HotkeyCallbackHandler callback)
        {
            int id = keyId++;
            if (!RegisterHotKey(hWnd, id, modifiers, vk))
            {
                throw new Exception("RegisterHotKey Error!");
            }
            keyMap[id] = callback;
        }
        public void UnRegist(IntPtr hWnd, HotkeyCallbackHandler callback)
        {
            foreach (var item in keyMap)
            {
                if (item.Value == callback)
                    UnregisterHotKey(hWnd, item.Key);
            }
        }

        public void ProcessHotKey(Message message)
        {
            if (message.Msg == 0x312)
            {
                int id = message.WParam.ToInt32();
                HotkeyCallbackHandler handler;
                if (keyMap.TryGetValue(id, out handler))
                    handler();
            }
        }
    }
}
//http://www.cnblogs.com/vvv999vz/archive/2011/08/03/2126503.html

using System;
using System.Collections.Generic;

using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Phoenix
{

    class MyForm : Form
    {
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string className, string titleName);
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr child, string className, string formText);
        [DllImport("user32.dll")]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, string lParam);


        HotKeys hotKey = new HotKeys();

        protected override void WndProc(ref Message message)
        {
            hotKey.ProcessHotKey(message);
            base.WndProc(ref message);
        }

        
        //跨越程序输入,向记事本的文本框写入指定字符
        public void callBack()
        {
            const int WM_SETTEXT = 0x00c;
            IntPtr hWndNotepad = FindWindow(null, "无标题 - 记事本");
            IntPtr hTextbox1 = FindWindowEx(hWndNotepad, IntPtr.Zero, "EDIT", null);
            IntPtr hTextbox2 = FindWindowEx(hWndNotepad, hTextbox1, "EDIT", null);
            SendMessage(hTextbox1, WM_SETTEXT, IntPtr.Zero, this.Text);
        }

        static void Main(string[] args)
        {
            MyForm form = new MyForm() { Text = "C#模拟键盘输入" };
            form.Load += delegate
             {
                 //register Ctrl+E 
                 form.hotKey.Regist(form.Handle, (int)HotKeys.HotkeyModifiers.Control, Keys.E, form.callBack);
             };
            Application.Run(form);

        }
    }
}

 

posted on 2016-03-14 00:22  许明会  阅读(740)  评论(0编辑  收藏  举报