想做一个像QQ那样的有消息时,按热键就把对话框弹出来的效果,哪位大哥指点一下怎么写热键效果呀?
解决方案 »
- C# 获取本机对外的IP
- 这种情况该用异步还是同步socket合适?及多线程实现多客户端如何互不影响?
- 刚入门,听说这里藏着很多高手!能帮我解释这句的意思吗?
- 我用c#.net做了一个windows插件,我想要运行在一台有.netframework的机器上,那我要怎么做(用。net的工具打包成安装程序除外)
- picturebox 的问题
- c# 画图(生成缩略图失真问题)
- 请问怎么连接Excel电子表格?
- WebService调用慢?????????????
- C#编译
- 在生成部署安装项目时为什么会报“不可恢复的生成错误”?
- c#中如何解析xml串?
- 新手提问,怎样把DropDownList里的数据插入到数据库?
if (e.KeyCode == Keys.Enter) {
this.WindowState = FormWindowState.Normal;
}
using System;
using System.Runtime.InteropServices;namespace SystemHotKey
{
public delegate void HotkeyEventHandler(int HotKeyID); public class Hotkey : System.Windows.Forms.IMessageFilter
{
System.Collections.Hashtable keyIDs = new System.Collections.Hashtable();
IntPtr hWnd; public event HotkeyEventHandler OnHotkey; public enum KeyFlags
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
[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 Hotkey(IntPtr hWnd)
{
this.hWnd = hWnd;
System.Windows.Forms.Application.AddMessageFilter(this);
} public int RegisterHotkey(System.Windows.Forms.Keys Key, KeyFlags keyflags)
{
UInt32 hotkeyid = GlobalAddAtom(System.Guid.NewGuid().ToString());
RegisterHotKey( (IntPtr)hWnd, hotkeyid, (UInt32)keyflags, (UInt32)Key);
keyIDs.Add(hotkeyid, hotkeyid);
return (int)hotkeyid;
} public void UnregisterHotkeys()
{
System.Windows.Forms.Application.RemoveMessageFilter(this);
foreach (UInt32 key in keyIDs.Values)
{
UnregisterHotKey(hWnd, key);
GlobalDeleteAtom(key);
}
} public bool PreFilterMessage(ref System.Windows.Forms.Message m)
{
if (m.Msg == 0x312)
{
if(OnHotkey != null)
{
foreach (UInt32 key in keyIDs.Values)
{
if((UInt32)m.WParam == key)
{
OnHotkey((int)m.WParam);
return true;
}
}
}
}
return false;
}
}
}
该类的使用方法:在窗体的类中声明一个变量
private int Hotkey1在窗体的Load事件中加入如下代码
Hotkey hotkey;
hotkey = new Hotkey(this.Handle);
Hotkey1 = hotkey.RegisterHotkey(System.Windows.Forms.Keys.F1, Hotkey.KeyFlags.MOD_CONTROL);//定义快键(Ctrl + F1)
hotkey.OnHotkey += new HotkeyEventHandler(OnHotkey);添加快键调用函数 public void OnHotkey(int HotkeyID)
{
if(HotkeyID == Hotkey1)
{
if(this.Visible == true)
this.Visible = false;
else
this.Visible = true;
}
else
{
this.Visible = false;
}
}
if(HotkeyID == Hotkey1)
{
if(this.Visible == true)
this.Visible = false;
else
this.Visible = true;
}
else
{
this.Visible = false;
}
里面的this只认第一个窗口.