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


所属类别:.NET

文章作者:佚名

特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!


类Hotkey.csusing 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.Handlepublic 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.csusing 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 Jeppesenhttp://www.durius.com", "Hotkey sample");} }} 关闭本页

相关信息

· Gzip Zlib PNG 压缩算法,源码详解

·  rails中的多态关联

· Apache自带性能测试工具ab的使用

·  IT从业人员必看的10个论坛








....

64257 4563