![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск всех главных окон [D7, XP]
ЛамерЪХ © (2008-11-10 03:38:00)Привет всем )) Поделитесь кто-нибудь процедуркой , ищащуй Все Заглавные окна в Windows )
Пробовал искать все окна , с помощью EnumWindows , Однако , она ищит все окна , и хандлы всех эллементов окон, а мне нужны лишь заглавные окна ))):) Напишите плиз , кусочик кода ))
Eraser (2008-11-10 15:29:00) [1]> [5] Leonid Troyanovsky © (10.11.08 13:02)
эт Джедаевские недоработки, я особо не разбирался в коде, т.к. обычно он там нормального качества, но за пояснения спасибо.
Leonid Troyanovsky (2008-11-10 13:20:00) [2]
> Eraser © (10.11.08 03:43) [1]
> function EnumWindowsProc(Wnd: THandle; List: TStrings):
> Boolean; stdcall;
BOOL.
Кроме того, польза в List.AddObject весьма сомнительна, бо
хендлы валидны лишь до тех пор, пока окно не закрыты.
Т.е., если на момент вызова EnumWindows нас
заинтересовали к.л. окна, то создавшие их потоки
д.б. захучены на предмет WM_DESTROY.
--
Regards, LVT.
Leonid Troyanovsky (2008-11-10 13:02:00) [3]
> Eraser © (10.11.08 03:43) [1]
> function IsMainAppWindow(Wnd: THandle): Boolean;
Судя по http://www.microsoft.com/msj/1197/win321197.aspxд.б.
function IsMainAppWindow(Wnd: THandle): Boolean;
var
exstyle: DWORD;
begin
Result := IsWindowVisible(Wnd);
if Result then
begin
ExStyle := GetWindowLong(Wnd, GWL_EXSTYLE);
Result := exstyle and WS_EX_APPWINDOW <> 0;
if not Result and (exstyle and WS_EX_TOOLWINDOW = 0) then
Result := GetWindowLong(Wnd, GWL_HWNDPARENT) = 0;
end;
end;
--
Regards, LVT.
ЛамерЪХ (2008-11-10 04:07:00) [4]О_о всо ! спасибо Eraser Разобрался
ЛамерЪХ (2008-11-10 03:57:00) [5]GetWindowLongPtr - Делфи не знает такого , юниты нужно какие-нибудь объявлять ?
Германн (2008-11-10 03:45:00) [6]
> Поделитесь кто-нибудь процедуркой , ищащуй Все Заглавные
> окна в Windows )
Вот когда Билл Гейтс, лично мне объяснит, что такое "Заглавные окна в Windows", вот тогда я может быть буду думать над вопросом! :)
Eraser (2008-11-10 03:43:00) [7]вот эта функция должна возвращать примерно то, что находится во вкладке "приложения" стандартного таск-менеджера.
function IsMainAppWindow(Wnd: THandle): Boolean;
var
ParentWnd: THandle;
ExStyle: DWORD;
begin
if IsWindowVisible(Wnd) then
begin
ParentWnd := THandle(GetWindowLongPtr(Wnd, GWLP_HWNDPARENT));
ExStyle := GetWindowLongPtr(Wnd, GWL_EXSTYLE);
Result := ((ParentWnd = 0) or (ParentWnd = GetDesktopWindow)) and
((ExStyle and WS_EX_TOOLWINDOW = 0) or (ExStyle and WS_EX_APPWINDOW <> 0));
end
else
Result := False;
end;
function GetTasksList(const List: TStrings): Boolean;
function EnumWindowsProc(Wnd: THandle; List: TStrings): Boolean; stdcall;
var
Caption: array [0..1024] of Char;
begin
if IsMainAppWindow(Wnd) and (GetWindowText(Wnd, Caption, SizeOf(Caption)) > 0) then
List.AddObject(Caption, Pointer(Wnd));
Result := True;
end;
begin
List.BeginUpdate;
try
Result := EnumWindows(@EnumWindowsProc, LPARAM(List));
finally
List.EndUpdate;
end;
end;
(c) JCL.