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

Необходимо получить дескриптор дочернего окна не имея его заголовка

12.11.2013, 02:16. Показов 2568. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Возникла следующая ситуация: необходимо получить дескриптор дочернего окна не имея его заголовка (оно отсутствует либо заголовки одинаковые), при этом имена классов у дочерних окон одинаковые. Грубо говоря, не меняется только структура дочерних классов. Вариант обращения через адрес не катит, так как после перезапуска он меняется.

Приведу маленький пример, необходимо достучаться до окна выделенного на скрине (пример обобщенный, не для моих целей):


Возможно ли такое вообще? Буду признателен за куски кода или полезные ссылки.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2013, 02:16
Ответы с готовыми решениями:

Получить дескриптор дочернего окна без заголовка
Есть группа дочерних окон (кнопки, имя класса - V8FormElement), все кнопки без заголовков, spy++ пишет: заголовок"" Как...

Нужно получить дескриптор окна имея дескриптор контрола
Нужно получить дескриптор окна имея дескриптор контрола, подскажите как

Как получить дескриптор дочернего окна?
Суть программы такова, есть диалоговое окно, реализовать такую функциональность, зажимаем левую кнопку мыши, тянем её, отпускаем и получаем...

4
 Аватар для zvoronz
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
12.11.2013, 03:13
Конечно возможно.
Во первых нужно использовать процедуру EnumChildWindows
Потом в процедуре перебора фильтровать кнопки при помощи GetClassName
И наконец использовать например признак нужной кнопки через GetWindowInfo по например её расположению.

Вот в общем моё предложение. Для вашего абстрактного примера.
1
0 / 0 / 0
Регистрация: 27.08.2010
Сообщений: 9
12.11.2013, 05:01  [ТС]
Цитата Сообщение от zvoronz Посмотреть сообщение
Конечно возможно.
Во первых нужно использовать процедуру EnumChildWindows
Потом в процедуре перебора фильтровать кнопки при помощи GetClassName
И наконец использовать например признак нужной кнопки через GetWindowInfo по например её расположению.

Вот в общем моё предложение. Для вашего абстрактного примера.
Спасибо. Было бы не плохо еще если бы поделились хорошим примером, как вывести на экран список всех дочерних окон, относительно данного.
0
 Аватар для zvoronz
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
12.11.2013, 05:29
Вот вкинул код в одну из своих прог, разбирайтесь. Если нужно вышлю исполняемый файл.
Кликните здесь для просмотра всего текста
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "stdafx.h"
#include <windows.h>
 
#include <iostream>
#include <tchar.h>
 
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
HINSTANCE ghInst;
 
int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrev, char *cCmdLine, int cmdShow)
{
    ghInst = hInst;
 
    WNDCLASSEX wc;
    wc.cbSize = sizeof(wc);
    wc.lpszClassName = "Win32_z1_App";
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
    wc.hInstance = hInst;
    wc.lpszMenuName = 0;
    wc.style = 0;
    wc.lpfnWndProc = MyWndProc;
 
    if (!RegisterClassEx(&wc))
        return 0;
 
    HWND hWnd;
    hWnd = CreateWindow("Win32_z1_App", "Win32 Zadacha #1", WS_OVERLAPPEDWINDOW,
        212, 84, 330, 400, NULL, NULL, hInst, NULL);
    if (hWnd == 0)
        return 0;
 
    ShowWindow(hWnd, cmdShow);
    UpdateWindow(hWnd);
 
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
HWND hBtn, hList, hEdit;
char str[200], str2[200];
 
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
    char buf[100]="0x";
    char* s = &buf[2];
    itoa((int)hwnd, s, 16);
    SendMessage(hList, LB_ADDSTRING, NULL, (LPARAM)buf);
    return TRUE;
}
 
LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
                      hEdit = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE
                          | ES_AUTOHSCROLL | ES_RIGHT, 10, 16, 200, 20, hWnd, NULL, ghInst, NULL);
                      hBtn = CreateWindow("BUTTON", "Найти", WS_CHILD | WS_VISIBLE
                          | BS_PUSHBUTTON, 223, 10, 80, 30, hWnd, NULL, ghInst, NULL);
                      hList = CreateWindow("LISTBOX", "", WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 15, 50, 280, 300, hWnd, NULL, ghInst, NULL);
 
                      EnumChildWindows(hWnd, EnumChildProc, 0);
 
                      return 0;
    }
    case WM_COMMAND:
    {
                       int par = HIWORD(wParam);
                       switch (par)
                       {
                       case BN_CLICKED:
                           if ((HWND)lParam == hBtn)
                           {
                               int i, count = SendMessage(hList, LB_GETCOUNT, NULL, NULL);
 
                               for (i = 0; i < count; ++i)
                               {
 
                                   SendMessage(hList, LB_GETTEXT, i, (LPARAM)str);
                                   GetWindowText(hEdit, str2, 200);
 
                                   if (strstr(str, str2) != NULL)
                                   {
                                       SendMessage(hList, LB_SETCURSEL, i, NULL);
                                       break;
                                   }
                               }
                               if (i == count)
                                   SendMessage(hList, LB_SETCURSEL, -1, NULL);
                           }
                           break;
                       }
 
                       return 0;
    }
    case WM_DESTROY:
    {
                       PostQuitMessage(0);
                       return 0;
    }
    }
 
    return DefWindowProc(hWnd, message, wParam, lParam);
}
1
0 / 0 / 0
Регистрация: 27.08.2010
Сообщений: 9
12.11.2013, 08:44  [ТС]
Спасибо за идею, помогло. Только забыл эту маленькую деталь и провозился с кодировкой очень долго
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2013, 08:44
Помогаю со студенческими работами здесь

Как получить дескриптор дочернего активного окна?
Есть дескриптор (HWND hWnd) какого-то окна (левого, не относящегося к моей программе). Нужно получить дескриптор дочернего окна, которое...

Как получить снимок рабочей области окна программы зная его дескриптор?
Как получить снимок рабочей области окна программы зная его дескриптор?

Как получить хэндл окна зная текст его заголовка и ID процесса?
Как получить хэндл окна зная текст его заголовка и ID процесса? Желательно привязаться в ID -а то мало ли окон с одинаковым заголовком. ...

Как получить размеры клиентской области окна-родителя в функции дочернего окна?
задание такое: имеется дочернее окно,которое &quot;убегает&quot; от курсора мыши в пределах родительского окна. я создала главное окно,и дочернее,...

Как получить дескриптор активного окна?
Перебрать все открытые окна? Какой признак есть у активного окна?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Камера 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, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru