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

1、新建一个类 HotkeyHelper 

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Collections;

namespace 黄聪
{
    public delegate void HotkeyEventHandler(int hotKeyID);

    public class HotkeyHelper : IMessageFilter
    {
        public event HotkeyEventHandler OnHotkey;

        public enum KeyFlags
        {
            MOD_ALT = 0x1,
            MOD_CONTROL = 0x2,
            MOD_SHIFT = 0x4,
            MOD_WIN = 0x8
        }

        class NativeMethods
        {
            private NativeMethods() { }

            #region WIN32 API

            [DllImport("user32.dll")]
            public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk);

            [DllImport("user32.dll")]
            public static extern UInt32 UnregisterHotKey(IntPtr hWnd, UInt32 id);

            [DllImport("kernel32.dll")]
            public static extern UInt32 GlobalAddAtom(String lpString);

            [DllImport("kernel32.dll")]
            public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom);

            #endregion
        }

        Hashtable keyIDs = new Hashtable();
        IntPtr hWnd;

        public HotkeyHelper(IntPtr hWnd)
        {
            this.hWnd = hWnd;
            Application.AddMessageFilter(this);
        }

        public int RegisterHotkey(Keys Key, KeyFlags keyflags)
        {
            UInt32 hotkeyid = NativeMethods.GlobalAddAtom(System.Guid.NewGuid().ToString());
            NativeMethods.RegisterHotKey((IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key);
            keyIDs.Add(hotkeyid, hotkeyid);
            return (int)hotkeyid;
        }

        public void UnregisterHotkeys()
        {
            Application.RemoveMessageFilter(this);
            foreach (UInt32 key in keyIDs.Values)
            {
                NativeMethods.UnregisterHotKey(hWnd, key);
                NativeMethods.GlobalDeleteAtom(key);
            }
        }

        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == 0x312)
            {
                if (OnHotkey != null)
                {
                    foreach (UInt32 key in keyIDs.Values)
                    {
                        if ((UInt32)m.WParam == key)
                        {
                            OnHotkey((int)m.WParam);
                            return true;
                        }
                    }
                }
            }

            return false;
        }
    }
}

2、在窗口创建(FrmMain_Load)的时候注册快捷键

private void FrmMain_Load(object sender, EventArgs e)
{
    hotkeyHelper = new HotkeyHelper(this.Handle);
    int favKey = hotkeyHelper.RegisterHotkey(Keys.F, HotkeyHelper.KeyFlags.MOD_CONTROL); //注册Ctrl+F
    int nextKey = hotkeyHelper.RegisterHotkey(Keys.G, HotkeyHelper.KeyFlags.MOD_CONTROL);//注册Ctrl+G
    hotkeyHelper.OnHotkey += new HotkeyEventHandler(OnHotkey);
}

3、热键的响应方法

private void OnHotkey(int hotkeyID)
{
    if (hotkeyID == favKey)
    {
        //do something
    }
    else if (hotkeyID == nextKey)
    {
        //do something else
    }
}

4、当然在窗体关闭的时候,一定要注销掉快捷键

private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
    hotkeyHelper.UnregisterHotkeys();
}
时间: 2024-08-08 01:04:25

黄聪:VS2010开发如何在c#中使用Ctrl、Alt、Tab等全局组合快捷键的相关文章

linux中禁用Ctrl+Alt+Delete的配置方法

由于默认linux开启了Ctrl+Alt+Delete功能,如果不小心按了Ctrl+Alt+Delete,系统就会重启,业务自然就中断了,非常不安全,可通过下面方法禁用此功能. vim打开配置文件 vim /etc/init/control-alt-delete.conf 输入i 关闭Ctrl+Alt+Delete功能 只需要在start on control-alt-delete前加上#就可以了.注释掉这行就可关闭此功能. 输入:wq 退出 配置文件更改前如下图: 配置文件更改后如下图:

idea中ctrl+alt+方向键问题

在idea中使用ctrl+b跟踪进入函数之后,每次返回都不知道用什么快捷键,在idea中使用ctrl+alt+方向键首先会出现与win7屏幕方向的快捷键冲突,右键桌面,选择图形属性,将win7的快捷键关闭. 但是使用快捷键一直都没有反应,尝试杀掉igfxHK.exe进程,看看是否会恢复,然后可以考虑用rundll32.exe复制一份替换掉这个垃圾文件.

Eclipse中快捷键Ctrl + Alt + 向上箭头 或者 Ctrl + Alt + 向下箭头与Windows冲突

原文地址:https://blog.csdn.net/buaaroid/article/details/50804608 clipse中按ctrl + alt + 向上箭头没有任何反应,按ctrl + alt + 向下箭头windows的整个屏幕都倒转过来了,请大家帮忙解决一下 Eclipse原本快捷键定义:ctrl + alt + 向上箭头是向上复制一行ctrl + alt + 向上箭头是向下复制一行 解决方案:这是英特尔图形和媒体控制面板.这个是英特尔集成显卡的设置面板 可以设置分辨率 特性

安卓开发_WebView如何在Fragment中使用

之前学习了如何在activity中使用WebView控件来显示网页. 在我的实际开发中,有需要在Fragment中用到WebView控件的,那么就百度学习了一下 其实很简单,但是当然不是和在Activity中使用的方法一样 具体看代码 1 package com.example.qunxiong; 2 3 import android.os.Bundle; 4 import android.support.v4.app.Fragment; 5 import android.view.Layout

黄聪:WordPress 多站点建站教程(六):使用WP_Query、switch_to_blog函数实现获取子站点分类中的文章

首先在你使用主题的funtions.php里面添加下代码: //根据时间显示最新的分类文章内容,每个站点显示一篇内容 //$blog_id 子站点ID //$catid 分类ID wp_reset_query(); switch_to_blog($blog_id); global $post;?> $my_query2 = new WP_Query('showposts=1&order=desc&orderby=date&cat='.$catid); while ($my_q

如何在Delphi中调用VC6.0开发的COM

上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过.但是调用就会出现问题,(在VC下调用也是一样的出现).但是用Delphi写的接口程序编译后,不管是在VC下还是在Delphi下调用都没有问题.后来我把VC开发的接口程序编译后,拷贝到其它机子上试,怪事,完全没有问题了.总结后才知道是我机子有点问题.我到现在还没有解决为什么在我的机子上不行,在其它机子

黄聪:《跟黄聪学WordPress主题开发》

又一个作品完成!<跟黄聪学Wordpress主题开发>,国内最好的Wordpress主题模版开发视频教程!! 目录预览: WordPress官方源文件层式结构讲解 WordPress数据库表结构.字段详解 WordPress主题模版加载过程 WordPress主题模版开发:主题模版的安装及创建 WordPress主题模版开发:首页模版及调用options表数据 WordPress主题模版开发:如何循环输出文章列表 WordPress主题模版开发:文章元数据及多语言化 WordPress主题模版

如何在Eclipse中安装PDT插件来开发PHP

之前查过很多PDT的安装方法,60%都是让人直接安装All-in-one的PHP eclipse版本,纯属让人无语,而有些给出的PDT安装链接无法正确下载插件,对此,给出了我安装过的PDT插件下载地址:http://download.eclipse.org/tools/pdt/updates/3.3/ 安装方法: 1. 点击 help-> install new software 2. 在 work with 输入框里复制上面地址,然后在下面的 name 显示框中选择第一种插件:PHP Deve

Android开发如何在4.0及以上系统中自定义TitleBar

本文将通过一个实例讲解怎么实现在4.0及以上系统版本中实现自定义TitleBar,这只是我自己找到的一种方法; xml布局文件 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="m