ניתן להוריד דוגמה פועלת מכאן
האזנה למקשים במהלך ריצה של Windows
יש להוסיף את המחלקה הבאה:
לאחר מכן יש להשתמש בקוד הבא (בתוכנית עצמה):
יש להוסיף את המחלקה הבאה:
public sealed class KeyboardHook : IDisposable { // Registers a hot key with Windows. [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); // Unregisters the hot key with Windows. [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); ////// Represents the window that is used internally to get the messages. /// private class Window : NativeWindow, IDisposable { private static int WM_HOTKEY = 0x0312; public Window() { // create the handle for the window. this.CreateHandle(new CreateParams()); } ////// Overridden to get the notifications. /// /// protected override void WndProc(ref Message m) { base.WndProc(ref m); // check if we got a hot key pressed. if (m.Msg == WM_HOTKEY) { // get the keys. Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF); // invoke the event to notify the parent. if (KeyPressed != null) KeyPressed(this, new KeyPressedEventArgs(modifier, key)); } } public event EventHandlerKeyPressed; #region IDisposable Members public void Dispose() { this.DestroyHandle(); } #endregion } private Window _window = new Window(); private int _currentId; public KeyboardHook() { // register the event of the inner native window. _window.KeyPressed += delegate(object sender, KeyPressedEventArgs args) { if (KeyPressed != null) KeyPressed(this, args); }; } /// /// Register the HotKey-s combination in the system as hot key. /// /// The modifiers that are associated with the hot key (ModifierKeys. + Ctrl, Alt, Shift, Win) /// The key itself that is associated with the hot key (A, B, C, etc.) public void RegisterHotKey(ModifierKeys modifier, Keys key) { // increment the counter. _currentId = _currentId + 1; // register the hot key. if (!RegisterHotKey(_window.Handle, _currentId, (uint)modifier, (uint)key)) throw new InvalidOperationException("Couldn’t register the hot key."); } ////// A hot key has been pressed. /// public event EventHandlerKeyPressed; #region IDisposable Members public void Dispose() { // unregister all the registered hot keys. for (int i = _currentId; i > 0; i--) { UnregisterHotKey(_window.Handle, i); } // dispose the inner native window. _window.Dispose(); } #endregion } /// /// Event Args for the event that is fired after the hot key has been pressed. /// public class KeyPressedEventArgs : EventArgs { private ModifierKeys _modifier; private Keys _key; internal KeyPressedEventArgs(ModifierKeys modifier, Keys key) { _modifier = modifier; _key = key; } public ModifierKeys Modifier { get { return _modifier; } } public Keys Key { get { return _key; } } } ////// The enumeration of possible modifiers. /// [Flags] public enum ModifierKeys : uint { Alt = 1, Control = 2, Shift = 4, Win = 8 }
public Form() { InitializeComponent(); // register the event that is fired after the key press. hook.KeyPressed += new EventHandler(hook_KeyPressed); // register the control + alt + F12 combination as hot key. hook.RegisterHotKey(Key_Listener.ModifierKeys.Win | Key_Listener.ModifierKeys.Alt, Keys.D); } void hook_KeyPressed(object sender, KeyPressedEventArgs e) { // show the keys pressed in a label. label1.Text = e.Modifier.ToString() + " + " + e.Key.ToString(); this.WindowState = FormWindowState.Normal; }
אין תגובות:
הוסף רשומת תגובה