Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];

Вниз

Как, зная имя EXE, определить Handle окна этой программы   Найти похожие ветки 

 
dreamse   (2008-02-03 18:57) [0]

Нужно определить хендл окошка, зная его EXE и полный путь


 
Сергей М. ©   (2008-02-03 19:01) [1]

Какого окошка-то ?

Приложение в ходе работы может создать кучу окошек, равно как не создать ни одного.

Да и экземпляров приложения может быть более одного.


 
dreamse   (2008-02-03 19:06) [2]

В общем задача в следующем. Нужно определить список всех запущенных приложений. Это есть.
Потом выбрать из них те приложения которые мне нужно закрыть.
Отправить им сообщение типа

PostMessage(FindWindow(nil, Pchar(GetText(Wnd))), WM_CLOSE, 0, 0);

В сообщении передается Хендл окошка программы.

Может существуют другие решения этой задачи ?

Смысл отправки такого сообщения в том что приложение успеет обработать выход и корректно завершиться, например удалить свою иконку из трея.
Если же жестко убивать приложение то остаются иконки в трее и пр.


 
ketmar ©   (2008-02-03 19:11) [3]

а если нежно убивать, то оно возьмёт — и пошлёт тебя в пень вместе с твоими сообщениями. не отреагирует, например, и всё. или выведет 25 диалогов «а вы точно-точно хотите закрыть меня?»


 
ketmar ©   (2008-02-03 19:13) [4]

другие решения этой задачи обычно заключаются в предоставлении пользователю права решать, какие программы он хочет закрыть, и дальше он их закрывает штатными средствами.

честно, это вполне разумное решение.

если пишешь «программу для клуба» — там можно, например, вообще logout сделать — винда сама всех прихлопнет.

и ты пы.


 
Сергей М. ©   (2008-02-03 19:14) [5]

см. EnumWindows + GetWindowThreadProcessId


 
dreamse   (2008-02-03 19:14) [6]

> ketmar ©   (03.02.08 19:11) [3]

Именно для этого случая я делаю так :

PostMessage(FindWindow(nil, Pchar(GetText(Wnd))), WM_CLOSE, 0, 0);
PostMessage(FindWindow(nil, Pchar(GetText(Wnd))), WM_QUIT, 0, 0);}
KillTask(""); // Хана программе и её окошкам с запросами завершения

По этому предпочтительнее сначала попробывать окуратно закрыть ... а если не поймет при прихлопнуть


 
dreamse   (2008-02-03 19:15) [7]

> ketmar ©   (03.02.08 19:13) [4]

Пишу утилиту обновления, нужно свои программы запущенные завершать чтобы обновить их новыми файлами а затем заново запустить.


 
Сергей М. ©   (2008-02-03 19:18) [8]


> нужно свои программы запущенные завершать


Таким изуверским способом ?!

Это же твои программы)

А раз они твои, то что мешает "научить" их реагировать нужным образом, к примеру, на некое предопределенное тобой сообщение ?


 
dreamse   (2008-02-03 19:26) [9]

> Сергей М. ©   (03.02.08 19:18) [8]

В дистрибутива могут входить не только мои приложения, но и так же дополнительно написанные другими программистами модули.

Ничего изуверского не вижу :) Есть варианты по мягкому обновлению программного обеспечения ? Я с удовольствием выслушаю более опытного в этом плане коллегу.


 
ketmar ©   (2008-02-03 19:29) [10]

>[7] dreamse (03.02.08 19:15)
обалдеть.

посмотри в сторону event"ов, например. махнул ивентом — все схлопнулись. красиво, удобно, и не надо заниматься непонятными поисками.


 
ketmar ©   (2008-02-03 19:30) [11]

>[9] dreamse (03.02.08 19:26)
>В дистрибутива могут входить не только мои приложения, но и так же
>дополнительно написанные другими программистами модули.

кого волнует? стандартизируется некоторая реакция на некоторые собития, и всё. кто реакции не делает — тому больно бить по лицу и зарплате.


 
Сергей М. ©   (2008-02-03 19:34) [12]


>  написанные другими программистами модули


Ты бы сначала о своих модулях позаботился)


> Есть варианты по мягкому обновлению программного обеспечения
> ?


Если рассматривать все модули "скопом" (без разбору, свои или чужие), универсального варианта нет - каждый разработчик творит в своих алгоритмах все что ему вздумается. Одни приложения вполне адекватно реагируют на WM_CLOSE, другие плюют на него с высокой колокольни.


 
ketmar ©   (2008-02-03 19:39) [13]

кстати, не надо событий, я поторопился. достаточно RegisterWindowMessage() и броадкаста. %-)


 
dreamse   (2008-02-03 19:40) [14]

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

Я знаю как сделать, нужно тупо вывести список окон и перебрать их при этом получая Id процесса через GetWindowThreadProcessId

просто думал что есть готовый вариант какой то, придеться писать свою обработку.

Всем спасибо.


 
dreamse   (2008-02-03 19:41) [15]

Ваши предложения несоменно правильнее. но на данном этапе сделаю все просто.

Спасибо всем за участие в обсуждении.


 
ketmar ©   (2008-02-03 19:42) [16]

натурально, не правильно. нас же дети читают, увидят такое решение и скопируют ещё, не приведи Бафомет.


 
Сергей М. ©   (2008-02-03 19:42) [17]


> ketmar ©   (03.02.08 19:39) [13]


Бродкаст м.б. и хорош, если целевые процессы создают хотя бы одно в/у окно. А если нет ? А если целевой процесс, к тому же, есть сервис-процесс ? Прежде чем принимать решение, нужно четко представлять, какие ингредиенты возможны в этой солянке сборной)


 
ketmar ©   (2008-02-03 19:43) [18]

>[14] dreamse (03.02.08 19:40)
>просто думал что есть готовый вариант какой то, придеться писать свою
>обработку.

учитывая, что твой метод несколько… хм… неверный — готовых решений нет. руками, всё руками. для готовых «без боли» таки меняй логику.


 
ketmar ©   (2008-02-03 19:44) [19]

>[17] Сергей М. ©(03.02.08 19:42)
ну, поскольку автор убивает именно окна, я предположил, что окна есть. %-)


 
Сергей М. ©   (2008-02-03 19:44) [20]


> придеться писать свою обработку


Обработку чего ?
Удовлетвори уж любопытство "рассуждающей общественности")


 
dreamse   (2008-02-03 19:46) [21]

> ketmar ©   (03.02.08 19:43) [18]

Пытаюсь сразу убить двух зайцев, делаю как бы универсальную обновлялку для всех проектов. + так же для тех проектов где вообще не предусматриваться обновление ( например сторонние проекты, обновление для которых получаются по Email) . Так что внедрить реакцию на события во все приложения не представляться возможным :(


 
dreamse   (2008-02-03 19:48) [22]

> Сергей М. ©   (03.02.08 19:44) [20]

1. получаем список всех окон
2. получаем Id интересующего нас процесса
3. Перебираем все окна и отправляем сообщение о закрытии каждому окну ( или первому ) на закрытие если его породил наш процесс


 
ketmar ©   (2008-02-03 19:48) [23]

>[21] dreamse (03.02.08 19:46)
тогда тебя и убивалка не спасёт. а проект чужой взял — и воткнул сервис, например. а сервису прописал флажок «авторестарт при падении». ты сервис пришиб (и то если прав хватило), а винда перезапустила тут же. опа?

у тебя в итоге получится по заглушке на каждую интересную софтину. ужос. беги от этой задачи, пока не поздно.


 
dreamse   (2008-02-03 19:55) [24]

> ketmar ©   (03.02.08 19:48) [23]

Этот вариант уже учтен, будет список с именами сервисов, соответственно если Exe файл в зависимости от списка ( имя файла, MD5 и пр. ) является сервисом то мы его останавливаем и деинстлируем, после обновления запускаем и инсталлируем повторно

/Install
/Uninstall


 
ketmar ©   (2008-02-03 20:08) [25]

>[24] dreamse (03.02.08 19:55)
а сервис, зараза, не реагирует, например, на команду останова. а при убивании его винда перезапускает. или вообще пытается себя восстановить.

да мало ли… неужели я тебя ещё не напугал? тогда можем сместиться в сторону драйверов, например. %-)


 
dreamse   (2008-02-03 20:20) [26]

> ketmar ©   (03.02.08 20:08) [25]

:)

Будем думать.


 
ketmar ©   (2008-02-03 20:29) [27]

>[26] dreamse (03.02.08 20:20)
да чего тут думать? при такой постановке молиться надо. не садись ты за баранку этого тарантаса, нервы крепче будут. %-)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.006 c
15-1220905107
Riply
2008-09-09 00:18
2008.11.02
Просмоторщик lib файлов.


15-1220722274
Dmitry S
2008-09-06 21:31
2008.11.02
Недокументированая возможность TStringList.Find


15-1221146089
@!!ex
2008-09-11 19:14
2008.11.02
Как заменить кадры видео с помощью VirtualDub?


2-1222019809
Сергей
2008-09-21 21:56
2008.11.02
Алгорит записей в БД накладных...


1-1201761034
mix
2008-01-31 09:30
2008.11.02
Вопрос по Drag&Dock





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский