У меня есть приложение Winforms, которое размещает на своих панелях два средства просмотра PDF (Unmanaged C ++).
Мне нужны горячие клавиши для обработки проектов (Open, Save, Close, ...), которые бы работали, даже если пользователь сосредоточился на размещенном PDF Viewer.
Мне удалось добиться этого с помощью Winapi и RegisterHotKey, но клиенту не нравится, что они предназначены для всей системы (например, они отключают те же горячие клавиши MS Word)
Я пытался отключить и включить глобальные горячие клавиши для событий Активировать / Деактивировать форму, однако эти события появляются, даже когда я не покидаю свое собственное приложение, например, при входе в верхнее меню или в диалоговом окне.
Существуют ли другие решения для горячих клавиш для всего приложения, которые сработали бы, даже если бы основное внимание уделялось размещенному приложению?
РЕШЕНИЕ:
В основной форме я обрабатываю события «Активировано» и «Деактивировать» следующим образом:
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, добавил бы эти 2 функции событий и ссылку на родительский элемент, а затем унаследовал бы их все от этого AbstractDialog.
При регистрации / отмене регистрации GlobalHotkeys для меня было проблемой, когда я пытался сделать это параллельно - глобальные горячие клавиши были связаны с потоком.