![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Ну раз предыдущее сообщение было удалено бесследно, значит пусть участники форума остаются без правильного и корректного решения задачи.
Спасибо. -------------------- |
|||
|
||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 25 Всего: 155 |
Демо, раз не пользуемся поиском... и не видем что данная тема разжеванна и на Vingrad-е(и не однакратно!)... то какой смысл оставлять ссылку... на конкурирующий ресурс? Реклама?
Без "правильного и корректного" решения остануться только те, кто поленился сделать пару кликов... - енто раз! А второе... автор темы спрашивает не решение... а о правильности уже имеющегося решения! PS: Тема закрыта! Тему открыл... что бы каждый мог высказаться... и предложить решения... которых якобы у нас нету. Это сообщение отредактировал(а) Girder - 9.3.2006, 13:25 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
Alex |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 6 Всего: 162 |
Тема действительно не однократно, обсуждалась как у нас так и на многих форумах, сказано по ней много, примеров реализации не меньше, какие-то из них перестали работать в Win NT, какие-то продолжают работать по сей день, многие из них не универсальны, срабатывают не всегда или по просту не экономичны по отношению к ресурсам с точки зрения программирования под Delphi. Хотя кажется, что тут сложного, взять и где-то запомнить уникальный идентификатор приложения и при старте проверять, то место куда мы его запоминаем, если там есть данные, то значит приложение уже запущено. На помощь в этом деле к нам приходят возможность хранения файла данных в памяти процесса.
Вот модуль, который сделает все, что нужно:
Пример использования:
Это сообщение отредактировал(а) Alex - 9.3.2006, 13:32 -------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
||||
|
|||||
Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Не совсем всё. В приведенном классе не реализовано выдвижение уже запущенного приложения на передний план для ОС W2000 и выше.
будет работать неправильно. Ссылка на MSDN: http://msdn.microsoft.com/library/default....roundwindow.asp Добавлено @ 13:58 Вот код, который выполняет восстановление приложения:
(с) Rouse_ Для этого приложение, которое должно быть восстановлено, должно получить сообщение RestoreOldInstance. Добавлено @ 14:00 Girder, Существует ли где-либо на винграде такой код?;) Добавлено @ 14:00 Или есть другие варианты? С удовольствием посмотрю и попробую Это сообщение отредактировал(а) Демо - 9.3.2006, 14:02 -------------------- |
||||
|
|||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 25 Всего: 155 |
Ссылку я тебе давал http://forum.vingrad.ru/index.php?showtopi...st&p=450839
Приспособить его... енто дело пяти секунд ![]() PS: Причем дата ентого поста(на винграде)... горазда раньше... чем на исходниках. Так что делай выводы ![]() ![]() ![]() -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Girder,
Поискал в форумах, в FAQ по ключевому слову SystemParametersInfo. ничего не нашел;) А именно изменения таймаута - один из ключевых моментов. Приспособить не только можно. Но и нужно. ![]() Вообще, видимо придется с нуля реализовать - сделать полный пример. -------------------- |
|||
|
||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 25 Всего: 155 |
Приведи пример... где без них не будет работать.
-------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Да какой тут пример. Попробуй пару вариантов: 1. Сверни приложение, на передний план выдвинь другое. Стартуй второую копию. 2. Не сворачивая приложение все то же самое, что и в п.1. После этих манипуляций и выполнения кода по восстановлению результат должен быть таким: Первая копия приложения должна развернуться на передний план на экране и получить фокус ввода. В разных версиях Windows будет отличаться результат. -------------------- |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Girder,
Для чистоты эксперимента все равно придется реализовать полный цикл : 1. Опреджеление уже запущенной копии программы. 2. Извещение запущенной копии каким-либо образом о том, что сделана попытка запуска еще копии. 3. Поднятие первой копии наверх. -------------------- |
|||
|
||||
Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 6 Всего: 162 |
Вот, модифицировал модуль:
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Alex,
Вроде бы все отлично на W2000 Server! Надо протестировать на W98, XP SP1, XP SP2 еще. -------------------- |
|||
|
||||
Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 6 Всего: 162 |
Я тестировал, на SP2 и 98
Это сообщение отредактировал(а) Alex - 9.3.2006, 18:00 -------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 15 Всего: 55 |
Господа.
О чем базар! Демо, ты первый вариант Alex'а точно проверял? Или только предполагаешь что SetForegroundWindow(HPtr^) будет работать неправильно? Я вот например таким вот способом пользуюсь уже не первый год. До сих пор проблем не было. Более того, раз уж отсылаешь к MSDN, то будь добр, поясни тогда мне бестолковому, почему в данном случае, SetForegroundWindow(HPtr^) не должна сработать? Только подчеркиваю, именно в данном случае, а не в том в котором его используешь ты! Вот при твоем подходе да, тут мне ясно почему ты не получишь от SetForegroundWindow нужного тебе эффекта. Короче, хотелось-бы получить толковые разяснения, либо забери свои слова обратно ![]() -------------------- Все знать невозможно, но хочется |
|||
|
||||
Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Первый - это какой? Дата 9.3.2006, 13:31? Так мне не нужно его проверять, так как с этим вариантом в свое время повозился сколько-то. Вот последний работает однозначно. Только еще бы на XP SP1 проверить. Добавлено @ 01:35
Я же привел ссылку из MSDN, где описана ситуация? Вот точная цитата из MSDN: Windows 98, Windows 2000: The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true: - The process is the foreground process. - The process was started by the foreground process. - The process received the last input event. - There is no foreground process. - The foreground process is being debugged. - The foreground is not locked (see LockSetForegroundWindow). - The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo). - Windows 2000: No menus are active. Чем данный случай отличается от общего?
Почему?;) Это сообщение отредактировал(а) Демо - 10.3.2006, 01:52 -------------------- |
||||
|
|||||
Петрович |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 15 Всего: 55 |
Ну вот, ты так и не удосужился разобраться.
Именно он.
Вот именно, что последний, функцианально мало чем отличается от первого. А если быть более точным, то в плане работы SetForegroundWindow(HPtr^) - вообще НИЧЕМ!. Т.е., первый вариант работает так-же как и второй.
Дык читать я и сам умею. Ты мне докажи что ни одно из преречисленных условий не выполняется для примера Alex'а ! Лично я считаю что для него выполняется условие номер 1. Поэтому, SetForegroundWindow(HPtr^) прекрастно выполнит свое дело. А что в твоем понимания есть "общий" случай? Я лично вижу в данном топике два случая, твой (точнее Rose) и Alex'а. А вот они имеют одно очень существенное в данном случае отличие: У Alex'а, вызов SetForegroundWindow делается из второй копии приложения, а в тебя из первой. Вот в этом и есть главное отличие! Именно поэтому, у тебя не выполняется первое условие. Вот и приходится извращаться с AttachThreadInput и SystemParametersInfo, дабы играя на побочных эффектах достич выполнения третьего условия. В общем, надо с большим вниманием читать приводимые примеры и сопоставлять их с документацией. Это сообщение отредактировал(а) Петрович - 10.3.2006, 02:55 -------------------- Все знать невозможно, но хочется |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |