要设置快捷键必须使用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);
}
新闻热点
疑难解答