Winforms: сочетания клавиш для приложения Winforms, размещающего другие приложения на своих панелях - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть приложение 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 для меня было проблемой, когда я пытался сделать это параллельно - глобальные горячие клавиши были связаны с потоком.

1 Ответ

1 голос
/ 23 февраля 2012

Итак, проверьте формы Активировать / Деактивировать события, является ли форма окном переднего плана или нет (::GetForegroundWindow()), а затем соответствующим образом отключить / включить горячие клавиши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...