Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.02;
Скачать: CL | DM;

Вниз

Как, зная имя 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.041 c
15-1220979515
AlexDan
2008-09-09 20:58
2008.11.02
SOS?..


1-1201861006
Still Swamp
2008-02-01 13:16
2008.11.02
Обшуршивание компонент на предмет строк


2-1222028467
programmer90
2008-09-22 00:21
2008.11.02
Проблема с маской


2-1222147865
vegarulez
2008-09-23 09:31
2008.11.02
Вопрос про хук.


2-1222331714
Dennis I. Komarov
2008-09-25 12:35
2008.11.02
TListView + Editing