为程序设置快捷键

代码
注册系统热键 
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Utility.Form
{
    
public class HotKey
    {
        
/// <summary>
        
/// 注册系统热键
        
/// </summary>
        
/// <example>注册后,按如下方法重写WndProc方法,写入快捷键的作用
        
/// <code>
        
/// protected override void WndProc(ref Message m)
        
///{
        
///    switch (m.Msg)
        
///    {
        
///        case 0x0312: //表示按快捷键
        
///            switch (m.WParam.ToInt32())
        
///            {
        
///                case 100:
        
///                    //do something
        
///                    break;
        
///                default:
        
///                    break;
        
///             }
        
///         break;
        
///   }
        
///  base.WndProc(ref m);
        
///}
        
/// </code>
        
/// </example>
        
/// <param name="hWnd">Handle</param>
        
/// <param name="id">ID,不重复即可</param>
        
/// <param name="fsModifiers"></param>
        
/// <param name="vk"></param>
        
/// <returns>如果函数执行成功,返回值不为0。如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。</returns>
        [DllImport("user32.dll", SetLastError = true)]
        
public static extern bool RegisterHotKey(
            IntPtr hWnd,                
//要定义热键的窗口的句柄   
            int id,                     //定义热键ID(不能与其它ID重复)              
            KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效   
            Keys vk                     //定义热键的内容   
            );
        
/// <summary>
        
/// 取消注册系统热键
        
/// </summary>
        
/// <param name="hWnd">Handle</param>
        
/// <param name="id">ID</param>
        
/// <returns>取消是否成功</returns>
        [DllImport("user32.dll", SetLastError = true)]
        
public static extern bool UnregisterHotKey(
            IntPtr hWnd,                
//要取消热键的窗口的句柄   
            int id                      //要取消热键的ID   
            );

        
/// <summary>
        
/// 定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
        
/// </summary>
        [Flags()]
        
public enum KeyModifiers
        {
            None 
= 0,
            Alt 
= 1,
            Ctrl 
= 2,
            Shift 
= 4,
            WindowsKey 
= 8
        }
    }
}

这个在网上一搜,到处都是,我在窗体show时注册热键

 

代码
            Utility.Form.HotKey.RegisterHotKey(Handle, 101, Utility.Form.HotKey.KeyModifiers.None, Keys.F1);
            Utility.Form.HotKey.RegisterHotKey(Handle, 
102, Utility.Form.HotKey.KeyModifiers.None, Keys.F2);
            Utility.Form.HotKey.RegisterHotKey(Handle, 
103, Utility.Form.HotKey.KeyModifiers.Alt, Keys.A);

 

并且窗体重写WndProc方法

 

代码
protected override void WndProc(ref Message m)
        {
            
base.WndProc(ref m);
            
switch (m.Msg)
            {
                
case 0x0312//表示按快捷键
                    switch (m.WParam.ToInt32())
                    {
                        
case 101:
                            
//...
                            break;
                        
case 102:
                            
//...
                            break;
                        
case 103:
                            
//...
                            break;
                        
default:
                            
break;
                    }
                    
break;
            }
        }

 

发现已经可以使用了,但是F1,F2这些热键是系统中也要用的,一旦你的程序启动,发现其它程序的这些快捷键已经不起作用了。所以应该在窗体有焦点时才注册,离开焦点时要取消注册,也就是说在Form的Activated方法里注册,而在Deactivate时取消注册就OK了。 

 

posted @ 2010-02-26 17:36  韩天伟  阅读(581)  评论(3编辑  收藏  举报