今天给大伙分享一下C#老板键多组合Alt+Ctrl+Shift代码实现,这是一个简单的实现,不过网上多数的代码都是重复的,这里其实也是重复的,只是发现其中的一些不为人知的隐藏属性:
下面看一下最常见的代码:
public delegate void HotkeyEventHandler(int HotKeyID);
public class SystemHotKey : System.Windows.Forms.IMessageFilter
{
List<UInt32> keyIDs = new List<UInt32>();
IntPtr hWnd;
public event HotkeyEventHandler OnHotkey;
public enum KeyFlags
{
Alt = 0x1,
Ctrl = 0x2,
Shift = 0x4,
Win = 0x8,
//组合键等于值相加
Alt_Ctrl = 0x3,
Alt_Shift = 0x5,
Ctrl_Shift = 0x6,
Alt_Ctrl_Shift = 0x7
}
[DllImport("user32.dll")]
public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk);
[DllImport("user32.dll")]
public static extern UInt32 UnregisterHotKey(IntPtr hWnd, UInt32 id);
[DllImport("kernel32.dll")]
public static extern UInt32 GlobalAddAtom(String lpString);
[DllImport("kernel32.dll")]
public static extern UInt32 GlobalDeleteAtom(UInt32 nAtom);
public SystemHotKey(IntPtr hWnd)
{
this.hWnd = hWnd;
}
public int RegisterHotkey(KeyFlags keyflags, System.Windows.Forms.Keys Key)
{
System.Windows.Forms.Application.AddMessageFilter(this);
UInt32 hotkeyid = GlobalAddAtom(System.Guid.NewGuid().ToString());
RegisterHotKey((IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key);
keyIDs.Add(hotkeyid);
return (int)hotkeyid;
}
public void UnregisterHotkeys()
{
if (keyIDs.Count > 0)
{
System.Windows.Forms.Application.RemoveMessageFilter(this);
foreach (UInt32 key in keyIDs)
{
UnregisterHotKey(hWnd, key);
GlobalDeleteAtom(key);
}
keyIDs.Clear();
}
}
public bool PreFilterMessage(ref System.Windows.Forms.Message m)
{
if (m.Msg == 0x312)
{
if (OnHotkey != null)
{
foreach (UInt32 key in keyIDs)
{
if ((UInt32)m.WParam == key)
{
OnHotkey((int)m.WParam);
return true;
}
}
}
}
return false;
}
}
这段是我经过改篇的代码,其中有几个小修改要点说一下:
1:System.Windows.Forms.Application.AddMessageFilter(this);这句需要对应System.Windows.Forms.Application.RemoveMessageFilter(this);这里用完要记得取消。
由于原来的程序,只在构造函数里添加,所以取消后,再设置就会失效了,这里直接在注册的时候给加上,取消时去掉,注意下这个效果即可。
2:热键的组合:
//组合键等于值相加
Alt_Ctrl = 0x3,
Alt_Shift = 0x5,
Ctrl_Shift = 0x6,
Alt_Ctrl_Shift = 0x7
这个是我发现的,网上的代码几乎都没有写到,搜了半天也没有组合键相关的介绍,后来我试了一下,果然组合键就是值相加,就这么简单。
3:把Hastable变更成List<Unint32>方式。