(转载) 在C#程序中实现热键

原创 2007年09月13日 06:39:00

在C#程序中使用系统热键

作者: 周建东  日期: 2007-08-20 13:19

1.首先引入System.Runtime.InteropServices
using System.Runtime.InteropServices;

2.在类内部声明两个API函数,它们的位置和类的成员变量等同.

 

[System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函数
public static extern bool RegisterHotKey(
IntPtr hWnd, 
// handle to window
int id, // hot key identifier
uint fsModifiers, // key-modifier options
Keys vk // virtual-key code
);

[System.Runtime.InteropServices.DllImport(
"user32.dll")] //申明API函数
public static extern bool UnregisterHotKey(
IntPtr hWnd, 
// handle to window
int id // hot key identifier
);

3.定义一个KeyModifiers的枚举,以便出现组合键

public enum KeyModifiers
...{
None 
= 0,
Alt 
= 1,
Control 
= 2,
Shift 
= 4,
Windows 
= 8
}


4.在类的构造函数出注册系统热键

示例,下例注册了四个热键:

public MainForm()
...{
InitializeComponent();

RegisterHotKey(Handle, 
1002, Keys.Left); // 热键一:Control +光标左箭头
RegisterHotKey(Handle, 2002, Keys.Right); / /热键一:Control +光标右箭头
RegisterHotKey(Handle, 
3002, Keys.Up); // 热键一:Control +光标上箭头
RegisterHotKey(Handle, 4002, Keys.Down); // 热键一:Control +光标下箭头

....;
}


5.重写WndProc()方法,通过监视系统消息,来调用过程

示例:

protected override void WndProc(ref Message m)//监视Windows消息
...{
const int WM_HOTKEY = 0x0312//如果m.Msg的值为0x0312那么表示用户按下了热键
switch (m.Msg)
...{
case WM_HOTKEY:
ProcessHotkey(m); 
//按下热键时调用ProcessHotkey()函数
break;
}


base.WndProc(ref m); //将系统消息传递自父类的WndProc
}


5.不用说,我们接下来需要实现ProcessHotkey函数:

//按下设定的键时调用该函数

private void ProcessHotkey(Message m)
...{
IntPtr id 
= m.WParam; //IntPtr用于表示指针或句柄的平台特定类型
//MessageBox.Show(id.ToString());
string sid = id.ToString();
switch (sid)
...{
case "100": DecreseVolumnb(); break// 按下Control +光标左箭头,调用函数DecreseVolumnb();
case "200": AddVolumnb(); break// 按下Control +光标右箭头,调用函数AddVolumnb()
case "300":// 按下Control +光标上箭头,显示窗体
this.Visible = true;
break;
case "400":// 按下Control +光标下箭头,隐藏窗体
this.Visible = false;
break;
}

}


很明显接下来分别实现函数DecreseVolumnb(); 和AddVolumnb(); 即可.

6.最后别忘了在程序退出时取消热键的注册

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
...{
UnregisterHotKey(Handle, 
100); //卸载第1个快捷键
UnregisterHotKey(Handle, 200); //缷载第2个快捷键
UnregisterHotKey(Handle, 300); //卸载第3个快捷键
UnregisterHotKey(Handle, 400); //缷载第4个快捷键
}


以上就是在C#程序中使用系统热键的整个过程
 

C#全局热键设置与窗体热键设置实例

1、窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyDown事件,如...
  • cuoban
  • cuoban
  • 2016年02月26日 16:16
  • 3383

C#实现全局快捷键(系统热键)响应(转)

在应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。 (1)建立一个类文件,命名为HotKey.cs,代码如下:...
  • zxj19951029
  • zxj19951029
  • 2014年10月18日 23:43
  • 455

【转载】C#窗体热键与全局热键设置

声明:本文为转载,非原创,如有侵权,请告知,本人会尽快删除。 原文地址:http://www.jb51.net/article/56625.htm 本文实例讲述了C#全局热键设...
  • zhd18
  • zhd18
  • 2016年10月17日 00:10
  • 138

WPF的热键实现

项目开发中,需要实现对于热键的支持,实际上有两种方案来实现,一种是采用WPF的方式,即命令绑定,利用InputBinding实现ICommand的快捷键绑定处理,另一种是调用系统API注册热键的方式....
  • u013376417
  • u013376417
  • 2015年03月13日 13:56
  • 1590

Windows编程实现自定义全局热键

一、实现全局热键主要使用以下API(详情查看MSDN):- 获取热键标识:GlobalAddAtom - 注册热键:RegisterHotKey - 注销热键:UnregisterHotKey - 释...
  • zhoufuxinzfx
  • zhoufuxinzfx
  • 2016年03月09日 16:22
  • 2839

c# 文本框纪录快捷键并处理冲突的系统热键

/// /// 取消该事件执行 /// /// /// private void txtShortRunagai...
  • fuweiping
  • fuweiping
  • 2016年04月07日 18:54
  • 721

C#屏蔽系统热键Ctrl+Alt+Delete的代码尝试。

最近在做一款小软件,需要锁定用户的输入,包括系统热键(Ctrl+Alt+Delete),在网络中寻找良久,发现这些不错的代码。 经过仔细整理,现将这些代码公布,有兴趣的拿去用用。 搜集的过程有些艰...
  • llw01
  • llw01
  • 2013年07月15日 15:45
  • 1901

c#实现热键功能

C# + HotKey 注意:热键和快捷键是整合在一起的 应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。 (1)...
  • dragonpeng2008
  • dragonpeng2008
  • 2014年05月26日 09:17
  • 457

如何实现全局热键

要实现系统范围内的热键
  • wwkaven
  • wwkaven
  • 2014年06月14日 12:39
  • 2286

现学现用 - C++监视热键源代码

和易语言的功能差不多 没用线程和动态数组 int 监视热键(子程序指针 响应事件, /*响应事件(热键标识, 其它...), 事件参数数目不限!如果再次监视热键将响应事件!*/ 整数型 键代...
  • asaqlp
  • asaqlp
  • 2016年06月14日 17:17
  • 1567
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(转载) 在C#程序中实现热键
举报原因:
原因补充:

(最多只允许输入30个字)