Как получить подписи к текущим окнам, запущенным в данный момент?
У меня есть вопрос: мне просто нужно получить подписи всех окон в списке, под заголовками я имею в виду "Блокнот", "Total Commander" - просто текст, показанный в верхнем крае окна.
Пока я здесь
function EnumWindowProc(hHwnd: HWND; lParam : integer): boolean; stdcall;
var
pPid : DWORD;
title, ClassName : string;
begin
if (hHwnd=NULL) then
begin
result := false;
end
else
begin
GetWindowThreadProcessId(hHwnd,pPid);
SetLength(ClassName, 255);
SetLength(ClassName,
GetClassName(hHwnd,
PChar(className),
Length(className)));
SetLength(title, 255);
SetLength(title, GetWindowText(hHwnd, PChar(title), Length(title)));
OptionsForm.ListBox1.Items.Add(title);
OptionsForm.Memo1.Lines.Add
('Class Name = ' + className +
'; Title = ' + title +
'; HWND = ' + IntToStr(hHwnd) +
'; Pid = ' + IntToStr(pPid));
Result := true;
end;
end;
Но он возвращает все виды "окон", различные фокусы форм и т. Д. Как я могу получить только "основные"?
Вот образец результатов:
Class Name = Shell_TrayWnd; Title = ; HWND = 65898; Pid = 3776
Class Name = CiceroUIWndFrame; Title = CiceroUIWndFrame; HWND = 65976; Pid = 3776
Class Name = THelpInsightWindowImpl; Title = HelpInsightWindow; HWND = 1577734; Pid = 4852
Class Name = THelpInsightWindowImpl; Title = HelpInsightWindow; HWND = 591660; Pid = 4852
Class Name = TTokenWindow; Title = CodeParamWindow; HWND = 985436; Pid = 4852
Class Name = TaskSwitcherWnd; Title = Přepínání úloh; HWND = 66824; Pid = 3776
Class Name = tooltips_class32; Title = ; HWND = 198982; Pid = 1768
Class Name = tooltips_class32; Title = ; HWND = 66046; Pid = 3776
Class Name = _SearchEditBoxFakeWindow; Title = ; HWND = 66024; Pid = 3776
Class Name = tooltips_class32; Title = ; HWND = 66008; Pid = 3776
Class Name = tooltips_class32; Title = ; HWND = 131538; Pid = 3776
Class Name = Desktop User Picture; Title = Magicmaster; HWND = 65982; Pid = 3776
Class Name = DV2ControlHost; Title = Nabídka Start; HWND = 65978; Pid = 3776
Class Name = tooltips_class32; Title = ; HWND = 327840; Pid = 1768
Class Name = tooltips_class32; Title = ; HWND = 460808; Pid = 1768
Class Name = CTSCTooltip; Title = ; HWND = 266710; Pid = 2792
Class Name = Auto-Suggest Dropdown; Title = ; HWND = 69884; Pid = 4732
Class Name = Auto-Suggest Dropdown; Title = ; HWND = 69802; Pid = 4732
Class Name = TaskbarNotifierClass; Title = DAP Message Center; HWND = 68924; Pid = 4732
Class Name = tooltips_class32; Title = ; HWND = 134356; Pid = 1992
Class Name = ATKOSD; Title = ATKOSD; HWND = 65884; Pid = 3636
Заранее спасибо!
2 ответа
Важная информация содержится в теме MSDN, описывающей панель задач. По сути, вам нужно перечислить окна верхнего уровня и выбрать те, которые являются видимыми, неподходящими и имеют WS_EX_APPWINDOW
стиль окна
Эта программа показывает вам, как это делается:
program EnumTaskbarWindows;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
s: string;
IsVisible, IsOwned, IsAppWindow: Boolean;
begin
Result := True;//carry on enumerating
IsVisible := IsWindowVisible(hwnd);
if not IsVisible then
exit;
IsOwned := GetWindow(hwnd, GW_OWNER)<>0;
if IsOwned then
exit;
IsAppWindow := GetWindowLongPtr(hwnd, GWL_STYLE) and WS_EX_APPWINDOW<>0;
if not IsAppWindow then
exit;
SetLength(s, GetWindowTextLength(hwnd));
GetWindowText(hwnd, PChar(s), Length(s)+1);
Writeln(s);
end;
begin
EnumWindows(@EnumWindowsProc, 0);
end.
Вы хотите проверить свойства этих окон. Например, исключите любое окно, которое не видно. Вы делаете это с GetWindowInfo
, Свойства для поиска: без заголовка (отсутствует WS_CAPTION
в dwStyle
) или не виден (WS_VISIBLE
флаг). Вы также можете проверить наличие окон, которые перемещены за пределы экрана, но это немного сложно (может быть несколько мониторов, даже при отрицательных смещениях)