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); } } }