Как узнать, когда окно сообщения было показано для формы? - PullRequest
2 голосов
/ 28 мая 2009

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

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

Например ,::1005*

backgroundThread.MessageShown(); // I do not want to call this explicitly every time!
MessageBox.Show("Task halted!");

Я предполагаю, что может быть какое-то сообщение, к которому можно подключиться. Даже в основном потоке графического интерфейса, есть ли какое-либо сообщение / событие, которое запускается непосредственно перед показом модального диалога?

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

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

Прямо сейчас я должен скрывать это явно перед каждым вызовом MessageBox.

Надеюсь, это объясняет.

Ответы [ 3 ]

5 голосов
/ 02 июня 2009

Настройка CBT Hook . После этого вы получите уведомление обо всех созданных, активированных, деактивированных и уничтоженных окнах. Затем используйте GetWindowClass, чтобы проверить, действительно ли созданный / активированный hWnd является MessageBox.

2 голосов
/ 28 мая 2009

создать свой собственный ящик сообщений, который запускает событие при вызове Show?

0 голосов
/ 02 июня 2009

Если родитель вашего MessageBox - TopMost, то ваш MessageBox будет TopMost. Итак, что-то вроде ...

MessageBox.Show( new Form() { TopMost = true }, "Message and so forth ..." );

Это также может сработать для вас ...

DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);

И передать MB_TOPMOST в качестве типа.

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