Мне нужно чтобы моя программа получила полный список всех приложений, запущенных на компьютере в данный момент. Прошу прощения что привожу код на 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.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Мне нужно чтобы моя программа получила полный список всех приложений, запущенных на компьютере в данный момент.
Что Вы считаете "приложением" — отдельное окно, оконный процесс, вообще любой процесс (включая службу)?
K>Прошу прощения что привожу код на Delphi, надеюсь он всем понятный:
Для понимания достаточно было сказать, что Вы вызываете EnumWindows, все остальное здесь лишнее.
K>Мне нужны только handle открытых на данный момент окон.
Что значит "открытых"? Если видимых, то IsWindowVisible.
K>Как проверить, что форма с заданным handle недочерняя?
Насчет "формы" не знаю, а окно — GetParent.
Такое впечатление, что Вы взялись за это дело исключительно интуитивно, не почитав даже самых азов документации.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Khimik, Вы писали:
K>>Мне нужно чтобы моя программа получила полный список всех приложений, запущенных на компьютере в данный момент.
ЕМ>Что Вы считаете "приложением" — отдельное окно, оконный процесс, вообще любой процесс (включая службу)?
Отдельное окно.
K>>Прошу прощения что привожу код на Delphi, надеюсь он всем понятный:
ЕМ>Для понимания достаточно было сказать, что Вы вызываете EnumWindows, все остальное здесь лишнее.
K>>Мне нужны только handle открытых на данный момент окон.
ЕМ>Что значит "открытых"? Если видимых, то IsWindowVisible.
K>>Как проверить, что форма с заданным handle недочерняя?
ЕМ>Насчет "формы" не знаю, а окно — GetParent.
Да, я имею в виду окно. У меня есть большой список всех окон, включая дочерние, и нужно из них отобрать только недочерние (например Opera, Delphi, Viber и т.д. — т.е. отдельные программы). Через GetParent перебор выглядит аляповато — у нескольких дочерних окон могут быть одинаковые родительские окна, значит их надо фильтровать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>У меня есть большой список всех окон, включая дочерние, и нужно из них отобрать только недочерние (например Opera, Delphi, Viber и т.д. — т.е. отдельные программы). Через GetParent перебор выглядит аляповато — у нескольких дочерних окон могут быть одинаковые родительские окна, значит их надо фильтровать.
А подумать? Если GetParent возвращает нуль — значит, это и есть "недочернее" окно. На самом деле еще может быть вариант, когда GetParent возвращает то же самое, что и GetDesktopWindow — это тоже оно.
Только без хотя бы общего чтения документации Вы вряд ли напишете то, что задумали, мало-мальски надежно.
Здравствуйте, Khimik, Вы писали:
K>Мне нужно чтобы моя программа получила полный список всех приложений, запущенных на компьютере в данный момент.
Для этого есть функция EnumProcesses(). Или функции CreateToolhelp32Snapshot(), Process32First() и Process32Next().
Их описания можно найти в MSDN.