c# winform 动态快捷键设定

zbpengsw 2011-01-10 09:32:47
小弟最近在做系统快捷键的问题上遇到一个问题,希望各位帮一下:
代码是网上现成的,我简略的贴一下:

[DllImport("user32.dll", SetLastError = true)]
//这个函数用于注册热键
public static extern bool RegisterHotKey(

IntPtr hWnd, //要定义热键的窗口的句柄
int id, //定义热键ID(不能与其它ID重复)
KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
Keys vk //定义热键的内容
);
[DllImport("user32.dll", SetLastError = true)]
//这个函数用于注销热键
public static extern bool UnregisterHotKey(

IntPtr hWnd, //要取消热键的窗口的句柄
int id //要取消热键的ID
);
//定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
[Flags()]
//定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅助键的代码而只需直接选择其名称即可。
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8

}
private void Main_Activated(object sender, EventArgs e)
{
//region 设置快捷键
//myPID为当前进程id
HotKey.RegisterHotKey(Handle, myPID + 100, HotKey.KeyModifiers.Ctrl, Keys.Right);//主工具栏右移
}
protected override void WndProc(ref Message m)
{

const int WM_HOTKEY = 0x0312;
switch (m.Msg)
{
case WM_HOTKEY:
//这个是window消息定义的 注册的热键消息
switch (m.WParam.ToInt32() - myPID)
{
#region Ctrl+Right键 主工具栏的向右移动
case 100:
MessageBox.Show("当前进程"+Convert.ToString(myPID)+"下,主工具栏右移");
}
}
}
private void Main_Leave(object sender, EventArgs e)
{
//释放该快捷键
HotKey.UnregisterHotKey(Handle, myPID+100);
}


上述代码基本可以实现自定义快捷键,但是存在一个问题,我把含有这段代码的exe文件同时打开两个,发现只对一个程序设置的快捷键有效,而另一个没效果。在注册快捷键时,我已经跟对应的程序进程ID绑定了,WndProc()方法死活不响应另一个相同程序的快捷键设置,WndProc方法的处理机制是怎样的呢?我也想过用用keydown事件的,但是实现不了动态的自定义快捷键绑定,因为我有一个专门的快捷键设置界面。拜谢了...
...全文
272 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbpengsw 2011-01-10
  • 打赏
  • 举报
回复
我试过keydown事件的里写
if (e.Control && e.KeyCode == Keys.Right)
{
MessageBox.Show("当前线程"+myPID+"下,aaaaaaaaaa");
}
却能够正确响应。
whowhen21 2011-01-10
  • 打赏
  • 举报
回复
其实你可以放一个 右键菜单,设置右键菜单的快捷键,让这个快捷菜单做你想做的事情。设置为窗体的右键菜单,但是要隐藏起来,不能让他显示出来了。
这仅是一种思路~~
*************************************************
本内容使用CSDN小秘书回复
每天回帖即可得10分可用分!
*************************************************
莫名其 2011-01-10
  • 打赏
  • 举报
回复
身体不好头晕中···看得有点迷迷糊糊的·····

记得Windows是不允许两个进程共用一个快捷键组合的,比如QQ呼出主界面默认快捷键是“Ctrl+Alt+Z”,PS的多步撤消操作快捷键也是“Ctrl+Alt+Z”。那你现在同时登录两个QQ再使用“Ctrl+Alt+Z”这个组合肯定是打开第一个QQ进程。

实际上系统只响应了第一次打开QQ绑定快捷键的命令。
这个时候想用快捷键激活第二个运行的程序应该另外设置一个不同的组合绑定才对。
zbpengsw 2011-01-10
  • 打赏
  • 举报
回复
现在是有这个需求,可以打开多个的。设置的快捷键没有重复的,而且注册都以进程ID区分标示了。
叫我三三 2011-01-10
  • 打赏
  • 举报
回复
快捷键冲突?
winner213 2011-01-10
  • 打赏
  • 举报
回复
没用过,帮顶!
不过一般的winform程序,同一台机器最好禁用同时开两个

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧