2012-02-23 58 views
2

我有一个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时,对于我来说这是一个问题,当我尝试并行执行时 - 全局热键被绑定到线程。

+0

如果您的应用程序不是活动窗口,您不能检查活动应用程序,也不要处理按键操作?或者使用一些计时器轮询来检查活动窗口并禁用键盘快捷方式,如果你的应用程序不是活动窗口。 – CodingBarfield 2012-02-23 08:37:39

+0

第一个会禁用其他应用程序热键... – 2012-02-23 09:17:30

回答

1

因此,然后检查窗体激活/关闭事件窗体是否为前景窗口(::GetForegroundWindow()),然后正确禁用/启用热键。

+0

谢谢,这在某些情况下有效。但有时我需要重新打开其他应用程序(例如记事本)几次以使其热键可用。 – 2012-02-23 09:24:49

+0

现在我想出了为什么: 我有一个浮动对话框(其主窗体上的窗体添加了this.AddOwnedForm(..)),当我将该应用程序输入到此对话框时,它不启用热键。 – 2012-02-23 09:33:41

+0

当我从这个对话框中离开应用程序时,它并不禁用热键。 我也可以检查这个小对话框的Activate/Deactivate,并操作其中的热键,但如果我有更多这样的对话框,它对我来说似乎不干。 – 2012-02-23 09:35:44

相关问题