Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Webcoder75, Вы писали:
W>>Вопрос — как сделать чтобы онкно, созданное MessageBox оказалось ПОВЕРХ сплеш скрина? Если c MessageBox это невозможно, тогда как сообщить юзеру о проблеме чтобы гарантировано сообщение оказалось поверх сплеш скрина?
К>Во-первых, не надо помещать сплеш-скрин в позицию HWND_TOPMOST, и соответственно, не назначать ему стиль WS_EX_TOPMOST при создании. К>Потому что он будет задалбывать пользователя не только с твоим месседж-боксом, но и с чужими. К>Достаточно, если сплеш-скрин будет изначально помещён в позицию HWND_TOP — поверх тех окон, которые были в момент его возникновения. А кто потом сверху выпрыгнет — так тому и быть.
Абсолютно согласен. В идеале нужно убрать со сплеша HWND_TOPMOST, это моветон так делать.
Пример: частенько при запуске Винды ручками стартую сразу пяток приложений, у иж не помню точно кто (по моему какая-та старая версия The Bat) вешал свой сплеш как раз TOPMOST, при этом под ним оказывался тот же незабвенный Аутлук со своим вечно-дурацким MessageBox "Подключаться ли к сети". И вместо того чтобы кликнуть по MessageBox был вынужден постоянно любоваться на абсолютно бессмысленный сплеш Бата, с номером версии и прочим *ерьмом, которое уже наизусть знаю. Причем никакой другой инфы в нем нет. А инициализировался Бат не быстро (база была забита письмами).
Ну и на кой такое Г? В конце концов можно поставить WS_EX_TOPMOST сплешу в создании, а WM_SHOWWINDOW его тут же снять.
Имхо, Кодт прав — если есть возможность, надо убирать HWND_TOPMOST у сплеша.
Ну или прям не знаю — может попробовать дать возможность отвечать кнопками Да\Нет и.т.д. прямо в сплеше, ну что-то вроде встроенного WS_CHILD диалога туда впихнуть, и показывать когда надо!?!
Здравствуйте, Кодт, Вы писали:
K>>Ибо такой сплеш заведомо окажется под уже существующими topmost-окнами, например — под тултипами, что смотрится препротивно.
К>Зато юзабельный.
К>Кроме того, нефиг окнам неактивного приложения быть топмост. К>Обычно бесприютные тултипы — это следствие замёрзшего или зависшего приложения. Они в любом случае смотрятся препротивно. К>А если это какое-то полезное топмост окошко (ну там, не знаю, виджет буфера обмена), то прятать его — подлянка.
Тем не менее — именно сплэш в исходном вопросе, а смысл сплэша-экрана — появиться (на некоторое время) поверх остальных окон.
Про подлянку же — из другой оперы
K>>Кроме того, HWND_TOP/HWND_BOTTOM — это для sibling окон, являющимися child для общего parent-окна. По моему опыту
К>Поскольку парентом попапов выступает десктоп, мы получаем ровно то поведение, которое нам нужно
Отнюдь.
Еще раз: HWND_TOP в случае top-level окон (т.е. в случае десктопа как парента) поместит окно ниже низшего topmost окна,
тогда как для child окон (рядового parent окна) HWND_TOPMOST попросту не работает.
Здравствуйте, Carc, Вы писали:
C>Ну или прям не знаю — может попробовать дать возможность отвечать кнопками Да\Нет и.т.д. прямо в сплеше, ну что-то вроде встроенного WS_CHILD диалога туда впихнуть, и показывать когда надо!?!
Это было бы самым правильным — снабдить сплеш-скрин функцией самозахлопывания, да уж больно некрасиво и неочевидно для пользователя.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[3]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, Carc, Вы писали:
C>Абсолютно согласен. В идеале нужно убрать со сплеша HWND_TOPMOST, это моветон так делать.
C>Пример: частенько при запуске Винды ручками стартую сразу пяток приложений, у иж не помню точно кто (по моему какая-та старая версия The Bat) вешал свой сплеш как раз TOPMOST, при этом под ним оказывался тот же незабвенный Аутлук со своим вечно-дурацким MessageBox "Подключаться ли к сети". И вместо того чтобы кликнуть по MessageBox был вынужден постоянно любоваться на абсолютно бессмысленный сплеш Бата, с номером версии и прочим *ерьмом, которое уже наизусть знаю. Причем никакой другой инфы в нем нет. А инициализировался Бат не быстро (база была забита письмами). C>Ну и на кой такое Г? В конце концов можно поставить WS_EX_TOPMOST сплешу в создании, а WM_SHOWWINDOW его тут же снять.
C>Имхо, Кодт прав — если есть возможность, надо убирать HWND_TOPMOST у сплеша. C>Ну или прям не знаю — может попробовать дать возможность отвечать кнопками Да\Нет и.т.д. прямо в сплеше, ну что-то вроде встроенного WS_CHILD диалога туда впихнуть, и показывать когда надо!?!
Еще раз: а чем (в задаче ТС) не подходит MessageBox со сплэшем-owner-ом, — т.е. заведомо над сплэшем?
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Carc, Вы писали:
C>>Ну или прям не знаю — может попробовать дать возможность отвечать кнопками Да\Нет и.т.д. прямо в сплеше, ну что-то вроде встроенного WS_CHILD диалога туда впихнуть, и показывать когда надо!?!
К>Это было бы самым правильным — снабдить сплеш-скрин функцией самозахлопывания, да уж больно некрасиво и неочевидно для пользователя. Жирными таким БОЛЬШИМИ такими букафками на сплеше написать "Кликните чтобы закрыть". И любой клик по сплешу его и закрывает. (Иногда так в About делают, тот же Бат кстати).
Костыль конечно — но все же!?!
[skip]
K>Еще раз: а чем (в задаче ТС) не подходит MessageBox со сплэшем-owner-ом, — т.е. заведомо над сплэшем?
Да вроде где-то выше "мелькало" что сплеш в одном процессе, а MessageBox из другого...
Здравствуйте, Carc, Вы писали:
C>[skip]
K>>Еще раз: а чем (в задаче ТС) не подходит MessageBox со сплэшем-owner-ом, — т.е. заведомо над сплэшем? C>Да вроде где-то выше "мелькало" что сплеш в одном процессе, а MessageBox из другого...
Здравствуйте, kero, Вы писали:
K>Здравствуйте, Кодт, Вы писали:
K>>>Ибо такой сплеш заведомо окажется под уже существующими topmost-окнами, например — под тултипами, что смотрится препротивно.
К>>Зато юзабельный.
К>>Кроме того, нефиг окнам неактивного приложения быть топмост. К>>Обычно бесприютные тултипы — это следствие замёрзшего или зависшего приложения. Они в любом случае смотрятся препротивно. К>>А если это какое-то полезное топмост окошко (ну там, не знаю, виджет буфера обмена), то прятать его — подлянка.
K>Тем не менее — именно сплэш в исходном вопросе, а смысл сплэша-экрана — появиться (на некоторое время) поверх остальных окон. K>Про подлянку же — из другой оперы
А вот и фиг! Смысл сплеша показать что мол "не ?сыте, чуваки, мы работаем, запущаемся малёхо", то бишь показать что угу, мол, идет инциализация, ничего не висит. Продемонстрировать быстрый отклик на действия пользователя. А если в конце концов вся эта "украшательная муть" со сплешом приводит к обратному результату, именно что вроде как висит, то это не сплеш, это "шняга-скрин"
K>>>Кроме того, HWND_TOP/HWND_BOTTOM — это для sibling окон, являющимися child для общего parent-окна. По моему опыту
К>>Поскольку парентом попапов выступает десктоп, мы получаем ровно то поведение, которое нам нужно
K>Отнюдь. K>Еще раз: HWND_TOP в случае top-level окон (т.е. в случае десктопа как парента) поместит окно ниже низшего topmost окна, K>тогда как для child окон (рядового parent окна) HWND_TOPMOST попросту не работает.
Ну как вариант, создать окно сплеша с WS_EX_TOPMOST, и невидимым, на WM_SHOWWINDOW снять стиль WS_EX_TOPMOST (да хоть по таймеру через секунду). Оно тогда вроде как и мелькнет, и проблемы нет!?!
Так не подойдет?
Здравствуйте, kero, Вы писали:
K>Здравствуйте, Carc, Вы писали:
C>>[skip]
K>>>Еще раз: а чем (в задаче ТС) не подходит MessageBox со сплэшем-owner-ом, — т.е. заведомо над сплэшем? C>>Да вроде где-то выше "мелькало" что сплеш в одном процессе, а MessageBox из другого...
K>И что?
А что пройдет такой вариант? (без подколки, мне действительно интересно).
Если да, то в какой-нить Виста проблем не будет?
Здравствуйте, Carc, Вы писали:
K>>Про подлянку же — из другой оперы C>А вот и фиг! Смысл сплеша показать что мол "не ?сыте, чуваки, мы работаем, запущаемся малёхо", то бишь показать что угу, мол, идет инциализация, ничего не висит. Продемонстрировать быстрый отклик на действия пользователя. А если в конце концов вся эта "украшательная муть" со сплешом приводит к обратному результату, именно что вроде как висит, то это не сплеш, это "шняга-скрин"
Это вы вроде как в открытую дверь ломитесь На то и сплэш, что — временное окно.
K>>>>Кроме того, HWND_TOP/HWND_BOTTOM — это для sibling окон, являющимися child для общего parent-окна. По моему опыту
К>>>Поскольку парентом попапов выступает десктоп, мы получаем ровно то поведение, которое нам нужно
K>>Отнюдь. K>>Еще раз: HWND_TOP в случае top-level окон (т.е. в случае десктопа как парента) поместит окно ниже низшего topmost окна, K>>тогда как для child окон (рядового parent окна) HWND_TOPMOST попросту не работает. C>Ну как вариант, создать окно сплеша с WS_EX_TOPMOST, и невидимым, на WM_SHOWWINDOW снять стиль WS_EX_TOPMOST (да хоть по таймеру через секунду). Оно тогда вроде как и мелькнет, и проблемы нет!?! C>Так не подойдет?
Т.е. вы полагаете, что owner-ом может быть окно только из того же процесса, что и owned ?
Здравствуйте, kero, Вы писали:
K>Еще раз: HWND_TOP в случае top-level окон (т.е. в случае десктопа как парента) поместит окно ниже низшего topmost окна, K>тогда как для child окон (рядового parent окна) HWND_TOPMOST попросту не работает.
Угу, устранил пробел в своих познаниях.
Тогда просто SetForegroundWindow.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[7]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, kero, Вы писали:
K>Здравствуйте, Carc, Вы писали:
K>>>Про подлянку же — из другой оперы C>>А вот и фиг! Смысл сплеша показать что мол "не ?сыте, чуваки, мы работаем, запущаемся малёхо", то бишь показать что угу, мол, идет инциализация, ничего не висит. Продемонстрировать быстрый отклик на действия пользователя. А если в конце концов вся эта "украшательная муть" со сплешом приводит к обратному результату, именно что вроде как висит, то это не сплеш, это "шняга-скрин"
K>Это вы вроде как в открытую дверь ломитесь На то и сплэш, что — временное окно.
Причем тут "открытая дверь"? Чего-то не понял намека!?! О чем речь? Я же о проблеме в общем плане, но в конкретном случае, а вовсе не о терминологии?
K>>>>>Кроме того, HWND_TOP/HWND_BOTTOM — это для sibling окон, являющимися child для общего parent-окна. По моему опыту
К>>>>Поскольку парентом попапов выступает десктоп, мы получаем ровно то поведение, которое нам нужно
K>>>Отнюдь. K>>>Еще раз: HWND_TOP в случае top-level окон (т.е. в случае десктопа как парента) поместит окно ниже низшего topmost окна, K>>>тогда как для child окон (рядового parent окна) HWND_TOPMOST попросту не работает. C>>Ну как вариант, создать окно сплеша с WS_EX_TOPMOST, и невидимым, на WM_SHOWWINDOW снять стиль WS_EX_TOPMOST (да хоть по таймеру через секунду). Оно тогда вроде как и мелькнет, и проблемы нет!?! C>>Так не подойдет?
K>Т.е. вы полагаете, что owner-ом может быть окно только из того же процесса, что и owned ?
Я не полагаю, я об это впрямую спросил в соседнем посте
Здравствуйте, Carc, Вы писали:
К>>Это было бы самым правильным — снабдить сплеш-скрин функцией самозахлопывания, да уж больно некрасиво и неочевидно для пользователя. C>Жирными таким БОЛЬШИМИ такими букафками на сплеше написать "Кликните чтобы закрыть". И любой клик по сплешу его и закрывает. (Иногда так в About делают, тот же Бат кстати). C>Костыль конечно — но все же!?!
Дык некрасиво. И боюсь, красивого решения здесь просто нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[7]: ShowMessage со стилем WS_POPUP как сделать?
K>>>>Еще раз: а чем (в задаче ТС) не подходит MessageBox со сплэшем-owner-ом, — т.е. заведомо над сплэшем? C>>>Да вроде где-то выше "мелькало" что сплеш в одном процессе, а MessageBox из другого... K>>И что? C>А что пройдет такой вариант? (без подколки, мне действительно интересно). C>Если да, то в какой-нить Виста проблем не будет?
Все будет хорошо.
Как много веселых ребят, и все делают велосипед...
Re[7]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, kero, Вы писали:
K>Это вы вроде как в открытую дверь ломитесь На то и сплэш, что — временное окно.
Нет ничего более постоянного, чем временное.
А если во время этого временного окна приложение захотело чего-то спросить-сказать?
Неважно — в этом же процессе, в чужом процессе... Хотя межпроцессный барьер добавляет мороки в изобретании костылей.
Проблема в том, что в иногда в некоторых виндах (кажется в висте и семерке, но иногда и в XP бьвает) сплеш скрин перекрывает то сообщение об ошибке, юзер его не замечает (несмотря на то, что в таскбаре новое окно появляется), и юзер жалуется что прога зависла.
Так что не в открытую дверь ломимся, а в крепко заколоченное окно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[8]: ShowMessage со стилем WS_POPUP как сделать?
Виноват, когда отвечал на ваше предыдущее, еще не читал ваше последующее
Ну, если вдруг в Висте или в 7-ке это не так — значит, там порушено одно из определяющих свойств отношений owner/owned.
Думаю — это вряд ли (хотя ни Висту, ни 7-ку сам еще не трогал)...
Для скоростной проверки могу предложить свою поделку: ParentOwner
Здравствуйте, ononim, Вы писали:
K>>>>>Еще раз: а чем (в задаче ТС) не подходит MessageBox со сплэшем-owner-ом, — т.е. заведомо над сплэшем? C>>>>Да вроде где-то выше "мелькало" что сплеш в одном процессе, а MessageBox из другого... K>>>И что? C>>А что пройдет такой вариант? (без подколки, мне действительно интересно). C>>Если да, то в какой-нить Виста проблем не будет? O>Все будет хорошо.
Хм... не знал. Век живи, век учись! СПАСИБО!
А есть какие-нибудь подводные камни?
.
K>Виноват, когда отвечал на ваше предыдущее, еще не читал ваше последующее
K>Ну, если вдруг в Висте или в 7-ке это не так — значит, там порушено одно из определяющих свойств отношений owner/owned. K>Думаю — это вряд ли (хотя ни Висту, ни 7-ку сам еще не трогал)...
K>Для скоростной проверки могу предложить свою поделку: ParentOwner
Здравствуйте, kero, Вы писали:
K>Еще раз: а чем (в задаче ТС) не подходит MessageBox со сплэшем-owner-ом, — т.е. заведомо над сплэшем?
Усложнением не подходит.
Тебе нужно из процесса Б просечь, что запущен процесс А и у него есть окно (сплеш-скрин), и успеть прицепиться к этому окну.
А затем из процесса А — не убиваться, пока процесс Б не отцепил свои дочерние окна (месседж-боксы).
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[5]: ShowMessage со стилем WS_POPUP как сделать?
Здравствуйте, Кодт, Вы писали:
K>>Еще раз: а чем (в задаче ТС) не подходит MessageBox со сплэшем-owner-ом, — т.е. заведомо над сплэшем?
К>Усложнением не подходит.
Усложнением чего ? Пока не вижу какого-то иного внятного решения (чтобы со сплэшем итд).
Кстати, могу подкинуть и еще вариант с усложнением: хук на создание (не-owned) MessageBox с подменой DlgProc, чтобы поддерживал себя на самом топе, пока треба.