Как сделать глобальный хоткей для программы? - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Задачка такая - при нажатии Alt+X программа должна выдать MessageBox с каким-то текстом! На данный момент у меня есть вот такой код:
Листинг программы
  1. private void Form1_KeyDown(object sender, KeyEventArgs e)
  2. {
  3. if (e.KeyCode == Keys.X && e.Alt)
  4. {
  5. MessageBox.Show("123");
  6. }
  7. }
Сообщение появляется но ТОЛЬКО если окно программы активно! Сложность в том, что данный хоткей должен работать когда программа работает даже в свернутом виде! Как это сделать?

Решение задачи: «Как сделать глобальный хоткей для программы?»

textual
Листинг программы
  1. using System;
  2. using System.ComponentModel;
  3. using System.Runtime.InteropServices;
  4. using System.Windows.Forms;
  5.  
  6. public sealed class HotKey : IMessageFilter, IDisposable
  7.     {
  8.         public event KeyEventHandler HotKeyPressed;
  9.  
  10.         private readonly int _id;
  11.  
  12.         #region Native win32 API
  13.  
  14.         private const int WmHotKey = 0x0312;
  15.  
  16.         [DllImport("user32.dll", SetLastError = true)]
  17.         private static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
  18.  
  19.         [DllImport("user32.dll", SetLastError = true)]
  20.         private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
  21.  
  22.         [Flags]
  23.         public enum KeyModifiers
  24.         {
  25.             None = 0,
  26.             Alt = 1,
  27.             Control = 2,
  28.             Shift = 4,
  29.             Windows = 8
  30.         }
  31.  
  32.         #endregion
  33.  
  34.         public event EventHandler KeyChanged;
  35.         public event EventHandler KeyModifierChanged;
  36.         private IntPtr _handle;
  37.         public IntPtr Handle
  38.         {
  39.             get { return _handle; }
  40.             set { _handle = value; }
  41.         }
  42.  
  43.         private Keys _key;
  44.         private KeyModifiers _keyModifier;
  45.         private bool _isKeyRegisterd;
  46.  
  47.         public HotKey()
  48.         {
  49.             _id = GetHashCode();
  50.             Application.AddMessageFilter(this);
  51.         }
  52.  
  53.         ~HotKey()
  54.         {
  55.             Dispose();
  56.         }
  57.  
  58.         public void Dispose()
  59.         {
  60.             Application.RemoveMessageFilter(this);
  61.             UnregisterHotKey(_handle, _id);
  62.         }
  63.  
  64.         private void RegisterHotKey()
  65.         {
  66.             if (_key == Keys.None)
  67.                 return;
  68.             if (_isKeyRegisterd)
  69.                 _isKeyRegisterd = !(UnregisterHotKey(_handle, _id));
  70.             _isKeyRegisterd = RegisterHotKey(_handle, _id, _keyModifier, _key);
  71.             if (!_isKeyRegisterd)
  72.                 throw new ApplicationException("Hotkey allready in use");
  73.         }
  74.  
  75.         [Bindable(true), Category("HotKey")]
  76.         public Keys Key
  77.         {
  78.             get { return _key; }
  79.             set
  80.             {
  81.                 if (_key != value)
  82.                 {
  83.                     _key = value;
  84.                     OnKeyChanged(new EventArgs());
  85.                 }
  86.             }
  87.         }
  88.  
  89.         [Bindable(true), Category("HotKey")]
  90.         public KeyModifiers KeyModifier
  91.         {
  92.             get { return _keyModifier; }
  93.  
  94.             set
  95.             {
  96.                 if (_keyModifier != value)
  97.                 {
  98.                     _keyModifier = value;
  99.                     OnKeyModifierChanged(new EventArgs());
  100.                 }
  101.             }
  102.         }
  103.  
  104.         public bool PreFilterMessage(ref Message m)
  105.         {
  106.             switch (m.Msg)
  107.             {
  108.                 case WmHotKey:
  109.                     if ((int)(m.WParam) == _id)
  110.                     {
  111.                         KeyEventArgs args = new KeyEventArgs((IsButtonDown(m.LParam, KeyModifiers.Alt) ? Keys.Alt : Keys.None)
  112.                                 | (IsButtonDown(m.LParam, KeyModifiers.Control) ? Keys.Control : Keys.None)
  113.                                 | (IsButtonDown(m.LParam, KeyModifiers.Shift) ? Keys.Shift : Keys.None) | Key);
  114.  
  115.                         OnHotKeyPressed(args);
  116.                         return true;
  117.                     }
  118.                     break;
  119.             }
  120.             return false;
  121.         }
  122.  
  123.         public static bool IsButtonDown(IntPtr ptr, KeyModifiers keyModifiers)
  124.         {
  125.             return Convert.ToBoolean(((long)ptr) & (long)keyModifiers);
  126.         }
  127.  
  128.         private void OnHotKeyPressed(KeyEventArgs e)
  129.         {
  130.             if (HotKeyPressed != null)
  131.                 HotKeyPressed(this, e);
  132.         }
  133.  
  134.         private void OnKeyChanged(EventArgs e)
  135.         {
  136.             RegisterHotKey();
  137.             if (KeyChanged != null)
  138.                 KeyChanged(this, e);
  139.         }
  140.  
  141.         private void OnKeyModifierChanged(EventArgs e)
  142.         {
  143.             RegisterHotKey();
  144.             if (KeyModifierChanged != null)
  145.                 KeyModifierChanged(this, e);
  146.         }
  147.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы