Форум: "Основная";
Текущий архив: 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