转自:http://blog.csdn.net/xiahn1a/article/details/42561015

这里需要引用到“user32.dll”。对于Win32的API,调用起来还是需要dllimport的。

我们声明一个Hotkey类,导入相应的方法。

class HotKey
{
//调用WIN32的API
[DllImport("user32.dll", SetLastError = true)]
//声明注册快捷键方法,方法实体dll中。参数为窗口句柄,快捷键自定义ID,Ctrl,Shift等功能键,其他按键。
public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
[DllImport("user32.dll", SetLastError = true)]
//注销快捷键方法的声明。
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
}

在程序开始,Windows_Loaded方法中就要对快捷键进行注册。

方法是首先获取窗口句柄。可能C#的程序员对于句柄这个概念比较陌生,因为语言的高度封装。但是因为我们调用的是Win32的方法,还是要自己一步一步去做的。

然后再注册表中注册一个键值,添加hook监听窗口事件。通过重写winproc,相应键盘快捷键。

这一部分都是Win32程序设计的内容。

/// <summary>
/// 窗体建立完成时调用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Handle = new WindowInteropHelper(this).Handle; //获取窗口句柄
RunHotKey(); //注册并监听HotKey
} /// <summary>
/// 添加快捷键监听
/// </summary>
private void RunHotKey()
{
RegisterHotKey(); //注册截图快捷键
HwndSource source = HwndSource.FromHwnd(Handle);
if (source != null)
source.AddHook(WndProc); //添加Hook,监听窗口事件
} /// <summary>
/// 注册快捷键
/// </summary>
private void RegisterHotKey()
{
//101为快捷键自定义ID,0x0002为Ctrl键, 0x0001为Alt键,或运算符|表同时按住两个键有效,0x41为A键。
bool isRegistered = HotKey.RegisterHotKey(Handle, , (0x0002 | 0x0001), 0x41);
if (isRegistered == false)
{
System.Windows.MessageBox.Show("截图快捷键Ctrl+Alt+A被占用", "警告", MessageBoxButton.OK, MessageBoxImage.Warning);
}
} /// <summary>
/// 重写WndProc函数,类型为虚保护,响应窗体消息事件
/// </summary>
/// <param name="hwnd"></param>
/// <param name="msg">消息内容</param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <param name="handled">是否相应完成</param>
/// <returns></returns>
protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
//0x0312表示事件消息为按下快捷键
case 0x0312:
CatchScreen();
break;
}
return IntPtr.Zero;
}

【转】C#注册快捷键的更多相关文章

  1. listbox鼠标拖动数据和为button注册快捷键

    将listbox1中的数据用鼠标拖动至listbox2,即有左至右. 分别对应控件注册如下事件DragEnter,MouseDown,DragDrop 代码如下: //P128 DataGridVie ...

  2. RegisterHotKey注册快捷键

    RegisterHotKey的具体使用方使用方法如下: BOOL   RegisterHotKey( HWND   hWnd,         //响应该热键的窗口句柄 Int   id,       ...

  3. 【Delphi】注册快捷键

    ShortCutToText , TextToShortCut 需 uses Menus; type TForm1 = class(TForm) HotKey1: THotKey; Button1: ...

  4. nw 注册快捷键

    var option = { key : "Escape", }; var shortcut = new gui.Shortcut(option); gui.App.registe ...

  5. C#利用WIN32实现按键注册

    using System.Runtime.InteropServices; using System.Collections.Generic; using System; using System.W ...

  6. c# 注册全局热键

    //引入系统API [DllImport("user32.dll")] static extern bool RegisterHotKey(IntPtr hWnd, int id, ...

  7. WPF之全局快捷键

    目录 1.WPF快捷键实现方式 2.全局快捷键设置界面 3.Windows API调用 4.注册全局快捷键 5.快捷键触发 WPF快捷键实现方式 WPF快捷键实现主要有自定义快捷键命令和全局快捷键两种 ...

  8. C#:实现快捷键自定义设置

    代码下载 C#实现快捷键自定义设置 需求 项目开发过程中,需要实现类似有道词典的软件设置中的自定义快捷键功能,如下图所示: 当我们相继按下Ctrl+Alt+M的时候,软件就会自动将快捷键显示在文本框中 ...

  9. 黄聪:VS2010开发如何在c#中使用Ctrl、Alt、Tab等全局组合快捷键

    1.新建一个类 HotkeyHelper  using System; using System.Runtime.InteropServices; using System.Windows.Forms ...

随机推荐

  1. 处理 InnerException 最佳方案?

    如何获取 innerException 内部错误信息 String innerMessage = (ex.InnerException != null) ? ex.InnerException.Mes ...

  2. 前端面试题第一波,要offer的看过来~

    一.HTML常见题目 01.Doctype作用?严格模式与混杂模式如何区分?它们有何意义? 02.HTML5为什么只需要写<!DOCTYPE HTML>? 03.行内元素有哪些?块级元素有 ...

  3. 转:嵌入式linux启动时运行的inittab文件

    嵌入式系统下的linux启动配置文件,不同与普通的PC linux启动配置,启动相关文件与文件的内容也要少得多.嵌入式系统下的linux启动过程一般是:     1 在bootloader中制定各种要 ...

  4. SPSS基础操作

    1.数据--排序个案(按行排序),排序变量是按列排序2.现有一文件两列,销售地区(字符串或者数字)和业绩,想按地区划分文件,可以排序个案(按销售地区),也可以选择“数据--拆分文件”(注意还是在一个文 ...

  5. poj 2513Colored Sticks

    http://poj.org/problem?id=2513 #include<cstdio> #include<cstdlib> #include<cstring> ...

  6. Windows平台下主要的内存管理途径

    new / delete   malloc / free    CoTaskMemAlloc / CoTaskMemFree    IMalloc::alloc / IMalloc/free    G ...

  7. java.lang.NoClassDefFoundError: javax/servlet/ServletContext

    方法1:把SpringBoot中main方法所在的class不再继承org.springframework.boot.context.web.SpringBootServletInitializer即 ...

  8. POJ1008 1013 1207 2105 2499(全部水题)

    做了一天水题,挑几个还算凑合的发上来. POJ1008 Maya Calendar 分析: #include <iostream> #include <cstdio> #inc ...

  9. COJ 3018 求1~n之间的素数

    求1~n之间的素数 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述  素数是大于1,且除1和本身以外不能被其他整数所整除的数. ...

  10. 【数学】HDU 5753 Permutation Bo

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 题目大意: 两个序列h和c,h为1~n的乱序.h[0]=h[n+1]=0,[A]表示A为真则为 ...