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