Windows Mobile/Windows CE开发技巧 —— 使用钩子实现自定义系统功能键

在自己开发的程序里,实现自定义功能键,是比较容易的事。但是,如果需要实现一些系统级别的按键自定义,在离开自己开发程序界面,或者在其他程序的界面,可以响应到按键事件,只能使用钩子的方式实现。

请参考以下例子,例子中捕获了Code=112,113,114,115,116键值的按键(一般代表一些PDA的F1,F2,F3,F4,F5键):

class HookKeyClass
{
	public delegate int HookKeyProc(int code, IntPtr wParam, IntPtr lParam);
	public delegate void KeyEventHandler(int KeyValue);
	public event KeyEventHandler KeyEvent;
	private HookKeyProc hookKeyDeleg;
	private int hHookKey = 0;
	public HookKeyClass()
	{ Start(); }
	~HookKeyClass()
	{ Stop(); }

	#region public methods
	//安装钩子
	private void Start()
	{
		if (hHookKey != 0)
		{
			//Unhook the previouse one
			this.Stop();
		}
		hookKeyDeleg = new HookKeyProc(HookKeyProcedure);
		hHookKey = SetWindowsHookEx(WH_KEYBOARD_LL, hookKeyDeleg, GetModuleHandle(null), 0);
		if (hHookKey == 0)
		{
			throw new SystemException("Failed acquiring of the hook.");
		}
	}
	//拆除钩子
	private void Stop()
	{
		UnhookWindowsHookEx(hHookKey);
	}
	#endregion

	#region protected and private methods
	private int HookKeyProcedure(int code, IntPtr wParam, IntPtr lParam)
	{
		KBDLLHOOKSTRUCT hookStruct = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
		if (code < 0)
		{ return CallNextHookEx(hookKeyDeleg, code, wParam, lParam); }
		if (hookStruct.vkCode == 112 || hookStruct.vkCode == 113 ||
			hookStruct.vkCode == 114 || hookStruct.vkCode == 115 || hookStruct.vkCode == 116)
		{
			KeyEvent(hookStruct.vkCode);
		}
		return CallNextHookEx(hookKeyDeleg, code, wParam, lParam);
	}
	#endregion

	#region P/Invoke declarations
	[DllImport("coredll.dll")]
	private static extern int SetWindowsHookEx(int type, HookKeyProc HookKeyProc, IntPtr hInstance, int m);
	//private static extern int SetWindowsHookEx(int type, HookMouseProc HookMouseProc, IntPtr hInstance, int m);
	[DllImport("coredll.dll")]
	private static extern IntPtr GetModuleHandle(string mod);

	[DllImport("coredll.dll")]
	private static extern int CallNextHookEx(HookKeyProc hhk, int nCode, IntPtr wParam, IntPtr lParam);

	[DllImport("coredll.dll")]
	private static extern int GetCurrentThreadId();
	[DllImport("coredll.dll", SetLastError = true)]
	private static extern int UnhookWindowsHookEx(int idHook);
	private struct KBDLLHOOKSTRUCT
	{
		public int vkCode;
		public int scanCode;
		public int flags;
		public int time;
		public IntPtr dwExtraInfo;
	}
	const int WH_KEYBOARD_LL = 20;
	public class KeyBoardInfo
	{
		public int vkCode;
		public int scanCode;
		public int flags;
		public int time;
	}
	#endregion
}


在界面后台代码中,对捕获的按键行为进行定义:

HookKeyClass hk = new HookKeyClass();
hk.KeyEvent += new HookKeyClass.KeyEventHandler(hk_KeyEvent);

private void hk_KeyEvent(int KeyValue)
{
	if (KeyValue == 112)
	{
		// do something
	}
	else if (KeyValue == 113)
	{
		// do something
	}
	else if (KeyValue == 114)
	{
		// do something
	}
	else if (KeyValue == 115)
	{
		// do something
	}
	else if (KeyValue == 116)
	{
		// do something
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值