【转】C#注册快捷键
转自: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#注册快捷键的更多相关文章
- listbox鼠标拖动数据和为button注册快捷键
将listbox1中的数据用鼠标拖动至listbox2,即有左至右. 分别对应控件注册如下事件DragEnter,MouseDown,DragDrop 代码如下: //P128 DataGridVie ...
- RegisterHotKey注册快捷键
RegisterHotKey的具体使用方使用方法如下: BOOL RegisterHotKey( HWND hWnd, //响应该热键的窗口句柄 Int id, ...
- 【Delphi】注册快捷键
ShortCutToText , TextToShortCut 需 uses Menus; type TForm1 = class(TForm) HotKey1: THotKey; Button1: ...
- nw 注册快捷键
var option = { key : "Escape", }; var shortcut = new gui.Shortcut(option); gui.App.registe ...
- C#利用WIN32实现按键注册
using System.Runtime.InteropServices; using System.Collections.Generic; using System; using System.W ...
- c# 注册全局热键
//引入系统API [DllImport("user32.dll")] static extern bool RegisterHotKey(IntPtr hWnd, int id, ...
- WPF之全局快捷键
目录 1.WPF快捷键实现方式 2.全局快捷键设置界面 3.Windows API调用 4.注册全局快捷键 5.快捷键触发 WPF快捷键实现方式 WPF快捷键实现主要有自定义快捷键命令和全局快捷键两种 ...
- C#:实现快捷键自定义设置
代码下载 C#实现快捷键自定义设置 需求 项目开发过程中,需要实现类似有道词典的软件设置中的自定义快捷键功能,如下图所示: 当我们相继按下Ctrl+Alt+M的时候,软件就会自动将快捷键显示在文本框中 ...
- 黄聪:VS2010开发如何在c#中使用Ctrl、Alt、Tab等全局组合快捷键
1.新建一个类 HotkeyHelper using System; using System.Runtime.InteropServices; using System.Windows.Forms ...
随机推荐
- iOS开发——C篇&数组与指针
2015-07-17 13:23 编辑 前面我们介绍了关于C语言的内存分配问题,下面我们就开始介绍关于C语言的两个非常重要的知识点:数组与指针 数组与指针其实不仅仅是再C语言中,再OC中(当然OC是内 ...
- 转:Hprose for php(二)——服务器
文章来自于:http://blog.csdn.net/half1/article/details/21252879 本文将介绍Hprose for php服务器的更多细节 1.发布服务 Hprose提 ...
- Ratchet(WebSockets for PHP)的官方TUTORIALS 的实践
前几天稍微看了一下Ratchet,并且实践了一下它官方例子.所以现在就将实践的过程记录下来. 在具体实践之前先将Ratchet是什么东东,要先说明一下.以下的英文是从官方copy过来的 Ratchet ...
- COJ 0332 The Flash
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=302 The Flash 难度级别:B: 运行时间限制:1000ms: 运行 ...
- [Poetize I]守卫者的挑战
描述 Description 打开了黑魔法师Vani的大门,队员们在迷宫 般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者.如果 ...
- 乱译文档--Musca介绍
胡乱翻译的,信,达,雅只能到达的水平.发现错误的话望留言好修改. 原文地址:http://aerosuidae.net/musca.html aerosuidae.net Musca 果蝇 A sim ...
- RMQ——窗口题解
题目:窗口 描述: [问题描述] 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: Window position Min val ...
- java笔记7之录入
1 为了让程序的数据更符合开发的数据,我们就加入了键盘录入. 让程序更灵活一下. 那么,我们如何实现键盘数据的录入呢? A:导包 格式: ...
- 修改上一篇文章的node.js代码,支持默认页及支持中文
服务端 app.js var app = require('http').createServer(handler) var io = require('socket.io')(app); var f ...
- JavaScript typeof obj === ‘object’ 这样写有什么问题
typeof Array, Object, new Class() 都会返回'object', 所以使用typeof不能准确的判断变量是否为object typeof []; //object ty ...