Вывод Messagebox.Show на фронт после использования HotKey - PullRequest
0 голосов
/ 27 февраля 2020

Как заставить MessageBox вывести себя вперед из свернутого окна после использования горячей клавиши?

Я использую user32.dll RegisterHotKey, чтобы позволить моему пользователю отмечать номер телефона, нажмите горячую клавишу и позвоните по этому номеру автоматически. Затем я использую WndProc для захвата 0x0312 сообщения, а затем запрашиваю пользователя с помощью MessageBox, спрашивая, хотят ли они позвонить по этому номеру.
Мой класс для работы с горячими клавишами расширяет формы (HotKeyHandler : Form), поэтому у него есть WndProc и дескриптор.

Если mainForm свернут или находится в фоновом режиме, то окно сообщений также находится в фоновом режиме. и не выводится на передний план, как ожидалось. Однако если mainForm закрыта, окно сообщения отображается сверху без проблем.
Я пытался вызвать this.BringToFront() в HotKeyHandler, который заморозил все приложение, ожидая, пока пользователь выберет
да или нет в приглашении, которое вообще не отображается. Я также попробовал this.Focus(), который не имел никакого эффекта вообще. Я предполагаю, что это потому, что HotKeyHandler никогда не показывался с .Show().

protected override void WndProc(ref Message m) {
    if(m.Msg == 0x0312) {
        int id = m.WParam.ToInt32();
        switch(id) {
            case 1:
                String captureStr = CopyText(SettingsHandler.Instance.GetHotKey(id));

                Regex regex = new Regex(@"(?<!\S)(?<Region>(?:\+|00)45)?(?<PhoneNumber>[2-9][0-9]\s?(?:[0-9]{2}\s?){3})(?!\S)", RegexOptions.Multiline);
                MatchCollection matches = regex.Matches(captureStr);

                if(matches.Count == 1) {
                    String number = ((matches[0].Groups["Region"].Value == "") ? String.Empty : $"({matches[0].Groups["Region"].Value}) ") + matches[0].Groups["PhoneNumber"].Value;
                    DialogResult dr = MessageBox.Show($"Would you like to call {number} ", "Callling", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if(dr == DialogResult.Yes) {
                        PushToPhone(matches[0].Groups["PhoneNumber"].Value);
                    }
                }
                else if(matches.Count > 1) {
                    MessageBox.Show("Found too many phone numbers in captured string", "Ambiguity found.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                break;
            case 2:

                break;
        }
    }

    base.WndProc(ref m);
}
...