692 / 5492 / 265
Регистрация: 11.08.2016
Сообщений: 3,417
1

Как получить хендл консольного окна?

08.07.2019, 17:58. Показов 3936. Ответов 15

Author24 — интернет-сервис помощи студентам
Я запускаю из основной программы (неконсольной) консольное приложение при помощи ShellExecuteEx. Я знаю хендл его процесса. Как мне найти хендл консольного окна?
Пробовал искать при помощи EnumWindows и GetWindowThreadProcessId - не вышло.
Пробовал при помощи FindWindowEx - тоже.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2019, 17:58
Ответы с готовыми решениями:

Как получить адрес текущего окна зная его Хендл
Добрый день! У меня есть приложение на ВинФорм, и возникла необходимость использовать в этом...

Как получить Хендл меню
Вопрос как получить дескриптор меню СТОРОННЕГО приложения, например блокнота? И добавить туда новые...

Как узнать хендл окна (кнопки), если есть часть его текста?
Как узнать хендл окна(кнопки) если есть часть его текста, и хендл родительського окна, и хендл...

Найти хендл дочернего окна
Нужно найти хендл этого дочернего окна. ...

15
Эксперт С++
3574 / 2828 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
09.07.2019, 08:53 2
Когда создается консоль, стандартный дескриптор ввода является дескриптором буфера ввода консоли, а стандартные дескрипторы вывода и стандартные ошибки являются дескрипторами активного экранного буфера консоли.
C++
1
2
3
4
5
6
HANDLE WINAPI GetStdHandle( _In_ DWORD nStdHandle );
 
// nStdHandle [in]
// STD_INPUT_HANDLE (DWORD)-10
// STD_OUTPUT_HANDLE (DWORD)-11
// STD_ERROR_HANDLE (DWORD)-12
1
692 / 5492 / 265
Регистрация: 11.08.2016
Сообщений: 3,417
09.07.2019, 10:26  [ТС] 3
А с помщью какого из них можно изменить из внешней программы изменить положение консольного окна?
И как их получить из внешней программы? (Консольная - не моя).
0
Эксперт С++
3574 / 2828 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
09.07.2019, 10:50 4
Цитата Сообщение от Ivandur Посмотреть сообщение
А с помщью какого из них можно изменить из внешней программы изменить положение консольного окна?
сейчас речь идёт об окне экранного буфера консоли
Assembler
1
2
3
4
5
6
invoke GetStdHandle, STD_OUTPUT_HANDLE ; получаем дескриптор
mov [stdout], eax ; сохраняем его
 
invoke GetConsoleScreenBufferInfo,[stdout],lpConsoleScreenBufferInfo ; сохраняем инфу в структуру
 
invoke SetConsoleWindowInfo,[stdout],TRUE,ConsoleWindow ; задаем новые параметры
0
692 / 5492 / 265
Регистрация: 11.08.2016
Сообщений: 3,417
09.07.2019, 11:52  [ТС] 5
А как получить хендл консоли из запускающей программы? Не изнутри консоли? (консоль - не моя).
0
Эксперт CЭксперт С++
5117 / 4556 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.07.2019, 12:21 6
Ivandur, да никаких проблем...
C++
1
2
    HWND hWnd = FindWindow(NULL, L"required window title");
    SetWindowPos(hWnd, HWND_TOPMOST, x_new, y_new, 0, 0, SWP_NOSIZE);
0
692 / 5492 / 265
Регистрация: 11.08.2016
Сообщений: 3,417
09.07.2019, 13:54  [ТС] 7
Пробовал, не находит. И EnumWindows не выдаёт.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.07.2019, 14:06 8
Цитата Сообщение от Ivandur Посмотреть сообщение
А как получить хендл консоли из запускающей программы? Не изнутри консоли? (консоль - не моя).
Попробуй сделать AttachConsole (только её надо вызывать из оконного приложения), потом GetStdHandle
1
Эксперт CЭксперт С++
5117 / 4556 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.07.2019, 14:07 9
Ivandur, у меня прекрасно находит. Надо точно задать имя окна.
Попробуй на какой-то известной программке, например, на своей.
0
Эксперт С++
3574 / 2828 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
09.07.2019, 15:17 10
Цитата Сообщение от Ivandur Посмотреть сообщение
не находит
и не найдёт.
у консоли нет гуя, это терминальная служба (conhost).
0
692 / 5492 / 265
Регистрация: 11.08.2016
Сообщений: 3,417
09.07.2019, 15:50  [ТС] 11
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Попробуй сделать AttachConsole (только её надо вызывать из оконного приложения),
Пробовал, выдаёт ошибку 87
0
Эксперт CЭксперт С++
5117 / 4556 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.07.2019, 16:26 12
Ivandur, запусти руками cmd.exe и сделай
C++
1
2
3
    HWND hWnd = FindWindow(NULL, L"C:\\Windows\\system32\\cmd.exe");
    if (hWnd)
        SetWindowPos(hWnd, HWND_TOPMOST, 100, 100, 0, 0, SWP_NOSIZE);
Таки не работает? У меня на 64-битной Win7 все прекрасно работает...
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.07.2019, 16:47 13
Цитата Сообщение от Ivandur Посмотреть сообщение
Пробовал, выдаёт ошибку 87
Похоже, неправильный process id передаёшь
If the specified process does not exist, the error code returned is ERROR_INVALID_PARAMETER (87).
1
692 / 5492 / 265
Регистрация: 11.08.2016
Сообщений: 3,417
10.07.2019, 09:07  [ТС] 14
Запускаю при помощи ShellExecuteEx, и смотрю поле hProcess. В списке, полученном при помощи EnumWindows и GetWindowThreadProcessId его не появляется.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
10.07.2019, 09:14 15
Лучший ответ Сообщение было отмечено Ivandur как решение

Решение

Цитата Сообщение от Ivandur Посмотреть сообщение
Запускаю при помощи ShellExecuteEx, и смотрю поле hProcess.
Я правильно понял, что ты hProcess передаёшь в AttachConsole? Нужно ::GetProcessId(hProcess);

Т.е. ты сам запускаешь этот процесс?
Тогда ты можешь запустить его через CreateProcess и тупо перенаправить ввод/ввывод в свои пайпы, указав их в STARTUPINFO
0
692 / 5492 / 265
Регистрация: 11.08.2016
Сообщений: 3,417
10.07.2019, 16:25  [ТС] 16
GetProcessId(hProcess) помогло.
0
10.07.2019, 16:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2019, 16:25
Помогаю со студенческими работами здесь

Закрывается ли хендл при разрушении окна?
Привет! Какой-то пробел у меня в понимании хендлов... Скажите, пожалуйста: Если я открываю...

Найти хендл чужого окна, зная его атом
как можно найти хендл чужого окна по атому??

Найти хендл второго (а не первого) окна по заданному классу
Помогите пожалуйста обшарил весь интернет и не нашел ответа как мне вписать строку во второе поле...

Получить хендл элемента inputText в браузерном окне
HANDLE браузерного окна есть, как получить HANDLE элемента ума не приложу, помогите пожалуйста


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru