Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Как получить Handle чужого консольного окна? |
Автор: ЧеловекБорща 1.10.2010, 20:48 | ||
Доброе время суток! Суть заключается в том, чтобы найти окно запускаемой программы и изменить его заголовок на свой. Программы запускаю в TThread используя CreateProcess. Для получения списка окон использую EnumThreadWindows.
Проблема в том что это работает только с "оконными" программами. Почему не работает с консолями? Может нужен ещё какой-нибуть флаг в GetWindowLong? ![]() |
Автор: bems 1.10.2010, 20:53 |
До семерки консольными окнами владеет csrss.exe |
Автор: ЧеловекБорща 1.10.2010, 21:09 |
Я ищу окно запускаемой мною программы а не окна других процессов. |
Автор: bems 1.10.2010, 21:14 |
Консольное окно особое. Например что происходит, когда консольная программа запускает другую (тоже консольную), а сама закрывается? Дочерний процесс будет спокойно работать со старой консолью. Это было бы невозможно, если бы консольное окно принадлежало потоку, работающему в рамках родительского процесса. По этой причине все консольные окна должны уметь жить дольше, чем поток. А значит их нельзя получить при перечислении окон потока |
Автор: ЧеловекБорща 1.10.2010, 21:21 |
эмм а как тогда быть? Как найти консольное окно и определить его принядлежность к процессу? |
Автор: bems 1.10.2010, 21:24 |
ЧеловекБорща, Сделай еще перед запуском AllocConsole и GetConsoleWindow. А потом запускай процесс, и он унаследует твою консоль |
Автор: ЧеловекБорща 1.10.2010, 22:14 | ||
Спасибо за подсказку, но непонимаю как реализовать.. Можно привести пример пожалуйста? ![]() Есть кусок кода:
|
Автор: bems 2.10.2010, 07:12 | ||
Добавлено через 14 минут и 46 секунд Или, если не желательно чтобы все процессы разделяли общею консоль, то: CreateProcess AttachConsole GetConsoleWindow FreeConsole |
Автор: ЧеловекБорща 2.10.2010, 18:12 | ||
Что-то я недопонимаю..
суть заключается в том чтобы изменить заголовок окна консоли которую запускаю. что я делаю не так? |
Автор: bems 2.10.2010, 19:59 | ||
Вот, как-то так. Время в Sleep выбирай под свою задачу (можно и убрать, но тогда будешь вхолостую жечь такты в ожидании, пока процесс создаст консоль, и мозможно поменяешь заголовок еще до того как cmd установит свой) |
Автор: ЧеловекБорща 2.10.2010, 22:19 | ||
странно неработает..
Комментарием отмечено. Почему-то неработает.. |
Автор: bems 2.10.2010, 23:36 |
У меня работало. Err чему равно? Добавлено через 3 минуты и 42 секунды откуда у calc.exe консоль? |
Автор: ЧеловекБорща 3.10.2010, 12:47 | ||
Err равно 31. Calc.exe это не калькулятор, это консолька которую я положил в папку программы.
|
Автор: bems 3.10.2010, 13:01 |
Сделай в теле цикла Code := 0 и скажи чему он равняется после выхода из цикла |
Автор: bems 3.10.2010, 13:31 |
впрочем лучше присвой $FFFFFFFF |
Автор: ЧеловекБорща 3.10.2010, 15:35 |
ничего не изменилось.. или я что-то не так сделал? |
Автор: bems 3.10.2010, 15:36 |
Автор: ЧеловекБорща 3.10.2010, 16:35 | ||
Непонимамаю как это сделать. ![]()
Можно описать что нужно сделать чтобы посмотреть "чему оно равно после выходи из цикла"? |
Автор: bems 3.10.2010, 16:50 |
Вместо нуля поставь $FFFFFFFF. В строке 31 вместо RaiseLastOSError напиши begin AllocConsole; writeln(Code) end; Посмотри что выведется в консоль |
Автор: ЧеловекБорща 3.10.2010, 17:05 |
Спасибо за терпение=) в консоль отписало 259 |
Автор: bems 3.10.2010, 19:39 |
по логике вещей получается что такого не может быть. давай-ка весь неработащий проект |
Автор: ЧеловекБорща 3.10.2010, 20:38 |
Пожалуйста.. |
Автор: bems 3.10.2010, 21:03 |
Да что ж такое... Я там не вижу попыток использовать моё решение. |
Автор: ЧеловекБорща 3.10.2010, 21:45 |
Забыл сохранить изменения.. Но теперь пишет 0, но не изменяет заголовка. |
Автор: bems 3.10.2010, 22:07 |
Постарайся перестать тупить. Когда сказал вместо нуля поставь $FFFFFFFF, разумеется имелось в виду Code, а не Err Это нужно было чтобы увидеть меняется ли вообще Code. У тебя неправильно объявлена AttachConsole, oна stdcall. Если исправить работает мой первоначальный вариант (все остальные изменения были нужны только для диагностики) |
Автор: ЧеловекБорща 3.10.2010, 22:21 | ||
Вот теперь правельно! Благодарю за терпение и помощь ![]()
Вопрос можно считать решённым ![]() |
Автор: bems 3.10.2010, 22:26 |
ни code:=$FFFFFFFF, ни ветка с AllocConsole не нужны |