先定义一个热键类
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Runtime.InteropServices;
using
System.Windows.Forms;
namespace
ExcelReportDesigner
{
class
WinHotKey
{
public
WinHotKey()
{
}
//如果函数执行成功,返回值不为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,
Control = 2,
Shift = 4,
Windows = 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使用方法:
private
void
frmMain_Load(
object
sender, EventArgs e)
{
//注册热键Ctrl+S,Id号为100。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。
WinHotKey.RegisterHotKey(Handle, 100, WinHotKey.KeyModifiers.Control, Keys.S);
}
private
void
frmSpreadsheet_FormClosing(
object
sender, FormClosingEventArgs e)
{
WinHotKey.UnregisterHotKey(Handle, 100);
}
需要在使用的From重写WndProc方法
protected
override
void
WndProc(
ref
Message msg)
{
const
int
WM_HOTKEY = 0x0312;
//按快捷键
if
(msg.Msg == WM_HOTKEY)
{
switch
(msg.WParam.ToInt32())
{
case
100:
//按下的是Shift+S
try
{
axSpreadsheet.Export(filePath, SheetExportActionEnum.ssExportActionNone,
SheetExportFormat.ssExportAsAppropriate);
}
catch
(Exception ex)
{
MessageBox.Show(
"保存失败!"
,
"错误提示!"
, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
break
;
case
101:
//按下的是Ctrl+B
break
;
case
102:
//按下的是Alt+D
break
;
}
}
base
.WndProc(
ref
msg);
}
|
Post Comment