| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 не нужны |