永发信息网

请问 C# 用什么结构存储 热键(如:ctrl+alt+s)?谢谢

答案:2  悬赏:0  手机版
解决时间 2021-03-11 13:18
请问 C# 用什么结构存储 热键(如:ctrl+alt+s)?谢谢
最佳答案
在应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键

(1)建立一个类文件,命名为HotKey.cs,代码如下:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace KoalaStudio.BookshopManager
{
class HotKey
{
//如果函数执行成功,返回值不为0。
//如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, //要定义热键的窗口的句柄
int id, //定义热键ID(不能与其它ID重复)
KeyModifiers 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
}
}
}

简单说明一下:
“public static extern bool RegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且

user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上

“[DllImport("user32.dll", SetLastError = true)]”这行语句。
“public static extern bool UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。
“public enum KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅

助键的代码而只需直接选择其名称即可。

(2)以窗体FormA为例,介绍HotKey类的使用

在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+D这三个热键。这里的Id号可任意设置,但要保证不被重复。
private void Form_Activated(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 FrmSale_Leave(object sender, EventArgs e)
{
//注销Id号为100的热键设定
HotKey.UnregisterHotKey(Handle, 100);
//注销Id号为101的热键设定
HotKey.UnregisterHotKey(Handle, 101);
//注销Id号为102的热键设定
HotKey.UnregisterHotKey(Handle, 102);
}

重载FromA中的WndProc函数
///
/// 监视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);
}

完成代码后,我们在窗体中按下Shift+S、Ctrl+B、Alt+D这三组快捷键中的任意一组时,程序都会做出响应的反应。
全部回答
你好! 各种功能键可通过代码表示,如Enter键为{ENTER}和~ Ctrl键为^ Shift键为 + 请参见 MSDN SendKeys.Send方法。 可直接保存键代码来实现。 打字不易,采纳哦!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
求经过直线3x+2y+6=0和2x+5y+7=0的交点,在两
近耳朵后到颈后的发际线那里总是长一些一粒粒
烧杯中盛有池水,其底部有生活的水绵,在温度
米多面多加盟费用多少钱
牛崎头线务站(西南门)这个地址在什么地方,我
新加坡是说什么语言
直肠癌晚期反正都是死 可以尝试换动物的肠子
质量管理的第一过程是()。A.质量计划B.质量
郑瑞良皮肤科地址有知道的么?有点事想过去
海南海花岛有旅游度假村吗?
作业本用日语怎么写?
【吸取】吸取和汲取两词之间有什么区别
卡梅罗安东尼进过东决吗?
男朋友在生活上,人际关系上,人性解读上很强大
菠萝蜜不适合什么人吃
推荐资讯
湿度百分之五十是什么意思?求解
动力车友会怎么去啊,有知道地址的么
请问沈阳新华社办理外地大学生毕业图像采集的
怎样删除APMserver文件正在被人占用
好宝宝孕婴生活馆怎么去啊,有知道地址的么
五行中属木的字有哪些
妤昕这个名字怎么样?
按照保险合同条款所使用文句的通常含义和保险
完美用英语怎么说用汉字说出来
概率问题,求详细过程假设每天有10个由北京飞
洗洋汽车装饰美容中心在哪里啊,我有事要去这
大连哪里有卖瑞士进口 瑞士莲巧克力的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?