我有一个Winforms应用程序,其面板中托管两个PDF查看器(非托管C++)。Winforms:Winforms应用程序的键盘快捷键托管在其面板中的其他应用程序
我希望有用于项目处理的应用程序范围的热键(打开,保存,关闭...),即使用户关注托管PDF查看器时也能正常工作。
我设法做到这一点通过WINAPI和RegisterHotKey,但像那些客户犯规整个系统范围内(例如,它们禁止同微软Word热键)
我曾尝试在窗体的激活禁用和启用全局热键/取消激活事件,但是即使当我不离开我自己的应用时,例如在顶层菜单条目或对话框上,也会显示这些事件。
对于应用程序范围的热键是否还有其他解决方案,即使重点在托管应用程序上也可以工作?
SOLUTION:
在主窗体中,我处理激活和停用事件是这样的:
public void PDFPicker_Activated(object sender, EventArgs e)
{
var foregroundHwnd = GUI.winapiwrap.GetForegroundWindow();
if (foregroundHwnd==this.Handle || this.OwnedForms.Any(form => form.Handle==foregroundHwnd))
{
if (!this.hotkeys.Any())
{
registerHotkeys();
this.Text = "Hotkeys just registered";
}
}
}
public void PDFPicker_Deactivate(object sender, EventArgs e)
{
var foregroundHwnd = GUI.winapiwrap.GetForegroundWindow();
if (foregroundHwnd == this.Handle || this.OwnedForms.Any(form => form.Handle == foregroundHwnd))
{
}
else
{
unregisterHotkeys();
this.Text = "Hotkeys off";
}
}
随后的对话框,这是OwnedForms阵列中,我打电话只是这样的:
private void QuestionPostingPanel_Activated(object sender, EventArgs e)
{
parent.PDFPicker_Activated(sender, e);
}
private void QuestionPostingPanel_Deactivate(object sender, EventArgs e)
{
parent.PDFPicker_Deactivate(sender, e);
}
如果出现更多这样的对话框,我会继承AbstractDialog:Form,将这两个事件函数和一个引用然后从这个AbstractDialog继承它们。
注册/取消注册GlobalHotkeys时,对于我来说这是一个问题,当我尝试并行执行时 - 全局热键被绑定到线程。
如果您的应用程序不是活动窗口,您不能检查活动应用程序,也不要处理按键操作?或者使用一些计时器轮询来检查活动窗口并禁用键盘快捷方式,如果你的应用程序不是活动窗口。 – CodingBarfield 2012-02-23 08:37:39
第一个会禁用其他应用程序热键... – 2012-02-23 09:17:30