繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> Asp.Net开发 >> To CNET:全局热键的例子,不知道有没有用

To CNET:全局热键的例子,不知道有没有用

2007-07-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:类Hotkey.cs using System; namespace Durius.Generics { public delegate void HotkeyEventHandler(int HotKeyID); /// /// System wide hotkey wrapper. /// /// Robert Jeppesen /// Send bugs to robert@du...
关键字:热键 全局 例子 CNET To

类Hotkey.cs

using System;

namespace Durius.Generics

{

public delegate void HotkeyEventHandler(int HotKeyID);

///

/// System wide hotkey wrapper.

///

/// Robert Jeppesen

/// Send bugs to robert@durius.com

///

public class Hotkey : System.Windows.Forms.IMessageFilter

{

System.Collections.Hashtable keyIDs = new System.Collections.Hashtable();

IntPtr hWnd;

///

/// Occurs when a hotkey has been pressed.

///

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 );

///

/// Constructor. Adds this instance to the MessageFilters so that this class can raise Hotkey events

///

/// A valid hWnd, i.e. form1.Handle

public Hotkey(IntPtr hWnd)

{

this.hWnd = hWnd;

System.Windows.Forms.Application.AddMessageFilter(this);

}

///

/// Register a system wide hotkey.

///

/// form1.Handle

/// Your hotkey

/// ID integer for your hotkey. Use this to know which hotkey was pressed.

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;

}

///

/// Unregister hotkeys and delete atoms.

///

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 description for Form1.

///

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;

///

/// Required designer variable.

///

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);

}

///

/// 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.

///

///

public void OnHotkey(int HotkeyID)

{

this.Activate();

if(HotkeyID == Hotkey1)

{

MessageBox.Show("WIN+1 pressed.");

}

else if(HotkeyID == Hotkey2)

{

MessageBox.Show("CTRL+2 pressed.");

}

}

///

/// Clean up any resources being used.

///

protected override void Dispose( bool disposing )

{

if( disposing )

{

hotkey.UnregisterHotkeys();

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows Form Designer generated code

///

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

///

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

///

/// The main entry point for the application.

///

[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

http://www.durius.com", "Hotkey sample");

}

}

}

责任编辑:admin
相关文章