//定义键盘消息结构体
public struct KeyMSG
{
public int vkCode; //键盘虚拟码(1-254)
public int scanCode; //硬件扫描码
public int flags; //键盘按下时等于128;键盘抬起时等于0
public int time; //windows运行时间
public int dwExtranInfo;
}
//定义变量
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
static int hKeyboardHook = 0;
HookProc KeyboardHookProcedure;
//安装钩子(需要命名空间:System.Runtime.InteropServices)
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook,HookProc lpfn,IntPtr hInstance,int threadId);
//卸载钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
//继续下一个钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
//钩子处理,就是钩子要做的事情
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if (nCode >= 0)
{
//将lParam数据转换成键盘消息
KeyMSG m = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));
if (m.flags==0&& m.vkCode == (int)(Keys.F2))//如果按了快捷键F2,则运行下面代码
{
ToolStripMenuItemScreenCopy_Click(this,null);
return 1;
}
else if (m.flags == 0 && m.vkCode == (int)(Keys.F3))//按了F3快捷键
{
ToolStripMenuItemScreenPen_Click(this, null);
return 1;
}
//如果返回1,则结束消息,这个消息到此为止,不再传递;如果返回0或调用CallNextHookEx函数则消息出了
//这个钩子继续往下传递
return 0;
}
return CallNextHookEx(hKeyboardHook,nCode,wParam,lParam);
}
//安装钩子
public void HookStart()
{
if (hKeyboardHook == 0)
{
//创建HookProc实例
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
//设置线程钩子,需要命名空间:System.Reflection
hKeyboardHook = SetWindowsHookEx(13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
//设置钩子失败
if (hKeyboardHook == 0)
{
HookStop();
throw new Exception("SetWindowsHookEx failed.");
}
}
}
//卸载钩子
public void HookStop()
{
bool retKeyBoard = true;
if (hKeyboardHook != 0)
{
retKeyBoard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
if (!retKeyBoard)
throw new Exception("UnhookWindowsHookEx failed.");
}
在FormMain()中安装钩子
public FormMain()
{
InitializeComponent();
//安装钩子
try
{
HookStart();
}
catch (Exception ex)
{
MessageBox.Show("钩子安装失败!提示信息:"+ex.Message);
}
}
在FormMain_FormClosed()中卸载钩子
private void FormMain_FormClosed(object sender, FormClosedEventArgs e)
{
//卸载钩子
try
{
HookStop();
}
catch (Exception ex)
{
MessageBox.Show("钩子卸载失败!提示信息:"+ex.Message);
}
}