由于.Net没有提供专门的类库处理热键,所以需要直接调用windows API来解决。

HotKey为.NET调用Windows API的封装代码,主要是RegisterHotKey和UnregisterHotKey

    class HotKey
{
/// <summary>
/// 如果函数执行成功,返回值不为0。
/// 如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。.NET方法:Marshal.GetLastWin32Error()
/// </summary>
/// <param name="hWnd">要定义热键的窗口的句柄</param>
/// <param name="id">定义热键ID(不能与其它ID重复) </param>
/// <param name="fsModifiers">标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效</param>
/// <param name="vk">定义热键的内容,WinForm中可以使用Keys枚举转换,
/// WPF中Key枚举是不正确的,应该使用System.Windows.Forms.Keys枚举,或者自定义正确的枚举或int常量</param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd,
int id,
KeyModifiers fsModifiers,
int vk
);
/// <summary>
/// 取消注册热键
/// </summary>
/// <param name="hWnd">要取消热键的窗口的句柄</param>
/// <param name="id">要取消热键的ID</param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd,
int id
);
/// <summary>
/// 向全局原子表添加一个字符串,并返回这个字符串的唯一标识符,成功则返回值为新创建的原子ID,失败返回0
/// </summary>
/// <param name="lpString"></param>
/// <returns></returns>
[DllImport("kernel32", SetLastError = true)]
public static extern short GlobalAddAtom(string lpString);
[DllImport("kernel32", SetLastError = true)]
public static extern short GlobalDeleteAtom(short nAtom);
/// <summary>
/// 定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
/// </summary>
[ComVisible(true)]
[Flags]
[TypeConverter(typeof(KeysConverter))]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
}

  Windows Form中调用代码

        private void Form1_Activated(object sender, EventArgs e)
{
HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt | HotKey.KeyModifiers.Ctrl, Keys.S);
HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S); } private void Form1_Leave(object sender, EventArgs e)
{
HotKey.UnregisterHotKey(Handle, 102);
HotKey.UnregisterHotKey(Handle, 100);
} ///
/// 监视Windows消息
/// 重载WndProc方法,用于实现热键响应
///
///
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;//如果m.Msg的值为0x0312那么表示用户按下了热键
//按快捷键
switch (m.Msg)
{
case WM_HOTKEY:
switch (m.WParam.ToInt32())
{
case 100: //按下的是Shift+S
//此处填写快捷键响应代码
MessageBox.Show("按下的是Shift+S");
break;
case 101: //按下的是Ctrl+B
//此处填写快捷键响应代码
break;
case 102: //按下的是Ctrl+Alt+S
CaptureImageTool capture = new CaptureImageTool(); if (capture.ShowDialog() == DialogResult.OK)
{
Image image = capture.Image;
pictureBox1.Width = image.Width;
pictureBox1.Height = image.Height;
pictureBox1.Image = image;
}
break;
}
break;
}
base.WndProc(ref m);
}

  WPF中窗口句柄需要借助WindowInteropHelper来得到,处理函数的加入和Winform不同,需要HwndSource来添加处理函数。

        void MainWindow_Unloaded(object sender, RoutedEventArgs e)
{
UnRegisterHotKey();
} void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
RegisterHotKey();
} private void UnRegisterHotKey()
{
IntPtr handle = new WindowInteropHelper(this).Handle;
int id = 1000;
bool r = HotKey.UnregisterHotKey(handle, id); HotKey.UnregisterHotKey(handle, 102);
HotKey.UnregisterHotKey(handle, 100);
} private void RegisterHotKey()
{
IntPtr handle = new WindowInteropHelper(this).Handle;
int id = 1000;
bool r = HotKey.RegisterHotKey(handle, id, HotKey.KeyModifiers.Ctrl, (int)System.Windows.Forms.Keys.F12); HotKey.RegisterHotKey(handle, 102, HotKey.KeyModifiers.Alt | HotKey.KeyModifiers.Ctrl, (int)Keys.S);
HotKey.RegisterHotKey(handle, 100, HotKey.KeyModifiers.Shift, (int)Keys.S); //获得消息源
System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd(handle); source.AddHook(HotKeyHook);
}
static private IntPtr HotKeyHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
//热键处理过程
{
const int WM_HOTKEY = 0x0312;//如果m.Msg的值为0x0312那么表示用户按下了热键
if (msg == WM_HOTKEY)
{
switch (wParam.ToInt32())
{
case 100: //按下的是Shift+S
//此处填写快捷键响应代码
MessageBox.Show("按下的是Shift+S");
break;
case 101: //按下的是Ctrl+B
//此处填写快捷键响应代码
break;
case 102: //按下的是Ctrl+Alt+S
break;
}
}
return IntPtr.Zero;
}

  

WinForm和WPF中注册热键的更多相关文章

  1. 在Winform或WPF中System.Diagnostics.Process.Start的妙用

    原文:在Winform或WPF中System.Diagnostics.Process.Start的妙用 我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑 ...

  2. GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件

    GMap.NET是什么? 来看看它的官方说明:GMap.NET is great and Powerful, Free, cross platform, open source .NET contro ...

  3. GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发

    在做地理位置相关的开发时,总是面临高额地图引擎费用让大部分用户望而却步,加之地图数据又是天价,那么GMap.NET就是首选了,它本身就是开源免费,服务器可以在本地缓存,以后访问时就可以直接访问. 可以 ...

  4. [C#] 使 ToolTip 一直显示 (在 WinForm 与 WPF 中的差异解决方案)

    需求 自己绘制的UI,检测鼠标位置,适时显示出 ToolTip 1 WinForm 的 ToolTip // Member define: private ToolTip _toolTip = new ...

  5. C# 在winform或者wpf中显示控制台窗口

    这儿需要使用两个系统函数: BOOL WINAPI FreeConsole(void); //// 关闭控制台窗口,参考:http://msdn.microsoft.com/en-us/library ...

  6. 基于Winform、WPF等的客户端文件下载

    有时候,我们用C#写一些客户端应用程序需要从服务器下载一些资源,如图片.dll.配置文件等.下面就来说一下,在Winform及WPF中如何下载文件. 我们的资源大多放在自己的网站上,或者从其他网站下载 ...

  7. WPF注册热键后处理热键消息(非winform方式)

    由于最近在做wpf版的截图软件,在处理全局热键的时候,发现国内博客使用的都是winform窗体的键盘处理方式,此方式需要使用winform的动态库,如此不协调的代码让我开始在github中寻找相关代码 ...

  8. Winform/WPF中内嵌BeetleX的HTTP服务

    在新版本的BeetleX.FastHttpApi加入了对netstandard2.0支持,如果程序基于.NetFramework4.6.1来构建WinForm或WPF桌面程序的情况下可以直接把Beet ...

  9. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

随机推荐

  1. Mysql和ORACLE索引的实现方式

    B-Tree和B+Tree 目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构. 首先,对单个节点来说,是一个key value结构,key是作引的列,value有两种, ...

  2. 模拟客户端向服务器发起请求(从Fiddler抓包到Jmeter接口测试)

    一.安装Fiddler 二.配置 在菜单栏Tools->Fiddler Options->Connections,勾选Allow remote computers to connect,默 ...

  3. Java程序员必备的一些流程图

    Java程序员必备的一些流程图 转自https://juejin.im/post/5d214639e51d4550bf1ae8df 前言: 整理了一些Java基础流程图/架构图,做一下笔记,大家一起学 ...

  4. params修饰符的用法

    params修饰符是用来声明参数数组允许向方法传递数量不定的自变量用的.事实上System.Console 类的 Write 和 WriteLine 方法是参数数组用法的典型示例.他们的声明方式如下: ...

  5. git的安装教程

    团队开发的时候常要用到git来对代码进行管理,平时开发的时候也需要使用git来做一些事情,如给vue项目进行代码编译等等. 那下面我们开始 一.安装和配置环境 首先下载git安装包(去官网下载,htt ...

  6. QT:如何重新生成makefile文件

  7. UVA 11181 Possibility Given

    #include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> ...

  8. POJ1703--Find them, Catch them(种类并查集)

    Time Limit: 1000MSMemory Limit: 10000K Total Submissions: 32909Accepted: 10158 Description The polic ...

  9. Win10上安装Awvs 12原版程序和完美破解补丁详细步骤

    环境: Win10 Awvs12安装包 链接:https://pan.baidu.com/s/1FIwYHIEKfLf4XAyeXfhVnA 提取码:6sa8 复制这段内容后打开百度网盘手机App,操 ...

  10. MongoDB数据库的基本操作命令

    启动服务 net start mongodb 使用 登录本机mongodb Mongodb服务启动之后,打开命令行工具. 登录 mongo 127.0.0.1:27017 27017是mongodb的 ...