Как сделать глобальный хоткей для программы? - C#
Формулировка задачи:
Здравствуйте!
Задачка такая - при нажатии Alt+X программа должна выдать MessageBox с каким-то текстом!
На данный момент у меня есть вот такой код:
Сообщение появляется но ТОЛЬКО если окно программы активно! Сложность в том, что данный хоткей должен работать когда программа работает даже в свернутом виде! Как это сделать?
Листинг программы
- private void Form1_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.KeyCode == Keys.X && e.Alt)
- {
- MessageBox.Show("123");
- }
- }
Решение задачи: «Как сделать глобальный хоткей для программы?»
textual
Листинг программы
- using System;
- using System.ComponentModel;
- using System.Runtime.InteropServices;
- using System.Windows.Forms;
- public sealed class HotKey : IMessageFilter, IDisposable
- {
- public event KeyEventHandler HotKeyPressed;
- private readonly int _id;
- #region Native win32 API
- private const int WmHotKey = 0x0312;
- [DllImport("user32.dll", SetLastError = true)]
- private static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
- [DllImport("user32.dll", SetLastError = true)]
- private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
- [Flags]
- public enum KeyModifiers
- {
- None = 0,
- Alt = 1,
- Control = 2,
- Shift = 4,
- Windows = 8
- }
- #endregion
- public event EventHandler KeyChanged;
- public event EventHandler KeyModifierChanged;
- private IntPtr _handle;
- public IntPtr Handle
- {
- get { return _handle; }
- set { _handle = value; }
- }
- private Keys _key;
- private KeyModifiers _keyModifier;
- private bool _isKeyRegisterd;
- public HotKey()
- {
- _id = GetHashCode();
- Application.AddMessageFilter(this);
- }
- ~HotKey()
- {
- Dispose();
- }
- public void Dispose()
- {
- Application.RemoveMessageFilter(this);
- UnregisterHotKey(_handle, _id);
- }
- private void RegisterHotKey()
- {
- if (_key == Keys.None)
- return;
- if (_isKeyRegisterd)
- _isKeyRegisterd = !(UnregisterHotKey(_handle, _id));
- _isKeyRegisterd = RegisterHotKey(_handle, _id, _keyModifier, _key);
- if (!_isKeyRegisterd)
- throw new ApplicationException("Hotkey allready in use");
- }
- [Bindable(true), Category("HotKey")]
- public Keys Key
- {
- get { return _key; }
- set
- {
- if (_key != value)
- {
- _key = value;
- OnKeyChanged(new EventArgs());
- }
- }
- }
- [Bindable(true), Category("HotKey")]
- public KeyModifiers KeyModifier
- {
- get { return _keyModifier; }
- set
- {
- if (_keyModifier != value)
- {
- _keyModifier = value;
- OnKeyModifierChanged(new EventArgs());
- }
- }
- }
- public bool PreFilterMessage(ref Message m)
- {
- switch (m.Msg)
- {
- case WmHotKey:
- if ((int)(m.WParam) == _id)
- {
- KeyEventArgs args = new KeyEventArgs((IsButtonDown(m.LParam, KeyModifiers.Alt) ? Keys.Alt : Keys.None)
- | (IsButtonDown(m.LParam, KeyModifiers.Control) ? Keys.Control : Keys.None)
- | (IsButtonDown(m.LParam, KeyModifiers.Shift) ? Keys.Shift : Keys.None) | Key);
- OnHotKeyPressed(args);
- return true;
- }
- break;
- }
- return false;
- }
- public static bool IsButtonDown(IntPtr ptr, KeyModifiers keyModifiers)
- {
- return Convert.ToBoolean(((long)ptr) & (long)keyModifiers);
- }
- private void OnHotKeyPressed(KeyEventArgs e)
- {
- if (HotKeyPressed != null)
- HotKeyPressed(this, e);
- }
- private void OnKeyChanged(EventArgs e)
- {
- RegisterHotKey();
- if (KeyChanged != null)
- KeyChanged(this, e);
- }
- private void OnKeyModifierChanged(EventArgs e)
- {
- RegisterHotKey();
- if (KeyModifierChanged != null)
- KeyModifierChanged(this, e);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д