Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/47: Рейтинг темы: голосов - 47, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 14

Получение HWND окна по дескриптору процесса

16.09.2018, 11:03. Показов 9728. Ответов 16

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста, мне надо узнать хэндл окна по дескриптору процесса, возможно ли вообще это сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.09.2018, 11:03
Ответы с готовыми решениями:

Получение имени окна приложения по его дескриптору
Подскажите пожалуйста как по дескриптору окна приложения узнать имя этого приложения HWND hwnd=GetActiveWindow();//получаем дескриптор...

Как получить HWND окна/процесса/консоли
Как получить HWND окна/процесса/консоли? мне надо для Shellexecute. Реализация в Dll #include "hooklib\MinHook.h" #include...

Найти HWND окна, зная HWND окна, породившего его
Здравствуйте! Имеется основное окно "А". Это окно создаёт новое недочернее окно "Б". Необходимо найти HWND окна "Б",...

16
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 14
16.09.2018, 23:08  [ТС]
У меня получилось так сделать, если кому-то понадобиться решить такую же проблему пишите в лс мне)
я лабу не буду удалять, вам скину)
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
17.09.2018, 00:12
Цитата Сообщение от donny53 Посмотреть сообщение
надо узнать хэндл окна по дескриптору процесса
у процесса может быть несколько окон или вообще ни одного.
проще всего перебрать EnumWindows
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <Windows.h>
#include <list>
 
struct Params {
    DWORD ProcessID;
    std::list<HWND> WindowHandle;
    Params(DWORD pid) : ProcessID(pid) {}
};
 
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    Params *pParam = (Params *)lParam;
    DWORD dwProcessID = 0;
 
    GetWindowThreadProcessId(hWnd, &dwProcessID);
 
    if (dwProcessID == pParam->ProcessID)
        pParam->WindowHandle.push_back(hWnd);
 
    return TRUE;
}
 
int main() {
    Params Param(11460);
    EnumWindows(EnumWindowsProc, (LPARAM)&Param);
 
    return 0;
}
в списке должны быть все связанные с процессом окна (первый элемент массива теоретически главное окно, остальные могут быть контролы (кнопки, дочерние окна и т.д.)).

упрощенный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <Windows.h>
 
HWND WindowHandle;
 
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    DWORD pID;
 
    GetWindowThreadProcessId(hWnd, &pID);
 
    if (pID == lParam) {
        WindowHandle = hWnd;
        return FALSE;
    }
 
    else return TRUE;
}
 
int main() {
    if (EnumWindows(EnumWindowsProc, 11460)) WindowHandle;
    return 0;
}
1
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 14
17.09.2018, 00:21  [ТС]
Благодарю за ответ, я попробую с вашим примером попробовать сделать лабу.
Мне нужно было сделать чтобы приложения не открывалось второй раз и когда оно открылось появлялось окошко что нельзя открывать и по нажатию кнопки он, консоль закрывалась и становилась активна первая копия приложения или если оно свернуто, то оно появлялось. Вообщем с помощью интернета и пары часов у меня получилось найти все нужно и сделать как нужно, если хотите взглянуть что вышло, пиши в лс)
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.09.2018, 12:37
donny53, намного проще воспользоваться функцией FindWindow
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
17.09.2018, 14:09
Цитата Сообщение от liv Посмотреть сообщение
намного проще воспользоваться функцией FindWindow
не всегда известно имя окна.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.09.2018, 14:24
Цитата Сообщение от _lunar_ Посмотреть сообщение
не всегда известно имя окна.
А имя класса окна тоже неизвестно?

Добавлено через 1 минуту
Цитата Сообщение от donny53 Посмотреть сообщение
Мне нужно было сделать чтобы приложения не открывалось второй раз
Речь идет о своем приложении
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
17.09.2018, 15:02
Цитата Сообщение от liv Посмотреть сообщение
А имя класса окна тоже неизвестно?
чтобы знать имена нужно пользоваться сторонним софтом, к примеру spy++
тогда смысл этой темы вообще?
ТС хочет реализовать свой способ, а не пользоваться готовым.

Добавлено через 39 секунд
Цитата Сообщение от liv Посмотреть сообщение
Речь идет о своем приложении
без разницы, и не факт.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
17.09.2018, 15:38
Как минимум, надо четче описывать задачу...
Даже в случае чужой программы, причем, конкретной, что мешает узнать имя класса или окна? Пусть даже при помощи spy++

Добавлено через 20 минут
Цитата Сообщение от donny53 Посмотреть сообщение
если хотите взглянуть что вышло, пиши в лс
Хотим, только здесь, чтобы все видели.
0
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 14
18.09.2018, 20:06  [ТС]
Вообщем, надо было сделать с помощью мьютексов чтобы второй раз не открывалось приложение. Когда мы второй раз открываем приложение появляется окошко что нельзя открывать второй раз приложение, и нужно сделать так что когда мы нажимаем ок в окошке, то приложение закрывалось(второе приложение скрыто и после нажатия ок закрывается) и появлялось первое приложение. FindWindow не мог использовать так как два приложения с одинаковым именем.
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
19.09.2018, 10:53
Так пишем свое приложение или ищем чужое? Mutex-ы - конечно, тоже хороший вариант, но и FindWindow прекрасно работает!
Цитата Сообщение от donny53 Посмотреть сообщение
FindWindow не мог использовать так как два приложения с одинаковым именем
Ну и что с того, что "два приложения с одинаковым именем"? Хоть десяток! Когда надо, я пишу такой фрагмент и все работает!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int APIENTRY WinMain(HINSTANCE hInstance,
                            HINSTANCE   hPrevInstance,
                            LPSTR       lpCmdLine,
                            int         nCmdShow)
{
    MSG                     msg;
    WNDCLASSEX              wndclass;
 
    if (hMain = FindWindow(pCLassName, NULL))
    {
        SetForegroundWindow(hMain);
        if (IsIconic(hMain))
            ShowWindow(hMain, SW_RESTORE);
        return(FALSE);
    }
    //....
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,835
Записей в блоге: 4
08.04.2021, 04:44
Цитата Сообщение от _lunar_ Посмотреть сообщение
C++
1
if (EnumWindows(EnumWindowsProc, 11460)) WindowHandle;
Почему 11460 это произвольное число которое будет вызывать замыкание функцию(EnumWindowsProc в инструкции упоминается функция повторного вызова не понял что это), это значение должно быть константным или можно переменную писать.
Вызов пустого оператора WindowHandle, почему так?

Добавлено через 3 минуты
Цитата Сообщение от _lunar_ Посмотреть сообщение
Params Param(11460);
что означает запись Param(11460) рядом с названием структуры?
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,835
Записей в блоге: 4
09.04.2021, 03:35
Цитата Сообщение от _lunar_ Посмотреть сообщение
BOOL CALLBACK EnumWindowsProc
CALLBACK https://ru.wikipedia.org/wiki/... %B2%D0%B5. этот спецификатор применяется для функций обратного вызова, могли бы объяснить. Но не понятно как это работает. Почему вы переопределили уже созданную функцию?

Добавлено через 3 часа 51 минуту
EnumWindowsProc() нужно построить самому, я думал в инструкции готовые варианты

Добавлено через 1 час 4 минуты
Цитата Сообщение от _lunar_ Посмотреть сообщение
EnumWindowsProc
где это функция берёт параметры?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2021, 19:18
Цитата Сообщение от Nexi99 Посмотреть сообщение
где это функция берёт параметры?
MSDN
ОС вызывает ее. Знаете, что такое CALLBACK-функции?

Добавлено через 1 минуту
И да, ее надо построить самому...
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,835
Записей в блоге: 4
09.04.2021, 22:01
Цитата Сообщение от liv Посмотреть сообщение
Знаете, что такое CALLBACK-функции?
Я читал но пока не догоняю. Я так понял что EnumWindows вызывает либо сама себя рекурсивно либо, через цикл обрабатывает EnumWindowsProc.
Значит параметры EnumWindowsProc не нужны, они генерируются внутри библиотеки windows.h. Мне не понятно какую структуру должен содержать код EnumWindowsProc, что туда писать.
Цитата Сообщение от Nexi99 Посмотреть сообщение
WindowHandle;
Зачем здесь пустой опекратор?
Цитата Сообщение от _lunar_ Посмотреть сообщение
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    DWORD pID;
GetWindowThreadProcessId(hWnd, &pID);
if (pID == lParam) {
        WindowHandle = hWnd;
        return FALSE;
    }
else return TRUE;
}
Можете заккоментировать что здесь происходит?

Добавлено через 21 минуту
Цитата Сообщение от _lunar_ Посмотреть сообщение
GetWindowThreadProcessId(hWnd, &pID);
Я так понял что эта функция сопоставляет окно с процессом и возвращает номер процесса к которому принадлежит окно?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.04.2021, 23:16
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я так понял что эта функция сопоставляет окно с процессом и возвращает номер процесса к которому принадлежит окно?
Правильно понял, там так и написано
Retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.
https://docs.microsoft.com/en-... dprocessid
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,835
Записей в блоге: 4
10.04.2021, 00:23
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Правильно понял, там так и написано
Написано довольно мудрёно
Извлекает идентификатор потока, создавшего указанное окно, и, необязательно, идентификатор процесса, создавшего окно.
Мне вообще не понятно что это значит. Слишком краткая инструкция это для вундеркиндов которые понимают инструкции без инструкции в красвордах такая фигня, напишут одно слово и неделю или год будешь думать что имеет в виду автор, и таких инструкций пруд пруди.
С функциями разобрался. Но возникла другая проблема. EnumWindow не извлекает HWND если оно было закрыто авварийно. Прикольно то что ExitProcess не завершает нужные процессы а завершает только те где выполняется функция, по сути консоль закрывает, а все запущенные им процессы продолжают работать. TerminateProcess позволяет указывать параметры процесса которого нужно завершить, но закрывает слишком надёжно т.е. аварийно. Получается что нету функции которая нормально закроет процесс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2021, 00:23
Помогаю со студенческими работами здесь

Получить путь к .exe по дескриптору окна
wchar_t szFileName; DWORD pID; HANDLE hProcess; HWND hWnd = FindWindow(NULL, L&quot;Калькулятор&quot;); ...

Получить HWND внутри процесса
Есть запущенный программа, внедряю я тута dll через createremote. Вопрос: как можно получить теперь HWND? Спасибо.

Получить hwnd окна
Допустим я нахожу hwnd главного окна по названию его класса HWND window=FindWindowEx(NULL,NULL,&quot;my_class&quot;,NULL); У етого...

Получить HWND окна
Задача такова - загрузить динамическую dll в чужое приложение и получить HWND окна в которое загрузится dll. dll я загрузил, проверил...

Как определить hwnd окна
Добрый день. Проблема такая.Я сделал exe ,который рисует окно,и в нем пишу,кнопки ставлю.Это окно при запуске exe появляется в текущем...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru