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

Поиск окна HWND по названию

01.10.2015, 17:32. Показов 7272. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно в цикле перебрать все окна и вернуть дескриптор найденного окна?
Подскажите, пожалуйста рабочий пример или функции которые применяются для этого?

Есть заглавное окно программы:

C++
1
HWND h = FindWindow(NULL, "Мое приложение");
Я перебираю следующим образом:

C++
1
2
3
4
HWND h1 = NextWindowElement(h,NULL,NULL,1);
.....
HWND h15 = NextWindowElement(h14,NULL,NULL,1);
ShowMessage("Window Handle " + IntToHex(int(e15),8));
Это очень неудобно, тем более порядок окон в приложении может поменяться.

Добавлено через 1 час 38 минут
Копаю дальше, есть примеры, но не знаю подойдут ли и как применить?

C++
1
2
3
4
5
6
7
8
9
10
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lp)
{
    char buff[128];
    GetClassName[hWnd, buff, sizeof(buff));
    if(0 == _stricmp(buff, "edit")) return false;
}
 
...
HWND hWnd = FindWindowEx(NULL, NULL, "my_class", NULL);
EnumChildWindows(hWnd, &EnumChildProc, NULL);

C++
1
2
3
4
5
6
7
BOOL CALLBACK EnumChildWnd(HWND h, LPARAM lParam)
{
    SendMessage(h, WM_SETTEXT, 0, (LPARAM)"message");
    return TRUE;
}
 
EnumWindows(&EnumWindowsWnd, 0);
Добавлено через 33 минуты
Еще нашел, но это уже завтра

Как используя функцию EnumWindows найти требуемое окно, после нажать в этом окне кнопку «ОК» ?

Если нужен более стабильный подход, то можно использовать EnumWindows, так как FindWindow вроде как не будет работать с окнами другого процесса. Используется он просто:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
BOOL CALLBACK enum_wnd_proc(HWND hwnd, LPARAM lParam)
// hwnd - окно, которое надо проверить
// lParam пользовательский параметр, передаваемый в функцию. Я через него свойства искомого окна передаю
{
  WindowInfo* window_info = (WindowInfo*)lParam;
 
  // Тут идут проверки нужных свойств, если они не проходят, надо вернуть TRUE
 
  // Если все проверки прошли, сохраняем текущий хэндл окна в передаваемой структуре и возвращаем FALSE
  window_info->m_hwnd = hwnd;
  return FALSE;
}
 
// Это для окон верхнего уровня
if (EnumWindows(enum_wnd_proc, (LPARAM)(&window_info)) == TRUE) {
  // Окно найдено
  // window_info->m_hwnd;  <-- это родительское окно
  // Дальше ищем дочернее окно аналогично, но с помощью 
  WindowInfo window_info_2;
  EnumChildWindows(window_info->m_hwnd, enum_wnd_proc, (LPARAM)(&window_info_2));
  // window_info_2.m_hwnd <-- это дочернее окно
}
Добавлено через 2 часа 24 минуты
Пытаюсь сделать таким образом на калькуляторе.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HWND win;
.....
//---------------------------------------------------------------------------
BOOL CALLBACK EnumWindowsWnd(HWND hwnd, LPARAM lParam)
{
  char ss[15];
  GetWindowText(hwnd,ss,15);
  if(ss == "0") win=hwnd;
  return false;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 char s[15];
 HWND h = FindWindow(NULL, "Калькулятор");
 GetWindowText(h,s,15);
 Edit1->Text=s;
 EnumChildWindows(h,&EnumWindowsWnd, NULL);
 ShowMessage("Window Handle " + IntToHex(int(win),8));
}
//---------------------------------------------------------------------------
Вылетает ошибка:

[C++ Error] Unit2.cpp(50): E2034 Cannot convert 'int (__stdcall *)(void *,long)' to 'int (__stdcall *)()'
[C++ Error] Unit2.cpp(50): E2342 Type mismatch in parameter 'lpEnumFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall *)(void *,long)')

Добавлено через 15 часов 59 минут
На калькуляторе сделал:

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
28
//---------------------------------------------------------------------------
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
  char ss[15];
  char cl[100];
  GetWindowText(hwnd,ss,15);
  GetClassName(hwnd,cl,100);
  if(!strcmp(ss,"0"))
  {
    win=hwnd;
    ShowMessage("Child window text : "+AnsiString(ss));
    ShowMessage("Child window Class Name : "+AnsiString(cl));
  }
  return true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 char s[15];
 HWND h = FindWindow(NULL, "Калькулятор");
 
 GetWindowText(h,s,15);
 Edit1->Text=s;
 EnumChildWindows(h,(WNDENUMPROC)EnumChildProc, NULL);
 ShowMessage("Window Handle " + IntToHex(int(win),8));
}
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2015, 17:32
Ответы с готовыми решениями:

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

Поиск окна по названию файла приложения
По заголовку находит, а по названию файла приложения -- нет Так находит: #include &quot;windows.h&quot; #include...

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

2
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
01.10.2015, 17:41
Цитата Сообщение от AM2 Посмотреть сообщение
так как FindWindow вроде как не будет работать с окнами другого процесса
Чойта?
Цитата Сообщение от AM2 Посмотреть сообщение
&EnumWindowsWnd
Без &.
Цитата Сообщение от AM2 Посмотреть сообщение
(WNDENUMPROC)
Вот так делать не стоит, если не советуют в документации.
1
0 / 0 / 0
Регистрация: 28.05.2015
Сообщений: 18
01.10.2015, 22:05  [ТС]
(WNDENUMPROC)
Вот так делать не стоит, если не советуют в документации.
В С++Builder по другому никак. А так все работает и в приложении.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2015, 22:05
Помогаю со студенческими работами здесь

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

Дескриптор окна из glutCreateWindow и HWND
Собственно, как их связать? т.е. использовать дескриптор из glutCreateWindow напрямую в WinAPI функции не получается, тербует HWND... Как...

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

Как найти HWND нужного окна?
хочу написать программу которая нажимала бы клавишу в другом окне, когда оно перекрыто другим подскажите как найти хвнд нужного окна

Получить HWND активного дочернего окна
Дайте минимальный проверочный код который даст HWND активного дочернего окна. Если кто-то скажет GetFocus то либо приведите пример либо...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru