我有一个问题:我只需要在列表中显示所有窗口的标题,标题是我的意思是“记事本”,“总指挥官” – 只是窗口顶部显示的文本。
到目前为止,我已经到了这里
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;
但是,它返回各种各样的“窗口”,forms的不同重点等。我怎么只能得到“主要”的?
以下是结果示例:
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
先谢谢你!
重要信息包含在描述任务栏的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
做到这一点。 要查找的属性:没有标题(在dwStyle
缺少dwStyle
)或不可见( WS_VISIBLE
标志)。 您可能还想要检查移出屏幕的窗口,但这有点棘手(即使在负偏移时也可能有多个显示器)