Список кнопок в таскбаре..., Как получить?

Материал из DRKB

Список кнопок в таскбаре..., Как получить?[править | править код]

uses CommCtrl;

function GetModuleFileNameExW(hProcess: THandle; hModule: HMODULE; lpFilename: PWideChar; nSize: DWORD): DWORD; stdcall; external 'PSAPI.DLL';

const
  ICON_SMALL2 = 2;

function WindowGetEXE(wnd: HWND): string;
var
  wt: array[0..MAX_PATH-1] of WChar;
  r: Integer;
  prc: THandle;
  prcID: Cardinal;
begin
  Result := '';
  if GetWindowThreadProcessID(wnd, prcID) <> 0 then
  begin
    prc := OpenProcess(PROCESS_ALL_ACCESS, False, prcID);
    if prc <> 0 then
    try
      r := GetModuleFileNameExW(prc, 0, wt, MAX_PATH*2);
      if r <> 0 then Result := wt;
    finally
      CloseHandle(prc)
    end
  end
end;

function WindowGetIcon(wnd: HWND; fSmall: Boolean): Cardinal;
var
  defIcon: HICON;
  r, iType1, iType2: Integer;
begin
  defIcon := LoadIcon(0, IDI_APPLICATION);
  if fSmall then
  begin
    iType1 := ICON_SMALL2;
    iType2 := GCL_HICONSM;
  end
  else
  begin
    iType1 := ICON_BIG;
    iType2 := GCL_HICON;
  end;

  r := SendMessageTimeOut(wnd, WM_GETICON, iType1, 0, SMTO_ABORTIFHUNG or SMTO_NOTIMEOUTIFNOTHUNG, 100, Result);
  if (r = 0) then
    Result := defIcon
  else
  begin
    if (Result = 0) then
      Result := GetClassLong(wnd, iType2);
    if (Result = 0) then
      Result := defIcon;
  end;
end;

function EnumWindowsProc(wnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
  wn: array[0..MAX_PATH-1] of Char;
begin
  Result := True;
  if IsWindowVisible(wnd)
  and (GetParent(wnd) = 0)
  and (GetWindow(wnd,GW_OWNER) = 0)
  and ((GetWindowLong(wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0)
  then
  begin
    GetWindowText(wnd, wn, MAX_PATH);
    with Form1.ListView1.Items.Add do
    begin
      Caption := wn; // заголовок
      SubItems.Add(IntToStr(wnd)); // дескриптор
      SubItems.Add(WindowGetEXE(wnd)); // exe
      SubItems.Add(' '); // колонка для большой иконки
      ImageIndex := ImageList_AddIcon(Form1.ImageList1.Handle,WindowGetIcon(wnd, True)); // маленькая иконка
      SubItemImages[2] := ImageList_AddIcon(Form1.ImageList2.Handle,WindowGetIcon(wnd, False)); // большая иконка
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListView1.Clear;
  ImageList1.Clear;
  ImageList2.Clear;
  EnumWindows(@EnumWindowsProc, 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // ImageList1 - 16x16;  ImageList2 - 32x32;
  ListView1.SmallImages := ImageList1;
  ListView1.LargeImages := ImageList2;
end;


Author: Krid
Source: Взято из http://forum.sources.ru
ID: 01778