Найти все недочерние окна
От: Khimik  
Дата: 17.05.21 20:05
Оценка:
Мне нужно чтобы моя программа получила полный список всех приложений, запущенных на компьютере в данный момент. Прошу прощения что привожу код на Delphi, надеюсь он всем понятный:

var
res:tintarray;  //Массив из интегеров
 
function EnWindProc(hwnd:thandle; lparam: NativeInt):boolean;
begin
result:=false;
if hwnd=0 then exit;
 
result:=true;
res.Add(hwnd);  //Handle формы добавляется в мой массив
end;
 
function GetOtherWindowsHandles: tintarray;  //tintarray - мой класс массива из интегеров
begin
res:=tintarray.Create;
 
EnumWindows(@enwindproc,0);
 
result:=res;
 
end;


Проблема в том что после выполнения GetOtherWindowsHandles в возвращаемом массиве перечислены вообще все формы, включая дочерние, и их очень много. Мне нужны только handle открытых на данный момент окон. Как проверить, что форма с заданным handle недочерняя?
Пробовал использовать GetWindowLong, не получилось:

IsAChild := GetWindowLong(hwnd, GWL_EXSTYLE) and WS_EX_MDICHILD <>0;


В таком коде ни для одного окна переменной IsAChild не присвоено true.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Найти все недочерние окна
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 18.05.21 08:12
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Мне нужно чтобы моя программа получила полный список всех приложений, запущенных на компьютере в данный момент.


Что Вы считаете "приложением" — отдельное окно, оконный процесс, вообще любой процесс (включая службу)?

K>Прошу прощения что привожу код на Delphi, надеюсь он всем понятный:


Для понимания достаточно было сказать, что Вы вызываете EnumWindows, все остальное здесь лишнее.

K>Мне нужны только handle открытых на данный момент окон.


Что значит "открытых"? Если видимых, то IsWindowVisible.

K>Как проверить, что форма с заданным handle недочерняя?


Насчет "формы" не знаю, а окно — GetParent.

Такое впечатление, что Вы взялись за это дело исключительно интуитивно, не почитав даже самых азов документации.
Re[2]: Найти все недочерние окна
От: Khimik  
Дата: 18.05.21 14:05
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Khimik, Вы писали:


K>>Мне нужно чтобы моя программа получила полный список всех приложений, запущенных на компьютере в данный момент.


ЕМ>Что Вы считаете "приложением" — отдельное окно, оконный процесс, вообще любой процесс (включая службу)?


Отдельное окно.

K>>Прошу прощения что привожу код на Delphi, надеюсь он всем понятный:


ЕМ>Для понимания достаточно было сказать, что Вы вызываете EnumWindows, все остальное здесь лишнее.


K>>Мне нужны только handle открытых на данный момент окон.


ЕМ>Что значит "открытых"? Если видимых, то IsWindowVisible.


K>>Как проверить, что форма с заданным handle недочерняя?


ЕМ>Насчет "формы" не знаю, а окно — GetParent.


Да, я имею в виду окно. У меня есть большой список всех окон, включая дочерние, и нужно из них отобрать только недочерние (например Opera, Delphi, Viber и т.д. — т.е. отдельные программы). Через GetParent перебор выглядит аляповато — у нескольких дочерних окон могут быть одинаковые родительские окна, значит их надо фильтровать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Найти все недочерние окна
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 18.05.21 14:28
Оценка:
Здравствуйте, Khimik, Вы писали:

K>У меня есть большой список всех окон, включая дочерние, и нужно из них отобрать только недочерние (например Opera, Delphi, Viber и т.д. — т.е. отдельные программы). Через GetParent перебор выглядит аляповато — у нескольких дочерних окон могут быть одинаковые родительские окна, значит их надо фильтровать.


А подумать? Если GetParent возвращает нуль — значит, это и есть "недочернее" окно. На самом деле еще может быть вариант, когда GetParent возвращает то же самое, что и GetDesktopWindow — это тоже оно.

Только без хотя бы общего чтения документации Вы вряд ли напишете то, что задумали, мало-мальски надежно.
Re: Найти все недочерние окна
От: Nikita123 Россия  
Дата: 19.05.21 13:09
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Мне нужно чтобы моя программа получила полный список всех приложений, запущенных на компьютере в данный момент.

Для этого есть функция EnumProcesses(). Или функции CreateToolhelp32Snapshot(), Process32First() и Process32Next().
Их описания можно найти в MSDN.
Желаю успеха,
Никита.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.