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;
Программный код, предоставленный вами, используется для получения списка кнопок в панели задач, конкретно - заголовка, идентификатора процесса и иконок (крупных и маленьких) для каждого окна. Вот подробное описание того, что код делает:
Функция GetModuleFileNameExW получает имя файла исполняемого модуля из процесса.
Функция WindowGetEXE получает имя файла исполняемого модуля окна.
Функция WindowGetIcon получает иконку окна, либо маленькую, либо большую.
Функция EnumWindowsProc перечисляет все окна и выполняет некоторые проверки для фильтрации нежелательных окон (например, скрытых, уменьшенных или принадлежащих другому процессу).
Для каждого отфильтрованного окна код добавляет элемент в список управления с следующей информацией:
Заголовок: получается с помощью GetWindowText.
Идентификатор процесса: не явно показан в коде, но можно получить с помощью GetWindowThreadProcessID.
Имя файла исполняемого модуля: получается с помощью WindowGetEXE.
Маленькая иконка: получается с помощью WindowGetIcon с fSmall=true.
Большая иконка: получается с помощью WindowGetIcon с fSmall=false.
События обработчика кнопки Button1Click очищают список управления и изображения, а затем вызывают EnumWindowsProc, чтобы заполнить список управления информацией о всех окнах.
Чтобы получить список кнопок в панели задач, обычно нужно перечислять иконки на панели задач самой. Однако, это невозможно с помощью стандартных функций Windows API. Один из способов достичь этого - использовать функцию Shell_NotifyIcon для создания уведомления о иконке и затем перечислять связанные иконки. Вот пример:
functionEnumNotifyIconsProc(hwnd:HWND;lParam:LPARAM):BOOL;stdcall;varni:NOTIFYICONDATA;beginresult:=true;GetWindowInfo(hwnd,ni);// Обработка информации о уведомлении о иконке...end;procedureTForm1.Button2Click(Sender:TObject);varnidData:NOTIFYICONDATA;beginListView1.Clear;EnumWindows(@EnumNotifyIconsProc,LPARAM(0));end;
В этом примере EnumNotifyIconsProc перечисляет все уведомления о иконках на системе и обрабатывает их информацию. События обработчика кнопки Button2Click очищают список управления и затем вызывают EnumNotifyIconsProc, чтобы заполнить его информацией о всех уведомлениях о иконках.
Обратите внимание, что это код требует использования функции Shell_NotifyIcon в сочетании с структурой NOTIFYICONDATA для создания уведомления о иконке.
Получить список кнопок в таскбаре (TASKBAR) можно с помощью функции EnumWindows, которая перебирает все окна на компьютере и добавляет их в ListView.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.