要设置快捷键必须使用user32.dll下面的两个方法。
bool registerhotkey(
 hwnd hwnd,
 int id,
 uint fsmodifiers,
 uint vk
); 
和
bool unregisterhotkey(
 hwnd hwnd,
 int id
); 
转换成c#代码,那么首先就要引用命名空间system.runtime.interopservices;来加载非托管类user32.dll。于是有了:
[dllimport("user32.dll", setlasterror=true)] 
public static extern bool registerhotkey(
 intptr hwnd, // handle to window 
 int id, // hot key identifier 
 keymodifiers fsmodifiers, // key-modifier options 
 keys vk // virtual-key code 
); 
[dllimport("user32.dll", setlasterror=true)] 
public static extern bool unregisterhotkey(
 intptr hwnd, // handle to window 
 int id // hot key identifier 
);
[flags()] 
public enum keymodifiers 
{ 
 none = 0, 
 alt = 1, 
 control = 2, 
 shift = 4, 
 windows = 8 
} 
这是注册和卸载全局快捷键的方法,那么我们只需要在form_load的时候加上注册快捷键的语句,在formclosing的时候卸载全局快捷键。同时,为了保证剪贴板的内容不受到其他程序调用剪贴板的干扰,在form_load的时候,我先将剪贴板里面的内容清空。
于是有了:
private void form1_load(object sender, system.eventargs e)
{
 label2.autosize = true;
 clipboard.clear();//先清空剪贴板防止剪贴板里面先复制了其他内容
 registerhotkey(handle, 100, 0, keys.f10);
}
private void form1_formclosing(object sender, formclosingeventargs e)
{
 unregisterhotkey(handle, 100);//卸载快捷键
} 
那么我们在别的窗口,怎么让按了快捷键以后调用我的主过程processhotkey()呢?
那么我们就必须重写wndproc()方法,通过监视系统消息,来调用过程:
protected override void wndproc(ref message m)//监视windows消息
{
 const int wm_hotkey = 0x0312;//按快捷键
 switch (m.msg)
 {
  case wm_hotkey:
   processhotkey();//调用主处理程序
   break;
 }
 base.wndproc(ref m);
} 
新闻热点
疑难解答