|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 yang0026 于 2019-6-18 15:05 编辑
VSTO中,想实现按某个组合快捷键,打开指定的窗体。VBA中很简单,用 application.onkey 调用某个宏就行。VSTO现在用C#做,网上找了个快捷键的方法,如下,但是只能在窗体里用,就是在ribbon上点击按钮打开窗体后后,可以用这段代码设置某些操作的快捷键,但是我想要打开窗体的快捷键,就是在窗体还没打开的时候就注册快捷键。我把HotKey.RegisterHotKey放在Ribbon.cs的Ribbon_Load里,把override void WndProc这个函数放Ribbon.cs里,会报错。有什么其他的解决办法么?
- using System;
- using System.Collections.Generic;
- using System.Runtime.InteropServices;
- using System.Windows.Forms;
- namespace xxx
- {
- class HotKey
- {
- //如果函数执行成功,返回值不为0。
- //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
- [DllImport("user32.dll", SetLastError = true)]
- public static extern bool RegisterHotKey(
- IntPtr hWnd, //要定义热键的窗口的句柄
- int id, //定义热键ID(不能与其它ID重复)
- int fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
- Keys vk //定义热键的内容
- );
- [DllImport("user32.dll", SetLastError = true)]
- public static extern bool UnregisterHotKey(
- IntPtr hWnd, //要取消热键的窗口的句柄
- int id //要取消热键的ID
- );
- //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
- [Flags()]
- public enum KeyModifiers
- {
- None = 0,
- Alt = 1,
- Ctrl = 2,
- Shift = 4,
- WindowsKey = 8
- }
- }
- }
- private void Form_Load(object sender, EventArgs e)
- {
- //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。
- HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);
- //注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。
- HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);
- //注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。
- HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);
- }
- //在FormA的Leave事件中注销热键。
- private void Form_Closed(object sender, EventArgs e)
- {
- //注销Id号为100的热键设定
- HotKey.UnregisterHotKey(Handle, 100);
- //注销Id号为101的热键设定
- HotKey.UnregisterHotKey(Handle, 101);
- //注销Id号为102的热键设定
- HotKey.UnregisterHotKey(Handle, 102);
- }
- ///
- /// 监视Windows消息
- /// 重载WndProc方法,用于实现热键响应
- ///
- ///
- protected override void WndProc(ref Message m)
- {
- const int WM_HOTKEY = 0x0312;
- //按快捷键
- switch (m.Msg)
- {
- case WM_HOTKEY:
- switch (m.WParam.ToInt32())
- {
- case 100: //按下的是Shift+S
- //此处填写快捷键响应代码
- break;
- case 101: //按下的是Ctrl+B
- //此处填写快捷键响应代码
- break;
- case 102: //按下的是Alt+D
- //此处填写快捷键响应代码
- break;
- }
- break;
- }
- base.WndProc(ref m);
- }
复制代码 |
|