Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 13.03.2015
Сообщений: 10
1

Перечень существующих и дочерних окон

13.03.2015, 11:55. Показов 3812. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помощи уважаемые, вот такое задали:
В основном окне приложения WIN32 создать два одинакового размера перечня, которые должны занимать всё доступное пространство окна. В один перечень вывести список существующих на рабочем столе окон (их заголовки), в другой – список дочерних окон (их классы и заголовки одной строкой, если заголовок у дочернего окна есть), которые относятся к выделенному окну в первом перечне. При выборе других окон первого перечня список во втором должен обновляться. Данное окно не должно давать возможность пользователю изменять свои размеры.

Окно сделал, размеры и форма фиксированы, листбоксы поставил. Остальное ну совсем не получается сделать, примеров мало в интернете и большинство либо не работают либо сделаны не так. Видел как сделали через 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
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
#include <windows.h>            //инициализация библиотек
#include <iostream>
 
using namespace std;
 
HWND hWnd, paste_lb, paste_btn, paste_tf;                   //инициализация функций
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  //функции окна
{
    switch (uMsg)
    {
    case WM_CREATE:                                         //в случае сигнала if команда == заданная функция(кнопка)
    {
        
    }
        break;
    case WM_DESTROY:                                            //действие при закрытии окна
        PostQuitMessage(0);
        break;
    default:
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)   //точка входа??
{
    LPCSTR windowName = "Управление окнами";        //имя главного окна
 
    WNDCLASS wc;
    wc.hInstance = hInst;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "MyClass";
    RegisterClass(&wc);
 
    hWnd = CreateWindow(wc.lpszClassName, windowName, WS_OVERLAPPED&~WS_THICKFRAME | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX, 0, 0, 840, 545, NULL, NULL, hInst, NULL);                                            //главное окно
    paste_lb = CreateWindow("listbox", NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | ES_LEFT | ES_MULTILINE, 415, 5, 400, 500, hWnd, NULL, NULL, NULL);                 //элементы управления
    paste_lb = CreateWindow("listbox", NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | ES_LEFT | ES_MULTILINE, 5, 5, 400, 500, hWnd, NULL, NULL, NULL);
    ShowWindow(hWnd, SW_SHOW);                                                                                                                      //вывод окна после построения
 
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return static_cast<int>(msg.wParam);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2015, 11:55
Ответы с готовыми решениями:

Список существующих окон на рабочем столе
Используя функции WINAPI создать приложение, которое выводит список всех существующих на рабочем...

Минимизация дочерних окон
Здравствуйте! Есть задание: Написать приложение, обладающее следующей функциональностью: ...

Фон дочерних окон
Здравствуйте, в общем ситуация обстоит так, нужно создать главное окно, и при левом клике на него...

Создание своих дочерних окон
Всем здрасьте ! У меня проблема с Моими дочерними окнами. Может где надо какой стиль добавить,...

10
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
14.03.2015, 22:44 2
Лучший ответ Сообщение было отмечено Overhater как решение

Решение

Overhater, вот рабочий код
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#define _CRT_SECURE_NO_WARNINGS
 
#include<Windows.h>
#include<CommCtrl.h>
#include<stdio.h>
#define ID_LIST 1
#define ID_LIST2 2
 
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WindowProcedure2(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam);
BOOL CALLBACK EnumChildWnd(HWND hWnd, LPARAM lParam);
HWND hWnd, ListView, ListView2;
HWND FWnd;
char szName[] = "window", Class[] = "info";
char wndtext[100];
char wndclass[100];
LVITEM lvi, lvi2;
 
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
    WNDCLASSEX wincl;
    MSG messages;
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS | CS_DROPSHADOW;
    wincl.cbSize = sizeof(WNDCLASSEX);
    wincl.hIcon = LoadIcon(0, IDI_WINLOGO);
    wincl.hIconSm = LoadIcon(0, IDI_WINLOGO);
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = CreateSolidBrush RGB(50, 50, 70);
    if (!RegisterClassEx(&wincl))
        return 0;
    hWnd = CreateWindowEx(NULL, szName, "NULL", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, 0, 0, 1170, 545, NULL, NULL, NULL, NULL);
    ListView = CreateWindow(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | LVS_REPORT | LVS_SINGLESEL, 5, 5, 617, 400, hWnd, (HMENU)ID_LIST, NULL, NULL);
    SendMessage(ListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
    ShowWindow(hWnd, SW_SHOW);
    LVCOLUMN lvc;
    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
    lvc.fmt = LVCFMT_CENTER;
    lvc.pszText = "Window Text";
    lvc.cx = 200;
    ListView_InsertColumn(ListView, 0, &lvc);
    lvc.pszText = "Window Class";
    lvc.cx = 200;
    ListView_InsertColumn(ListView, 1, &lvc);
    lvc.pszText = "PID";
    lvc.cx = 200;
    ListView_InsertColumn(ListView, 2, &lvc);
    memset(&lvi, 0, sizeof(LVITEM));
    lvi.mask = LVIF_TEXT | LVIF_COLUMNS | LVIF_COLFMT;
    ListView2 = CreateWindow(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | LVS_REPORT | LVS_SINGLESEL, 630, 5, 517, 400, hWnd, (HMENU)ID_LIST2, NULL, NULL);
    SendMessage(ListView2, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
    LVCOLUMN lvc2;
    lvc2.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
    lvc2.fmt = LVCFMT_CENTER;
    lvc2.pszText = "Window Class";
    lvc2.cx = 200;
    ListView_InsertColumn(ListView2, 0, &lvc2);
    lvc2.pszText = "Window Text";
    lvc2.cx = 200;
    ListView_InsertColumn(ListView2, 1, &lvc2);
    lvc2.pszText = "X pos";
    lvc2.cx = 50;
    ListView_InsertColumn(ListView2, 2, &lvc2);
    lvc2.pszText = "Y pos";
    lvc2.cx = 50;
    ListView_InsertColumn(ListView2, 3, &lvc2);
    lvc2.pszText = "Width";
    lvc2.cx = 50;
    ListView_InsertColumn(ListView2, 4, &lvc2);
    lvc2.pszText = "Height";
    lvc2.cx = 50;
    ListView_InsertColumn(ListView2, 5, &lvc2);
    memset(&lvi2, 0, sizeof(LVITEM));
    lvi2.mask = LVIF_TEXT | LVIF_COLUMNS | LVIF_COLFMT;
    EnumWindows(EnumWndProc, 0);
    while (GetMessage(&messages, hWnd, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}
BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
{
    int i = 0;
    lvi.iItem = i;
    char    bufftext[100];
    char    buffclass[100];
    DWORD   buffpid[100];
    char    cbuffpid[100];
    ListView_InsertItem(ListView, &lvi);
 
    GetWindowText(hwnd, bufftext, sizeof(bufftext));
    ListView_SetItemText(ListView, i, 0, bufftext);
 
    GetClassName(hwnd, buffclass, sizeof(buffclass));
    ListView_SetItemText(ListView, i, 1, buffclass);
 
    GetWindowThreadProcessId(hwnd, buffpid);
    sprintf(cbuffpid, "%d", buffpid[0]);
    ListView_SetItemText(ListView, i, 2, cbuffpid);
 
    return TRUE;
}
BOOL CALLBACK EnumChildWnd(HWND hwnd, LPARAM lParam)
{
    RECT rc, wrc;
    GetWindowRect(hwnd, &rc);
    GetWindowRect(FWnd, &wrc);
    int i = 0;
    lvi2.iItem = i;
    char    xpos[50];
    char    ypos[50];
    char    width[50];
    char    height[50];
    sprintf(xpos, "%d", rc.left - wrc.left);
    sprintf(ypos, "%d", rc.top - wrc.top);
    sprintf(width, "%d", rc.right - rc.left);
    sprintf(height, "%d", rc.bottom - rc.top);
    char    bufftext[100];
    char    buffclass[100];
    ListView_InsertItem(ListView2, &lvi2);
 
    GetWindowText(hwnd, bufftext, sizeof(bufftext));
    ListView_SetItemText(ListView2, i, 1, bufftext);
 
    GetClassName(hwnd, buffclass, sizeof(buffclass));
    ListView_SetItemText(ListView2, i, 0, buffclass);
 
    ListView_SetItemText(ListView2, i, 2, xpos);
 
    ListView_SetItemText(ListView2, i, 3, ypos);
 
    ListView_SetItemText(ListView2, i, 4, width);
 
    ListView_SetItemText(ListView2, i, 5, height);
 
    return TRUE;
}
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    break;
    case WM_CLOSE:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_COMMAND:
    {
 
    }
    break;
    case WM_NOTIFY:
        LPNMHDR lpnmHdr;
        lpnmHdr = (LPNMHDR)lParam;
        if ((lpnmHdr->idFrom == ID_LIST) && (lpnmHdr->code == NM_CLICK))
        {
            SendMessage(ListView2, LVM_DELETEALLITEMS, 0, 0L);
            LPNMLISTVIEW pnmLV = (LPNMLISTVIEW)lParam;
 
            ListView_GetItemText(lpnmHdr->hwndFrom, pnmLV->iItem, 0, wndtext, 100);
            ListView_GetItemText(lpnmHdr->hwndFrom, pnmLV->iItem, 1, wndclass, 100);
 
            FWnd = FindWindow(wndclass, wndtext);
            EnumChildWindows(FWnd, EnumChildWnd, 0);
        }
        else if ((lpnmHdr->idFrom == ID_LIST) && (lpnmHdr->code == NM_DBLCLK))
        {
            SendMessage(ListView2, LVM_DELETEALLITEMS, 0, 0L);
            LPNMLISTVIEW pnmLV = (LPNMLISTVIEW)lParam;
 
            ListView_GetItemText(lpnmHdr->hwndFrom, pnmLV->iItem, 0, wndtext, 100);
            ListView_GetItemText(lpnmHdr->hwndFrom, pnmLV->iItem, 1, wndclass, 100);
        }
        break;
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
        break;
    }
    return 0;
}
Добавлено через 1 минуту
10 строка лишняя, это я эксперементировал просто)
и в 15 Class[] тоже

Добавлено через 1 минуту
исправишь на свой вкус, это отрывок из моего проекта
1
0 / 0 / 1
Регистрация: 13.03.2015
Сообщений: 10
14.03.2015, 22:54  [ТС] 3
Что то не выходит. Убрал 10 строку, и Class в 15. Пробовал ставить многобайтовую кодировку. Выдает 30 ошибок и 15 предупреждений.

исправишь на свой вкус, это отрывок из моего проекта
Да если бы я владел хоть немного C++ я бы и сам наверно налатал. В С# может и смог бы еще или в Delphi но тут совсем бессилен, кучу всего прочитал все равно нихрена не понимаю.
0
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
14.03.2015, 23:01 4
Overhater, странно, точно в многобайтовой?
0
0 / 0 / 1
Регистрация: 13.03.2015
Сообщений: 10
14.03.2015, 23:05  [ТС] 5
Да. Точно. Компилирую в Visual Studio 2013. Можем созвониться я бы экран показал.

Незнаю как отправить лог с ошибками.
0
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
14.03.2015, 23:09 6
Overhater, нажми правой кнопкой на ошибку и выбери копировать)
0
0 / 0 / 1
Регистрация: 13.03.2015
Сообщений: 10
14.03.2015, 23:15  [ТС] 7
Сборка начата 15.03.2015 1:08:48.
1>Проект "M:\Учеба\Долги\СПО (С++)\задание 7и8\архив\Новая папка\Управление окнами.vcxproj" в узле 2 (целевые объекты Rebuild).
1>ClCompile:
M:\Programms\Microsoft Visual Studio 12.0\VC\bin\CL.exe /c /Zi /nologo /W3 /WX- /Od /Oy- /D WIN32 /D _DEBUG /D _WINDOWS /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fprecise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc120.pdb" /Gd /TC /analyze- /errorReportrompt "Управление окнами.c"
Управление окнами.c
1>Управление окнами.c(38): warning C4047: функция: "DWORD" отличается по уровням косвенного обращения от "void *"
1>Управление окнами.c(38): warning C4024: CreateWindowExA: различные типы для формального и фактического параметров 1
1>Управление окнами.c(162): error C2275: LPNMHDR: недопустимое использование этого типа в качестве выражения
C:\Program Files (x86)\Windows Kits\8.1\Include\um\winuser.h(3156): см. объявление "LPNMHDR"
1>Управление окнами.c(162): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "lpnmHdr"
1>Управление окнами.c(162): error C2065: lpnmHdr: необъявленный идентификатор
1>Управление окнами.c(163): error C2065: lpnmHdr: необъявленный идентификатор
1>Управление окнами.c(163): warning C4047: =: "int" отличается по уровням косвенного обращения от "LPNMHDR"
1>Управление окнами.c(164): error C2065: lpnmHdr: необъявленный идентификатор
1>Управление окнами.c(164): error C2223: выражение слева от "->idFrom" должно указывать на структуру или объединение
1>Управление окнами.c(164): error C2223: выражение слева от "->code" должно указывать на структуру или объединение
1>Управление окнами.c(169): error C2065: lpnmHdr: необъявленный идентификатор
1>Управление окнами.c(169): error C2223: выражение слева от "->hwndFrom" должно указывать на структуру или объединение
1>Управление окнами.c(169): warning C4047: функция: "HWND" отличается по уровням косвенного обращения от "int"
1>Управление окнами.c(169): warning C4024: SendMessageA: различные типы для формального и фактического параметров 1
1>Управление окнами.c(169): error C2198: SendMessageA: слишком мало аргументов для вызова
1>Управление окнами.c(170): error C2065: lpnmHdr: необъявленный идентификатор
1>Управление окнами.c(170): error C2223: выражение слева от "->hwndFrom" должно указывать на структуру или объединение
1>Управление окнами.c(170): warning C4047: функция: "HWND" отличается по уровням косвенного обращения от "int"
1>Управление окнами.c(170): warning C4024: SendMessageA: различные типы для формального и фактического параметров 1
1>Управление окнами.c(170): error C2198: SendMessageA: слишком мало аргументов для вызова
1>Управление окнами.c(175): error C2065: lpnmHdr: необъявленный идентификатор
1>Управление окнами.c(175): error C2223: выражение слева от "->idFrom" должно указывать на структуру или объединение
1>Управление окнами.c(175): error C2223: выражение слева от "->code" должно указывать на структуру или объединение
1>Управление окнами.c(180): error C2065: lpnmHdr: необъявленный идентификатор
1>Управление окнами.c(180): error C2223: выражение слева от "->hwndFrom" должно указывать на структуру или объединение
1>Управление окнами.c(180): warning C4047: функция: "HWND" отличается по уровням косвенного обращения от "int"
1>Управление окнами.c(180): warning C4024: SendMessageA: различные типы для формального и фактического параметров 1
1>Управление окнами.c(180): error C2198: SendMessageA: слишком мало аргументов для вызова
1>Управление окнами.c(181): error C2065: lpnmHdr: необъявленный идентификатор
1>Управление окнами.c(181): error C2223: выражение слева от "->hwndFrom" должно указывать на структуру или объединение
1>Управление окнами.c(181): warning C4047: функция: "HWND" отличается по уровням косвенного обращения от "int"
1>Управление окнами.c(181): warning C4024: SendMessageA: различные типы для формального и фактического параметров 1
1>Управление окнами.c(181): error C2198: SendMessageA: слишком мало аргументов для вызова
1>Сборка проекта "M:\Учеба\Долги\СПО (С++)\задание 7и8\архив\Новая папка\Управление окнами.vcxproj" завершена (целевые объекты Rebuild) с ошибкой.

Ошибка сборки.

Затраченное время: 00:00:00.33

Добавлено через 4 минуты
Тьфу блин... идиот. Я тут замотался с лабораторными по СИ и короче формат .С написал... да все запустилось. Огроменнейшее спасибо.
0
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
14.03.2015, 23:18 8
хммм... в ошибках я не силен, но у меня тот же код и работает без проблем
0
0 / 0 / 1
Регистрация: 13.03.2015
Сообщений: 10
14.03.2015, 23:18  [ТС] 9
Тема закрыта. Еще раз титаническая благодарность programmist99. Просто четверть жизни мне спасли. Я на грани исключения а С++ ну совсем не мое, может потом с ним поквитаюсь если работать с ним придется.
0
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
14.03.2015, 23:27 10
Overhater,project.zip
попробуй, вдруг получится)
0
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
14.03.2015, 23:28 11
Overhater, проект правда сырой, еще не успел доделать
0
14.03.2015, 23:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2015, 23:28
Помогаю со студенческими работами здесь

Закрытие всех дочерних окон
У меня есть программа которая по нажатию ЛКМ создает дочернее окно. Мне нужно закрыть все дочерние...

Изменение z-index-а дочерних окон
Создаю два окна, потом по действиям пользователя изменяю их z-index, ничего не выходит ...

Создание дочерних окон в окне
Всем привет!!! Как мне создать дочерние окна в главном окне программы,пример таких окон на...

Обработка сообщений от дочерних окон
Понимаю эт не серезный вопрос-но я новичок (изучаю Visul C++ токо месяц). Проблема- есть дочирнее...


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

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