Как заставить 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);
}