![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 15 Всего: 55 |
Правда, справедливости ради, надо отметить что мое утверждение:
тоже не совсем верно. Точнее не для всех случаев. А если еще точнее, то оно не верно именно для тех случаев, для которых и придумано такое, на первый взгляд странное, поведение SetForegroundWindow. На самом деле, такое поведение SetForegroundWindow весьма осмысленно. А именно, опишу такой случай, слегка надуманный, но у меня встречается нечто подобное. Итак: Имеется программа которая при запуске выполняет некоторую фоновую работу (ну например закачка чего-то из инета). Показ состояния и управление этой работой производится через ее форму. По ряду причин допустима работа только одной копии программы. По звершению работы, программа автоматически завершается. Теперь, мне надо заставить выполняться это действо каждый час. Я "заряжаю" эту программу в шедулер. И вот, в один прекрасный час, сталкиваюсь с ситуацией, когда программа еще не завершилось от прошлого часа. Казалось-бы ничего страшного, вторая копия подняла на поверхность первую и сама ушла - именно так и задуманно. Но, беда в том, что именно в это время, у меня активным было окно эксплорера, в котором я с остервенением (в слепую) набивал ответ в эту тему ![]() ![]() Потом были Y и пр. В общем, когда спохватился, спасать было нечего. ![]() Таков был-бы сценарий если-бы SetForegroundWindow работал всегда одинаково - то чего добиваешся ты. Но, слава программерам Microsoft, они, начиная с Windows 98 (наконец то) изменили ее поведение. Теперь, в описанной ситуации, SetForegroundWindow будет почти проигнорированна! И вместо "всплытия", просто начнет мигать кнопка приложения в таск-баре. Вот так. -------------------- Все знать невозможно, но хочется |
|||
|
||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 25 Всего: 155 |
Но все енто... справедливо только в пределах одного десктопа.
Т.е. если я запускаю копию в другом десктопе... то первое приложение не всплывет ![]() ![]() -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Хм. В плане работы SetForeground да. За одним ма-а-аленьким исключением - работает совместно с функцией AttachThreadInput, что в корне меняет ситуацию. См. пред. предложение. Условия, в которых выполняется SetForegroundWindow, изменились кардинально. А каким образом выполняется первое условие? Приложение, которое надо выдвинуть на передний план, может быть даже не на втором плане, а далее. Для того, чтобы ни одно из перечисленных условий не выполнялось, достаточно, чтобы выполнялось более одного приложения с GUI и приложение, которое должно быть активировано, было на заднем плане(при условии активности других приложений, конечно). Нет, не поэтому. Почему? - Условие в пред. предложении.
Очень верное замечание! Что касается постинга Дата 10.3.2006, 02:52, то пример, конечно же, надуман. Всё, что касается проблем, связанных с SetForeground, касается только лишь тех задач, которые инициированы пользователем. Т.е. пользователь желает запустить приложение (именно пользователь). В этот момент ему именно это и нужно(а не системе со своими задачами по расписанию). В том случае, если приложение уже запущено, но скрыто под другими 20-ю приложениями, и нужно активировать предыдущую копию, выдвинув ее на передний план без дополнительных телодвижений(клик на панели задач). Заметь, что пользователю именно это и нужно! -------------------- |
||||
|
|||||
Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 15 Всего: 55 |
Согласен.
Все течет все изменяется. Некоторые решения устаревают и становятся "некорректными" сами собой - просто меняются технологии. Вот и с десктопами так. ![]() -------------------- Все знать невозможно, но хочется |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Конечно. С несколькими рабочими столами не приходилось работать, но думаю, что и в такой ситуации есть какое-нибудь решение. Это сообщение отредактировал(а) Демо - 10.3.2006, 10:08 -------------------- |
|||
|
||||
Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 15 Всего: 55 |
Демо, Мне лень с тобой спорить. Но, последнее что скажу, так это то что ты так и не проверил первый вариант Alex'а. И даже не удосужился понять его суть.
То которое надо "поднять" да. Но, приведенный перечень условий относится к приложению вызывающему SetForegroundWindow. А вторая копия, из которой вызывается SetForegroundWindow у Alex'а, как раз и есть то приложение которое было "только что" запущено. -------------------- Все знать невозможно, но хочется |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Петрович,
Girder, Alex, Всё, признаю ошибку. Похоже, Петрович прав, и в MSDN именно и написано о процессе, вызывающем SetForegroundWindow. Первый вариант от Alex у меня срабатывает. Попрошу знакомых протестировать на разных системах. PS. А английский, конечно, хотелось бы знать лучше;) Это сообщение отредактировал(а) Демо - 10.3.2006, 10:23 -------------------- |
|||
|
||||
Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 18 Всего: 29 |
Зачем попусту спорить? Это же и так очевидно что SetForegroundWindow нужно делать из активного приложения, а мой код был написан для других целей, чтобы показать как это сделать из приложения не являющегося активным, что он собственно и делает
![]() ЗЫ: Любой овощь хорошь только будучи употреблен в нужное время ![]() |
|||
|
||||
Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 6 Всего: 162 |
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 15 Всего: 55 |
Более чем точно. -------------------- Все знать невозможно, но хочется |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |