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

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, 100, 2, Keys.Left); // 热键一:Control +光标左箭头
 RegisterHotKey(Handle, 200, 2, Keys.Right); / /热键一:Control +光标右箭头
 RegisterHotKey(Handle, 300, 2, Keys.Up); // 热键一:Control +光标上箭头
 RegisterHotKey(Handle, 400, 2, 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#程序中使用系统热键的整个过程。

时间: 2024-11-29 20:18:29

在Visual C#程序中使用系统热键的相关文章

eclipse-java程序中注册系统级热键之dll问题

问题描述 java程序中注册系统级热键之dll问题 我下载了jintellitype-1.3.1.jar后,把JIntellitype.dll复制到了C:WINDOWSsystem32下,然后在eclipse工程名在点击右键--属性--Java构建路径--库--添加外部jar,然后把jintellitype-1.3.1.jar添加到工程中,编译后还是发生错误: 信息: Loading JIntellitype DLL Exception in thread "main" com.mel

java Swing中屏蔽系统热键

问题描述 我要用javaSwing做类似网吧管理系统一样,具有和系统一样的锁屏功能,除了关机和输入正确的口令.什么都不能做.我现在已经实现以一部分,但是几个系统热键没有屏蔽所以还是能退出来.所以我想问一下在程序里面捕获到了用户的按键事件后怎么把系统带的热键功能屏蔽. 解决方案 解决方案二:http://topic.csdn.net/u/20090715/09/59336412-1626-45e5-9624-5961ec5fe6ea.html解决方案三:好像先要获取用户按下的键然后在根据用户按下的

java程序中注册系统级热键之dll问题

问题描述 我下载了jintellitype-1.3.1.jar后,把JIntellitype.dll复制到了C:WINDOWSsystem32下,然后在eclipse工程名在点击右键--属性--Java构建路径--库--添加外部jar,然后把jintellitype-1.3.1.jar添加到工程中,编译后还是发生错误:信息:LoadingJIntellitypeDLLExceptioninthread"main"com.melloware.jintellitype.JIntellity

EXCEL窗口在Visual Basic窗口中显示技巧

Visual http://www.aliyun.com/zixun/aggregation/11183.html">Basic是常用的应用软件开发工具之一,由于Visual Basic的报表功能有限,而且一但报表格式发生变化,就得相应修改程序,给应用软件的维护工作带来极大的不便.因此有很多程序员现在已经充分利用EXECL的强大报表功来实现报表功能.但由于Visual Basic与EXCEL由于分别属于不同的应用系统,如何把它们有机地结合在一起,是一个值得我们研究的课题. 一. Visua

在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序

原文 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 Jim Nakashima.Hani Atassi 和 Danny Thorpe 将应用程序或服务部署到 Microsoft 云服务平台 Windows Azure 的原因有很多.例如,只为使用的内容付费从而可降低操作和硬件成本.构建几乎能无限缩放的应用程序.巨大的存储容量.地理位置等等,不胜枚举. 只有

Visual Studio 2008 中程序路径配置 .

Visual Studio 2008 环境变量的配置(改为:Visual Studio 2008 中程序路径配置  更合理) 在调试 Visual Studio 2008 程序时,经常有一些动态链接库(即 dll 文件)需要加载到工程里,这样才能依赖第三方库进行程序调试. 这些动态链接库,往往都是测试版本或是开发中的版本,或者会有若干个版本:这个时候,如果直接把 dll 所在目录加到 PATH 里,则会有潜在冲突的危险:如果直接拷贝到 Visual Studio 的目录下,假如测试工程太多,每次

ASP.NET 5系列教程 (五):在Visual Studio 2015中使用Grunt、Bower开发Web程序

基于Visual Studio 2015,你可以: 方便的管理前端包,如jQuery, Bootstrap, 或Angular. 自动运行任务,如LESS.JavaScript压缩.JSLint.JavaScript单元测试等. 方便的获得Web开发者生态圈的工具包. 为了实现这些场景,Visual Studio 2015已经内置了一些流行的第三方工具包: Bower:Web包管理器,Bower可以帮你安装前端包,包括JavaScript.CSS类库.对于服务器端包,请通过NuGet包管理. G

C#中调用API函数RegisterHotKey注册多个系统热键

函数 要设置快捷键必须使用user32.dll下面的两个方法. BOOL RegisterHotKey( //注册系统热键的API函数 HWND hWnd, int id, UINT fsModifiers, UINT vk );  BOOL UnregisterHotKey( //删除系统热键的API函数 HWND hWnd, int id );  在C#中引用命名空间System.Runtime.InteropServices;来加载非托管类user32.dllusing System;us

在Visual Studio 2008中编译F#程序

在Visual Studio 2008中,编译F#程序时,会出现警告(但不是错误),但是由于这个警告却使你的程序无法运行,不过大多数据这些警告都会有提示,提示你用.NET里的函数代替F#中的某些函数,但是这些.NET中的函数又不能像在C#中那样使用. 例如: #light let one = ["one "] let two = "two " :: one let three = "three " :: two let rightWayRound