/
SystemHotkey.cs
121 lines (110 loc) · 3.19 KB
/
SystemHotkey.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Windows.Forms;
using CodeProject.Win32;
namespace CodeProject.SystemHotkey
{
/// <summary>
/// Handles a System Hotkey
/// </summary>
public class SystemHotkey : System.ComponentModel.Component,IDisposable
{
private System.ComponentModel.Container components = null;
protected DummyWindowWithEvent m_Window=new DummyWindowWithEvent(); //window for WM_Hotkey Messages
protected Keys m_HotKey=Keys.None;
protected bool isRegistered=false;
public event System.EventHandler Pressed;
public event System.EventHandler Error;
public SystemHotkey(System.ComponentModel.IContainer container)
{
container.Add(this);
InitializeComponent();
m_Window.ProcessMessage+=new MessageEventHandler(MessageEvent);
}
public SystemHotkey()
{
InitializeComponent();
if (!DesignMode)
{
m_Window.ProcessMessage+=new MessageEventHandler(MessageEvent);
}
}
public new void Dispose()
{
if (isRegistered)
{
if (UnregisterHotkey())
System.Diagnostics.Debug.WriteLine("Unreg: OK");
}
System.Diagnostics.Debug.WriteLine("Disposed");
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
protected void MessageEvent(object sender,ref Message m,ref bool Handled)
{ //Handle WM_Hotkey event
if ((m.Msg==(int)Win32.Msgs.WM_HOTKEY)&&(m.WParam==(IntPtr)this.GetType().GetHashCode()))
{
Handled=true;
System.Diagnostics.Debug.WriteLine("HOTKEY pressed!");
if (Pressed!=null) Pressed(this,EventArgs.Empty);
}
}
protected bool UnregisterHotkey()
{ //unregister hotkey
return Win32.User32.UnregisterHotKey(m_Window.Handle,this.GetType().GetHashCode());
}
protected bool RegisterHotkey(Keys key)
{ //register hotkey
int mod=0;
Keys k2=Keys.None;
if (((int)key & (int)Keys.Alt)==(int)Keys.Alt) {mod+=(int)Win32.Modifiers.MOD_ALT;k2=Keys.Alt;}
if (((int)key & (int)Keys.Shift)==(int)Keys.Shift) {mod+=(int)Win32.Modifiers.MOD_SHIFT;k2=Keys.Shift;}
if (((int)key & (int)Keys.Control)==(int)Keys.Control) {mod+=(int)Win32.Modifiers.MOD_CONTROL;k2=Keys.Control;}
return Win32.User32.RegisterHotKey(m_Window.Handle,this.GetType().GetHashCode(),(int)mod,((int)key)-((int)k2));
}
public bool IsRegistered
{
get{return isRegistered;}
}
[DefaultValue(Keys.None)]
public Keys Shortcut
{
get { return m_HotKey; }
set
{
if (DesignMode) {m_HotKey=value;return;} //Don't register in Designmode
if ((isRegistered)&&(m_HotKey!=value)) //Unregister previous registered Hotkey
{
if (UnregisterHotkey())
{
isRegistered=false;
}
else
{
if (Error!=null) Error(this,EventArgs.Empty);
}
}
if (value==Keys.None) {m_HotKey=value;return;}
if (RegisterHotkey(value)) //Register new Hotkey
{
isRegistered=true;
}
else
{
if (Error!=null) Error(this,EventArgs.Empty);
}
m_HotKey=value;
}
}
}
}