类Hotkey.cs
using System;
namespace Durius.Generics
{
public delegate void HotkeyEventHandler(int HotKeyID);
/// <summary>
/// System wide hotkey wrapper.
///
/// Robert Jeppesen
/// Send bugs to
/// </summary>
public class Hotkey : System.Windows.Forms.IMessageFilter
{
System.Collections.Hashtable keyIDs = new System.Collections.Hashtable();
IntPtr hWnd;
/// <summary>
/// Occurs when a hotkey has been pressed.
/// </summary>
public event HotkeyEventHandler OnHotkey;
public enum KeyFlags
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern UInt32 RegisterHotKey( IntPtr hWnd, UInt32 id,
UInt32 fsModifiers, UInt32 vk);
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern UInt32 UnregisterHotKey( IntPtr hWnd, UInt32 id);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern UInt32 GlobalAddAtom( String lpString );
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern UInt32 GlobalDeleteAtom( UInt32 nAtom );
/// <summary>
/// Constructor. Adds this instance to the MessageFilters so that this class can raise Hotkey events
/// </summary>
/// <param name="hWnd">A valid hWnd, i.e. form1.Handle</param>
public Hotkey(IntPtr hWnd)
{
this.hWnd = hWnd;
System.Windows.Forms.Application.AddMessageFilter(this);
}
/// <summary>
/// Register a system wide hotkey.
/// </summary>
/// <param name="hWnd">form1.Handle</param>
/// <param name="Key">Your hotkey</param>
/// <returns>ID integer for your hotkey. Use this to know which hotkey was pressed.</returns>
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;
}
/// <summary>
/// Unregister hotkeys and delete atoms.
/// </summary>
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) /*WM_HOTKEY*/
{
if(OnHotkey != null)
{
foreach (UInt32 key in keyIDs.Values)
{
if((UInt32)m.WParam == key)
{
OnHotkey((int)m.WParam);
return true;
}
}
}
}
return false;
}
}
}
测试程序Form1.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Durius.Generics;
namespace TestGenerics
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
Hotkey hotkey;
int Hotkey1;
int Hotkey2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
/*
* Initialize our hotkeys. Pass in a handle to the main form in the constructor,
* then call RegisterHotkey for each of our hotkey combinations and wire up
* the event
*/
hotkey = new Hotkey(this.Handle);
Hotkey1 = hotkey.RegisterHotkey(System.Windows.Forms.Keys.D1, Hotkey.KeyFlags.MOD_WIN);
Hotkey2 = hotkey.RegisterHotkey(System.Windows.Forms.Keys.D2, Hotkey.KeyFlags.MOD_CONTROL);
hotkey.OnHotkey += new HotkeyEventHandler(OnHotkey);
}
/// <summary>
/// The hotkey event handler. If you have several hotkeys, you will have to check
/// which one was pressed using HotkeyID.
/// RegisterHotkey returns the HotkeyID that was assigned to your hotkey.
/// </summary>
/// <param name="HotkeyID"></param>
public void OnHotkey(int HotkeyID)
{
this.Activate();
if(HotkeyID == Hotkey1)
{
MessageBox.Show("WIN+1 pressed.");
}
else if(HotkeyID == Hotkey2)
{
MessageBox.Show("CTRL+2 pressed.");
}
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
hotkey.UnregisterHotkeys();
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.Location = new System.Drawing.Point(16, 8);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(200, 16);
this.label1.TabIndex = 0;
this.label1.Text = "Hotkeys:";
//
// label2
//
this.label2.Location = new System.Drawing.Point(16, 32);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(208, 16);
this.label2.TabIndex = 1;
this.label2.Text = "Win + 1";
//
// label3
//
this.label3.Location = new System.Drawing.Point(16, 56);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(208, 16);
this.label3.TabIndex = 2;
this.label3.Text = "Ctrl + 2";
//
// button1
//
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button1.Location = new System.Drawing.Point(88, 80);
this.button1.Name = "button1";
this.button1.TabIndex = 3;
this.button1.Text = "About";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(168, 123);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.button1,
this.label3,
this.label2,
this.label1});
this.Name = "Form1";
this.Text = "Hotkey";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show(this, "System wide hotkey wrapper
- Robert Jeppesen
", "Hotkey sample");
}
}
}
To CNET:全局热键的例子,不知道有没有用
80酷酷网 80kuku.com