WPF注册热键大荟萃
源码下载:http://www.cnblogs.com/dabaopku/archive/2010/02/22/1671267.html
研究了一晚上,终于搞定了啦~~~~~
首先完整复制下面的第一篇文章中的代码
然后以下代码是
其中Id随意取值,好像都没有问题
一直受第三篇文章干扰(说实在的,确实让人恼火,它的RegisterHotkey(Keys Key, KeyFlags keyflags)
明明是Key在前 keyflags在后,可是带入APi的
结底还是自己不够细心,足足浪费了半小时,郁闷!)
RegisterHotKey 后却是反过来的,结果我也跟着他的弄反了control和F12,归根
然后反注册就很简单了,唉,累死了~~
来源:http://www.cnblogs.com/zengezenge/archive/2009/07/09/1519582.html
不说废话,直接看代码吧,其关键就是 System.Windows.Interop.HwndSource类。
第一步:注册热键,需要使用API函数,具体的参照网上的其它文章。唯一需要注意的是需要使用KeyInterop.VirtualKeyFromKey函数将
WPF的Key枚举转化为API函数可以使用的VirtualKeyCode :
第二步:注册热键处理函数,主要的难点就在这里,在.NET的WinForm程序中一般使用重写Form的WinProc方法或者注册IMessageFilter来实现的,
但是在WPF中以上两种方式都无法获得热键消息的处理机会,除非是在WPF程序中隐藏一个常规的Form(最开始就是这么弄得,后来觉得实在是太丑陋了)
以上代码在Windows2008下测试通过。
在c#中使用全局快捷键
来源:http://hi.baidu.com/55csharp/blog/item/de6fef88efcebdbb0e24442f.html 由于.net并没有提供快捷键的库,所以要使用该功能得通过api实现。 在winapi中,注册和注销全局快捷键分别是通过RegisterHotKey和UnregisterHotKey函数实现。在c#中直接使用该api显得不够简洁,这里我提供了一个友好点的封装。 代码如下: static class Hotkey [DllImport("user32.dll")] /**//// <summary> /**//// <summary> /**//// <summary> const int WM_HOTKEY = 0x312; public delegate void HotKeyCallBackHanlder(); enum HotkeyModifiers
这里通过Hotkey类实现功能的封装,使用非常简单。下面为参考测试代码。
void Test() protected override void WndProc(ref Message m) private void button1_Click(object sender, EventArgs e) 当程序form1启动时,注册了两个快捷键Alt+T和Ctrl+Shift+K,单击button1的时候会注销快捷键Alt+T。代码比较简单,这里就不多介绍了。 注:快捷键是通过消息触发的,因此要重载WndProc函数,在里面添加对快捷键回调消息的处理方法Hotkey.ProcessHotKey(m)。
|