我有一個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