某天,为了给微博粉丝精灵增加个老板键功能,找一惯的方式,开始从网络下手寻找: 关键字类似”C# 老板键“,一搜,一堆又一堆,然而出来的代码,基本上都是一个样的:
正常来说,老板键一般少不了:Alt+Ctrl+Shift+XX这种多组合方式,然而各类代码就是不直接说明,也没个提示,看来是有意隐藏,终于,还是被我发现其中的一些不为人知的隐藏属性:
下面看一下本人修改自网络常见的代码:publicdelegatevoidHotkeyEventHandler(intHotKeyID);
publicclassSystemHotKey:System.Windows.Forms.IMessageFilter
{
List<UInt32>keyIDs=newList<UInt32>();
IntPtrhWnd;
publiceventHotkeyEventHandlerOnHotkey;
publicenumKeyFlags
{
Alt=0x1,
Ctrl=0x2,
Shift=0x4,
Win=0x8,
//组合键等于值相加
Alt_Ctrl=0x3,
Alt_Shift=0x5,
Ctrl_Shift=0x6,
Alt_Ctrl_Shift=0x7
}
[DllImport("user32.dll")]
publicstaticexternUInt32RegisterHotKey(IntPtrhWnd,UInt32id,UInt32fsModifiers,UInt32vk);
[DllImport("user32.dll")]
publicstaticexternUInt32UnregisterHotKey(IntPtrhWnd,UInt32id);
[DllImport("kernel32.dll")]
publicstaticexternUInt32GlobalAddAtom(StringlpString);
[DllImport("kernel32.dll")]
publicstaticexternUInt32GlobalDeleteAtom(UInt32nAtom);
publicSystemHotKey(IntPtrhWnd)
{
this.hWnd=hWnd;
}
publicintRegisterHotkey(KeyFlagskeyflags,System.Windows.Forms.KeysKey)
{
System.Windows.Forms.Application.AddMessageFilter(this);
UInt32hotkeyid=GlobalAddAtom(System.Guid.NewGuid().ToString());
RegisterHotKey((IntPtr)hWnd,hotkeyid,(UInt32)keyflags,(UInt32)Key);
keyIDs.Add(hotkeyid);
return(int)hotkeyid;
}
publicvoidUnregisterHotkeys()
{
if(keyIDs.Count>0)
{
System.Windows.Forms.Application.RemoveMessageFilter(this);
foreach(UInt32keyinkeyIDs)
{
UnregisterHotKey(hWnd,key);
GlobalDeleteAtom(key);
}
keyIDs.Clear();
}
}
publicboolPreFilterMessage(refSystem.Windows.Forms.Messagem)
{
if(m.Msg==0x312)
{
if(OnHotkey!=null)
{
foreach(UInt32keyinkeyIDs)
{
if((UInt32)m.WParam==key)
{
OnHotkey((int)m.WParam);
returntrue;
}
}
}
}
returnfalse;
}
}
以上有几个要点说一下:
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>方式。
最近事比较多,写文都比较简单了,大伙见谅了。