Диалоговый MessageBox иногда скрыт позади основной формы

У некоторых наших нетехнических пользователей есть проблемы, где диалоговый MessageBox в нашем приложении может иногда отображаться позади основной формы, и приложение не принимает входа до messagebox (который они не видят), отклонен.

Приложение записано в C#, и окна сообщения являются стандартными, например, код может быть столь же простым как MessageBox. Покажите (сообщение, подпись), и messageboxes может быть создан основным потоком UI (т.е. не некоторый фоновый поток). Приложение не должно быть запущено, полный экран, но 90% наших пользователей действительно выполняет его полный экран.

Большую часть времени ((возможно,> 99%) messageboxes отображаются правильно, и мне никогда не удавалось видеть, как это идет не так, как надо, но я видел машину, когда это пошло не так, как надо.

Одна вещь, которую я действительно замечал, состоит в том, что, если у Вас есть приложение, которое отображает диалоговое окно, затем при рассмотрении taskmanager Вы нормальный только видите одну запись в списке приложений. Каждый раз, когда messagebox скрыт, Вы будете видеть две записи, один для главного приложения и другой записи для этого окна сообщения.

Достаточно легко решить проблему, после того как Вы знаете то, что произошло, но некоторые наши нетехнические пользователи смущены им и заканчивают тем, что выключили их компьютеры. (И те, кто использует Удаленный рабочий стол, еще более смущены, когда это не решает проблему).

Я не думаю, что это связано с операционной системой, поскольку я видел, что он происходит в Vista, и был сказан, что это также происходит на терминальном сеансе на сервере Windows 2003.

Что-нибудь знает, почему это происходит и что еще более важно если что-нибудь может быть сделано для предотвращения его?

26
задан sgmoore 12 August 2010 в 12:04
поделиться

3 ответа

Некоторые перегрузки метода MessageBox.Show () принимают параметр IWin32Window в качестве первого аргумента. Если вы передадите свою форму в качестве первого аргумента, это должно предотвратить это.

23
ответ дан 28 November 2019 в 17:17
поделиться

Всегда ли одно и то же окно сообщения (для одного и того же сообщения?) Приходит в одной и той же форме?

В идеале вы должны попытаться найти способ воспроизвести проблему по своему желанию или по собственному желанию. минимум автоматически. Это упростит вам отладку, и вы сможете быть уверены, что ваше будущее изменение исправит ошибку, вместо того, чтобы ждать несколько недель отзывов от пользователей.

Если это всегда одно и то же сообщение и в одном окне, являющееся результатом одного и того же действия, и если вызов MessageBox достаточно легко запустить с точки зрения пользователя, и если ваш пользовательский интерфейс относительно стандартный, вы можете автоматизировать пользовательский интерфейс с помощью сценария AutoIT и запускать его в цикле до тех пор, пока не возникнет проблема.

И / или вы можете создать «отладочную» сборку своих приложений, которую вы можете передать некоторым пользователям (желательно тем, которые, кажется, чаще всего сталкиваются с проблемой), которые будут записывать содержимое StackFrame объект в файл журнала или что-то подобное каждый раз перед вызовом MessageBox (вы можете создать оболочку вокруг MessageBox, чтобы упростить эту задачу).

Затем, когда один из ваших пользователей сталкивается с проблемой, вы можете просмотреть файл журнала и увидеть, откуда он появился (файл исходного кода, строка, стек вызовов и т. Д.). Вы также можете сравнить это с журналами других пользователей и посмотреть, всегда ли MessageBox приходит из одного и того же места или меняется. Это покажет вам, откуда и откуда вызывается проблемный MessageBox.

Могут быть более простые решения (особенно если в вашем приложении много сборок) с использованием некоторого отладчика .Net, который вы присоедините к своему приложению, когда возникнет проблема, чтобы увидеть стек вызовов и т. Д., Но я сделал только это с собственными приложениями (с использованием OllyDbg) пока что, а не .Net. Другие могут развить эту идею дальше ...

1
ответ дан 28 November 2019 в 17:17
поделиться

Вы говорите "ящики сообщений могут быть созданы основным потоком пользовательского интерфейса", что, как я предполагаю, означает, что они не всегда создаются основным потоком пользовательского интерфейса. Ваша проблема звучит так, как будто MessageBox.Show иногда вызывается из другого потока.

0
ответ дан 28 November 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: