【转】 c#注册全局快捷键

早上一来看到园子里有篇文章是说注册快捷键,一看用的是hook,好多的代码,下面是我以前用的代码:


 

代码
using System;   
using System.Runtime.InteropServices;   
  
namespace SystemHotKey   
{   
    
public delegate void HotkeyEventHandler(int HotKeyID);   
  
    
public class Hotkey : System.Windows.Forms.IMessageFilter   
    {   
        System.Collections.Hashtable keyIDs 
= new System.Collections.Hashtable();   
        IntPtr hWnd;   
  
        
public event HotkeyEventHandler OnHotkey;   
  
        
public enum KeyFlags   
        {   
            MOD_ALT 
= 0x1,   
            MOD_CONTROL 
= 0x2,   
            MOD_SHIFT 
= 0x4,   
            MOD_WIN 
= 0x8   
        }   
        [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);   
  
        
public Hotkey(IntPtr hWnd)   
        {   
            
this.hWnd = hWnd;   
            System.Windows.Forms.Application.AddMessageFilter(
this);   
        }   
  
        
public int RegisterHotkey(System.Windows.Forms.Keys Key, KeyFlags keyflags)   
        {   
            UInt32 hotkeyid 
= GlobalAddAtom(System.Guid.NewGuid().ToString());   
            RegisterHotKey((IntPtr) hWnd, hotkeyid, (UInt32) keyflags, (UInt32) Key);   
            keyIDs.Add(hotkeyid, hotkeyid);   
            
return (int) hotkeyid;   
        }   
  
        
public void UnregisterHotkeys()   
        {   
            System.Windows.Forms.Application.RemoveMessageFilter(
this);   
            
foreach (UInt32 key in keyIDs.Values)   
            {   
                UnregisterHotKey(hWnd, key);   
                GlobalDeleteAtom(key);   
            }   
        }   
  
        
public bool PreFilterMessage(ref System.Windows.Forms.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;   
        }   
    }   
}  
using System;
using System.Runtime.InteropServices;

namespace SystemHotKey
{
    
public delegate void HotkeyEventHandler(int HotKeyID);

    
public class Hotkey : System.Windows.Forms.IMessageFilter
    {
        System.Collections.Hashtable keyIDs 
= new System.Collections.Hashtable();
        IntPtr hWnd;

        
public event HotkeyEventHandler OnHotkey;

        
public enum KeyFlags
        {
            MOD_ALT 
= 0x1,
            MOD_CONTROL 
= 0x2,
            MOD_SHIFT 
= 0x4,
            MOD_WIN 
= 0x8
        }
        [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);

        
public Hotkey(IntPtr hWnd)
        {
            
this.hWnd = hWnd;
            System.Windows.Forms.Application.AddMessageFilter(
this);
        }

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

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

        
public bool PreFilterMessage(ref System.Windows.Forms.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;
        }
    }


 

该类的使用方法:

在窗体的类中声明一个变量
private int Hotkey1
在窗体的Load事件中加入如下代码

 

代码
Hotkey hotkey;   
hotkey 
= new Hotkey(this.Handle);   
  
//定义快键(Ctrl + F1)   
Hotkey1 = hotkey.RegisterHotkey(System.Windows.Forms.Keys.F1, Hotkey.KeyFlags.MOD_CONTROL);   
hotkey.OnHotkey 
+= new HotkeyEventHandler(OnHotkey);   
添加快键调用函数    
public void OnHotkey(int HotkeyID)   
{   
    
if (HotkeyID == Hotkey1)   
    {   
        
if (this.Visible == true)   
            
this.Visible = false;   
        
else  
            
this.Visible = true;   
    }   
    
else  
    {   
        
this.Visible = false;   
    }   
}  

 

 

转载:http://blog.csdn.net/sohighthesky/archive/2010/05/20/5610274.aspx

posted @ 2010-05-20 15:26  Treenew Lyn  阅读(590)  评论(0编辑  收藏  举报