У меня была версия этой проблемы, которая возникала, когда я вызывал myDialog.ShowDialog () из пользовательского элемента управления, когда пользователь нажимал клавишу ввода из однострочного текстового поля.
(Они помещают номер продукта в текстовое поле, нажимают клавишу ввода, и диалоговое окно появляется и позволяет им выбирать из доступных размеров. Но это раздражает, если звук звонка звучит каждый раз, когда диалоговое окно появляется.)
Я перехватил событие нажатия клавиши в текстовом поле и установил e.Handled и e.SupressKeypress, но это не решило проблему. Затем я заметил, что если я закомментировал вызов myDialog.ShowDialog (), то я не получил звук, какой бы странный он ни был. В этом случае e.Handled и e.SupressKeypress действительно предотвратили звонок.
Я подумал, что, может быть, событие каким-то образом передается диалогу, поэтому я перехватил событие keydown на уровне формы и на каждом элементе формы, который вообще принимает нажатия клавиш, и установил e.Handled и e.SuppressKeypress в каждый из них, но это не исправило это.
Я попытался поместить кнопку отправки в форму и присвоить этой кнопке свойство AcceptButton формы, но это тоже не помогло.
Я пытался вызвать Application.DoEvents () перед вызовом myDialog.ShowDialog (), но это не помогло.
Я заметил, что при вызове Application.DoEvents () звонок воспроизводился, даже когда был закомментирован вызов myDialog.ShowDialog ()! Как будто вызов DoEvents обрабатывал текущее событие, не обращая внимания на классификаторы e.Handled и e.SupressKeypress.
Итак ... Я подумал, что если я позволю текущему событию разыгрываться, пока идут квалификаторы, и , тогда вызовет мой диалог после этого?
Поэтому я поместил myDialog.ShowDialog () в раздел BeginInvoke (поскольку у меня сложилось впечатление, что вызов добавляет сообщение в основную очередь сообщений, что вызывает вызов метода при обработке этого сообщения):
BeginInvoke((MethodInvoker)delegate {
SelectProduct(); // <-- pops the size selection dialog
});
Хотите верьте, хотите нет, но это починили - без звонка.
(Я обычно использую вызовы, когда мне нужно обновить представление, когда фоновый поток вызывает обратный вызов, поскольку представления WinForms не позволяют обновляться из потока, отличного от основного потока.)
Итак, я предполагаю, что в пользовательском элементе управления, где находится однострочное текстовое поле, нужна кнопка подтверждения, но пользовательский элемент управления не имеет свойства AcceptButton.
Программирование на WinForms кажется черным искусством. Полагаю, как и любой другой вид программирования.