2012-02-23 23 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

相關問題