Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как недопустить запуск второй копии программы, Нашел решение, чем оно плохое? 
V
    Опции темы
Петрович
Дата 10.3.2006, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Правда, справедливости ради, надо отметить что мое утверждение:
Цитата(Петрович @ 10.3.2006, 03:33 Найти цитируемый пост)
Лично я считаю что для него выполняется условие номер 1. Поэтому, SetForegroundWindow(HPtr^) прекрастно выполнит свое дело.

тоже не совсем верно. Точнее не для всех случаев.
А если еще точнее, то оно не верно именно для тех случаев, для которых и придумано такое, на первый взгляд странное, поведение SetForegroundWindow.
На самом деле, такое поведение SetForegroundWindow весьма осмысленно. А именно, опишу такой случай, слегка надуманный, но у меня встречается нечто подобное.
Итак:
Имеется программа которая при запуске выполняет некоторую фоновую работу (ну например закачка чего-то из инета). Показ состояния и управление этой работой производится через ее форму.
По ряду причин допустима работа только одной копии программы. По звершению работы, программа автоматически завершается.

Теперь, мне надо заставить выполняться это действо каждый час. Я "заряжаю" эту программу в шедулер. И вот, в один прекрасный час, сталкиваюсь с ситуацией, когда программа еще не завершилось от прошлого часа. Казалось-бы ничего страшного, вторая копия подняла на поверхность первую и сама ушла - именно так и задуманно.
Но, беда в том, что именно в это время, у меня активным было окно эксплорера, в котором я с остервенением (в слепую) набивал ответ в эту тему smile. И что получилось - активным стало окно первой копии, и весь мой последующий ввод попер в него, вместо эксплорера. Ну естественно, это было воспринято как комманда, причем, по случайному стечению обстоятельств я как раз набирал текст format c: <Enter> smile.
Потом были Y и пр. В общем, когда спохватился, спасать было нечего. smile

Таков был-бы сценарий если-бы SetForegroundWindow работал всегда одинаково - то чего добиваешся ты.

Но, слава программерам Microsoft, они, начиная с Windows 98 (наконец то) изменили ее поведение.
Теперь, в описанной ситуации, SetForegroundWindow будет почти проигнорированна! И вместо "всплытия", просто начнет мигать кнопка приложения в таск-баре.

Вот так.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Girder
Дата 10.3.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Но все енто... справедливо только в пределах одного десктопа.

Т.е. если я запускаю копию в другом десктопе... то первое приложение не всплывет smile так что "правильное и корректное решения задачи" всегда надо писать в ковычках smile


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Демо
Дата 10.3.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Петрович @ 10.3.2006, 02:33 Найти цитируемый пост)
Вот именно, что последний, функцианально мало чем отличается от первого. А если быть более точным, то в плане работы SetForegroundWindow(HPtr^) - вообще НИЧЕМ!.


Хм. В плане работы SetForeground да. За одним ма-а-аленьким исключением - работает совместно с функцией AttachThreadInput, что в корне меняет ситуацию.

Цитата(Петрович @ 10.3.2006, 02:33 Найти цитируемый пост)
Т.е., первый вариант работает так-же как и второй.


См. пред. предложение. Условия, в которых выполняется SetForegroundWindow, изменились кардинально.

Цитата(Петрович @ 10.3.2006, 02:33 Найти цитируемый пост)
Ты мне докажи что ни одно из преречисленных условий не выполняется для примера Alex'а !
Лично я считаю что для него выполняется условие номер 1. Поэтому, SetForegroundWindow(HPtr^) прекрастно выполнит свое дело.


А каким образом выполняется первое условие? Приложение, которое надо выдвинуть на передний план, может быть даже не на втором плане, а далее.

Для того, чтобы ни одно из перечисленных условий не выполнялось, достаточно, чтобы выполнялось более одного приложения с GUI и приложение, которое должно быть активировано, было на заднем плане(при условии активности других приложений, конечно).

Цитата(Петрович @ 10.3.2006, 02:33 Найти цитируемый пост)
У Alex'а, вызов SetForegroundWindow делается из второй копии приложения, а в тебя из первой. Вот в этом и есть главное отличие!
Именно поэтому, у тебя не выполняется первое условие.


Нет, не поэтому. Почему? - Условие в пред. предложении.

Цитата(Петрович @ 10.3.2006, 02:33 Найти цитируемый пост)
В общем, надо с большим вниманием читать приводимые примеры и сопоставлять их с документацией.


Очень верное замечание!

Что касается постинга Дата 10.3.2006, 02:52, то пример, конечно же, надуман. Всё, что касается проблем, связанных с SetForeground, касается только лишь тех задач, которые инициированы пользователем.
Т.е. пользователь желает запустить приложение (именно пользователь). В этот момент ему именно это и нужно(а не системе со своими задачами по расписанию).
В том случае, если приложение уже запущено, но скрыто под другими 20-ю приложениями, и нужно активировать предыдущую копию, выдвинув ее на передний план без дополнительных телодвижений(клик на панели задач).
Заметь, что пользователю именно это и нужно!


--------------------
    
PM MAIL ICQ Skype   Вверх
Петрович
Дата 10.3.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Согласен.
Все течет все изменяется. Некоторые решения устаревают и становятся "некорректными" сами собой - просто меняются технологии. Вот и с десктопами так. smile


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Демо
Дата 10.3.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Girder @ 10.3.2006, 09:59 Найти цитируемый пост)
Но все енто... справедливо только в пределах одного десктопа.


Конечно. С несколькими рабочими столами не приходилось работать, но думаю, что и в такой ситуации есть какое-нибудь решение.

Это сообщение отредактировал(а) Демо - 10.3.2006, 10:08


--------------------
    
PM MAIL ICQ Skype   Вверх
Петрович
Дата 10.3.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Демо, Мне лень с тобой спорить. Но, последнее что скажу, так это то что ты так и не проверил первый вариант Alex'а. И даже не удосужился понять его суть.
Цитата(Демо @ 10.3.2006, 11:01 Найти цитируемый пост)
А каким образом выполняется первое условие? Приложение, которое надо выдвинуть на передний план, может быть даже не на втором плане, а далее.

То которое надо "поднять" да. Но, приведенный перечень условий относится к приложению вызывающему SetForegroundWindow. А вторая копия, из которой вызывается SetForegroundWindow у Alex'а, как раз и есть то приложение которое было "только что" запущено.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Демо
Дата 10.3.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Петрович,
Girder,
Alex,

Всё, признаю ошибку.
Похоже, Петрович прав, и в MSDN именно и написано о процессе, вызывающем SetForegroundWindow.
Первый вариант от Alex у меня срабатывает.
Попрошу знакомых протестировать на разных системах.

PS.

А английский, конечно, хотелось бы знать лучше;)

Это сообщение отредактировал(а) Демо - 10.3.2006, 10:23


--------------------
    
PM MAIL ICQ Skype   Вверх
Rouse_
Дата 10.3.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Зачем попусту спорить? Это же и так очевидно что SetForegroundWindow нужно делать из активного приложения, а мой код был написан для других целей, чтобы показать как это сделать из приложения не являющегося активным, что он собственно и делает smile

ЗЫ: Любой овощь хорошь только будучи употреблен в нужное время smile © ИШ


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Alex
Дата 10.3.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 6
Всего: 162



Цитата(Rouse_ @ 10.3.2006, 10:36 Найти цитируемый пост)
Любой овощь хорошь только будучи употреблен в нужное время

smile


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Петрович
Дата 10.3.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Rouse_ @ 10.3.2006, 11:36 Найти цитируемый пост)
ЗЫ: Любой овощь хорошь только будучи употреблен в нужное время  © ИШ

Более чем точно.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.