Есть прога, она показывает по центу экрана сплеш-скрин при старте (как окно, со стилем WS_POPUP). При запуске прога также запускает еще один процесс.
Если в порожденном процессе чего-то нехватает, то он о этом сообщает юзеру вызывая
MessageBox(NULL,"Device not ready. Please attach it and click OK","Not ready!", MB_OK |
MB_ICONINFORMATION|MB_TOPMOST);
(и пока юзер не ткнет ОК, работу не продолжает).
Проблема в том, что в иногда в некоторых виндах (кажется в висте и семерке, но иногда и в XP бьвает) сплеш скрин перекрывает то сообщение об ошибке, юзер его не замечает (несмотря на то, что в таскбаре новое окно появляется), и юзер жалуется что прога зависла.
Вопрос — как сделать чтобы онкно, созданное MessageBox оказалось ПОВЕРХ сплеш скрина? Если c MessageBox это невозможно, тогда как сообщить юзеру о проблеме чтобы гарантировано сообщение оказалось поверх сплеш скрина?
Здравствуйте, Webcoder75, Вы писали:
W>Есть прога, она показывает по центу экрана сплеш-скрин при старте (как окно, со стилем WS_POPUP). При запуске прога также запускает еще один процесс.
W>Если в порожденном процессе чего-то нехватает, то он о этом сообщает юзеру вызывая W>
W> MessageBox(NULL,"Device not ready. Please attach it and click OK","Not ready!", MB_OK |
W> MB_ICONINFORMATION|MB_TOPMOST);
W>
W>(и пока юзер не ткнет ОК, работу не продолжает).
W>Проблема в том, что в иногда в некоторых виндах (кажется в висте и семерке, но иногда и в XP бьвает) сплеш скрин перекрывает то сообщение об ошибке, юзер его не замечает (несмотря на то, что в таскбаре новое окно появляется), и юзер жалуется что прога зависла.
W>Вопрос — как сделать чтобы онкно, созданное MessageBox оказалось ПОВЕРХ сплеш скрина? Если c MessageBox это невозможно, тогда как сообщить юзеру о проблеме чтобы гарантировано сообщение оказалось поверх сплеш скрина?
W>Спасибо заранее за ответы!
Может сначала диагностировать, что устройство подключено и готово и только потом сплэш скрин показывать и грузить все остальное? А в случае если не готово показывать только MessageBox?
С уважением,
Евгений
Re[2]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, -prus-, Вы писали:
P>Может сначала диагностировать, что устройство подключено и готово и только потом сплэш скрин показывать и грузить все остальное? А в случае если не готово показывать только MessageBox?
Там все так слишком замороченно, что такой вариант не подходит. Нужно именно показать сообщение поверх сплеш-скрина..
Здравствуйте, Webcoder75, Вы писали:
W>Там все так слишком замороченно, что такой вариант не подходит. Нужно именно показать сообщение поверх сплеш-скрина..
Может тогда попробовать создавать MessageBox с типом MB_SETFOREGROUND? Так:
MessageBox(NULL,"Device not ready. Please attach it and click OK","Not ready!", MB_OK |
MB_ICONINFORMATION|MB_SETFOREGROUND|MB_TOPMOST);
MB_SETFOREGROUND
The message box becomes the foreground window. Internally, the system calls the SetForegroundWindow function for the message box.
С уважением,
Евгений
Re[3]: ShowMessage со стилем WS_POPUP как сделать?
"Webcoder75" <78993@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:3527837@news.rsdn.ru... > Здравствуйте, -prus-, Вы писали: > > P>Может сначала диагностировать, что устройство подключено и готово и только потом сплэш скрин показывать и грузить все остальное? А в случае если не готово показывать только MessageBox? > > Там все так слишком замороченно, что такой вариант не подходит. Нужно именно показать сообщение поверх сплеш-скрина..
MB_TOPMOST ?
C>"Webcoder75" <78993@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:3527837@news.rsdn.ru... >> Здравствуйте, -prus-, Вы писали: >> >> P>Может сначала диагностировать, что устройство подключено и готово и только потом сплэш скрин показывать и грузить все остальное? А в случае если не готово показывать только MessageBox? >> >> Там все так слишком замороченно, что такой вариант не подходит. Нужно именно показать сообщение поверх сплеш-скрина.. C>MB_TOPMOST ?
Здравствуйте, -prus-, Вы писали:
P>Здравствуйте, Webcoder75, Вы писали:
W>>Там все так слишком замороченно, что такой вариант не подходит. Нужно именно показать сообщение поверх сплеш-скрина..
P>Может тогда попробовать создавать MessageBox с типом MB_SETFOREGROUND? Так:
P>
P> MessageBox(NULL,"Device not ready. Please attach it and click OK","Not ready!", MB_OK |
P> MB_ICONINFORMATION|MB_SETFOREGROUND|MB_TOPMOST);
P>
P>
P>MB_SETFOREGROUND
P>The message box becomes the foreground window. Internally, the system calls the SetForegroundWindow function for the message box.
Нифига — ни MB_SETFOREGROUND один, ни в комбинации с MB_TOPMOST — не помогает нисколько..
Тестирую под Win7. Там еще ширина MessageBox уменьшилась очевидно, и по ширине она как раз меньше сплешскрина оказывается — полностью под ним (даже краешков не видно).
Здравствуйте, Webcoder75, Вы писали:
W>Здравствуйте, -prus-, Вы писали:
P>>Здравствуйте, Webcoder75, Вы писали:
W>>>Там все так слишком замороченно, что такой вариант не подходит. Нужно именно показать сообщение поверх сплеш-скрина..
P>>Может тогда попробовать создавать MessageBox с типом MB_SETFOREGROUND? Так:
P>>
P>> MessageBox(NULL,"Device not ready. Please attach it and click OK","Not ready!", MB_OK |
P>> MB_ICONINFORMATION|MB_SETFOREGROUND|MB_TOPMOST);
P>>
P>>
P>>MB_SETFOREGROUND
P>>The message box becomes the foreground window. Internally, the system calls the SetForegroundWindow function for the message box.
W>Нифига — ни MB_SETFOREGROUND один, ни в комбинации с MB_TOPMOST — не помогает нисколько.. W>Тестирую под Win7. Там еще ширина MessageBox уменьшилась очевидно, и по ширине она как раз меньше сплешскрина оказывается — полностью под ним (даже краешков не видно).
W>Есть ли еще какие идеи?
В общем, будем следовать другим путем, спасибо за советы.
Здравствуйте, Webcoder75, Вы писали:
W>Есть прога, она показывает по центу экрана сплеш-скрин при старте (как окно, со стилем WS_POPUP). При запуске прога также запускает еще один процесс.
W>Если в порожденном процессе чего-то нехватает, то он о этом сообщает юзеру вызывая W>
W> MessageBox(NULL,"Device not ready. Please attach it and click OK","Not ready!", MB_OK |
W> MB_ICONINFORMATION|MB_TOPMOST);
W>
W>(и пока юзер не ткнет ОК, работу не продолжает).
W>Проблема в том, что в иногда в некоторых виндах (кажется в висте и семерке, но иногда и в XP бьвает) сплеш скрин перекрывает то сообщение об ошибке, юзер его не замечает (несмотря на то, что в таскбаре новое окно появляется), и юзер жалуется что прога зависла.
W>Вопрос — как сделать чтобы онкно, созданное MessageBox оказалось ПОВЕРХ сплеш скрина? Если c MessageBox это невозможно, тогда как сообщить юзеру о проблеме чтобы гарантировано сообщение оказалось поверх сплеш скрина?
W>Спасибо заранее за ответы!
Кажись в MessageBox первым аргументом можно передать хэндл на сплэш.
Re[6]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, Webcoder75, Вы писали:
W>Вопрос — как сделать чтобы онкно, созданное MessageBox оказалось ПОВЕРХ сплеш скрина? Если c MessageBox это невозможно, тогда как сообщить юзеру о проблеме чтобы гарантировано сообщение оказалось поверх сплеш скрина?
А если просто предложить сплешу закрыться (WM_CLOSE ему послать) ? Тогда MB и окажется поверх
With best regards
Pavel Dvorkin
Re[3]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, Webcoder75, Вы писали:
W>Здравствуйте, plastictown, Вы писали:
W>>>Спасибо заранее за ответы!
P>>Кажись в MessageBox первым аргументом можно передать хэндл на сплэш.
W>Сплеш в другом процессе рисуется. Поэтому думаю не сработает..
W>Еще я пробовал создавать невидимое окно класса WS_POPUP (или как-то так), и указывать его родителем MessageBox — нифига не помогает.
Здравствуйте, Webcoder75, Вы писали:
W>Вопрос — как сделать чтобы онкно, созданное MessageBox оказалось ПОВЕРХ сплеш скрина? Если c MessageBox это невозможно, тогда как сообщить юзеру о проблеме чтобы гарантировано сообщение оказалось поверх сплеш скрина?
Во-первых, не надо помещать сплеш-скрин в позицию HWND_TOPMOST, и соответственно, не назначать ему стиль WS_EX_TOPMOST при создании.
Потому что он будет задалбывать пользователя не только с твоим месседж-боксом, но и с чужими.
Достаточно, если сплеш-скрин будет изначально помещён в позицию HWND_TOP — поверх тех окон, которые были в момент его возникновения. А кто потом сверху выпрыгнет — так тому и быть.
Во-вторых, даже посторонний процесс может надругаться над чужими окнами, изменив их стиль и позицию.
Но это, скорее, хак.
Перекуём баги на фичи!
Re[3]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, Webcoder75, Вы писали:
P>>Кажись в MessageBox первым аргументом можно передать хэндл на сплэш.
W>Сплеш в другом процессе рисуется. Поэтому думаю не сработает..
Тут "думать" мало, тут надо было пробовать, как советовал plastictown.
Почитайте про взаимотношения окон owner/owned (кто там над кем итд).
(Поимейте также в виду SetWindowPos).
W>Еще я пробовал создавать невидимое окно класса WS_POPUP (или как-то так), и указывать его родителем MessageBox — нифига не помогает.
Здравствуйте, Кодт, Вы писали:
К>Во-первых, не надо помещать сплеш-скрин в позицию HWND_TOPMOST, и соответственно, не назначать ему стиль WS_EX_TOPMOST при создании. К>Потому что он будет задалбывать пользователя не только с твоим месседж-боксом, но и с чужими. К>Достаточно, если сплеш-скрин будет изначально помещён в позицию HWND_TOP — поверх тех окон, которые были в момент его возникновения. А кто потом сверху выпрыгнет — так тому и быть.
Совет заведомо неважнецкий.
Ибо такой сплеш заведомо окажется под уже существующими topmost-окнами, например — под тултипами, что смотрится препротивно.
Кроме того, HWND_TOP/HWND_BOTTOM — это для sibling окон, являющимися child для общего parent-окна. По моему опыту
Решал ровно такую же задачу.
Тоже были проблемы что сплэш и сообщение из разных потоков.
Сделайте сплэш скрываемым не только по завершению загрузки, но и по таймеру.
Тогда даже если выскочит мессаджбокс и загрузка замрет, то сплэш через несколько секунд скроется.
Re[5]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, kero, Вы писали:
М>>Попробуйте приаттачить поток, показывающий сплеш, к гланому потоку запускаемого приложения (AttachThreadInput)
K>Сами-то пробовали (с той же целью) ?
Здравствуйте, kero, Вы писали:
K>Совет заведомо неважнецкий. K>Ибо такой сплеш заведомо окажется под уже существующими topmost-окнами, например — под тултипами, что смотрится препротивно.
Зато юзабельный.
Кроме того, нефиг окнам неактивного приложения быть топмост.
Обычно бесприютные тултипы — это следствие замёрзшего или зависшего приложения. Они в любом случае смотрятся препротивно.
А если это какое-то полезное топмост окошко (ну там, не знаю, виджет буфера обмена), то прятать его — подлянка.
K>Кроме того, HWND_TOP/HWND_BOTTOM — это для sibling окон, являющимися child для общего parent-окна. По моему опыту
Поскольку парентом попапов выступает десктоп, мы получаем ровно то поведение, которое нам нужно