Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как получить Список кнопок в таскбаре (TASKBAR)?

Delphi , Рабочий стол , TaskBar

Code:

uses CommCtrl;
{©Drkb v.3(2007): www.drkb.ru}
 
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;
Взято из http://forum.sources.ru

Автор: Krid

Программный код, предоставленный вами, используется для получения списка кнопок в панели задач, конкретно - заголовка, идентификатора процесса и иконок (крупных и маленьких) для каждого окна. Вот подробное описание того, что код делает:

  1. Функция GetModuleFileNameExW получает имя файла исполняемого модуля из процесса.
  2. Функция WindowGetEXE получает имя файла исполняемого модуля окна.
  3. Функция WindowGetIcon получает иконку окна, либо маленькую, либо большую.
  4. Функция EnumWindowsProc перечисляет все окна и выполняет некоторые проверки для фильтрации нежелательных окон (например, скрытых, уменьшенных или принадлежащих другому процессу).
  5. Для каждого отфильтрованного окна код добавляет элемент в список управления с следующей информацией:
    • Заголовок: получается с помощью GetWindowText.
    • Идентификатор процесса: не явно показан в коде, но можно получить с помощью GetWindowThreadProcessID.
    • Имя файла исполняемого модуля: получается с помощью WindowGetEXE.
    • Маленькая иконка: получается с помощью WindowGetIcon с fSmall=true.
    • Большая иконка: получается с помощью WindowGetIcon с fSmall=false.

События обработчика кнопки Button1Click очищают список управления и изображения, а затем вызывают EnumWindowsProc, чтобы заполнить список управления информацией о всех окнах.

Чтобы получить список кнопок в панели задач, обычно нужно перечислять иконки на панели задач самой. Однако, это невозможно с помощью стандартных функций Windows API. Один из способов достичь этого - использовать функцию Shell_NotifyIcon для создания уведомления о иконке и затем перечислять связанные иконки. Вот пример:

function EnumNotifyIconsProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
  ni: NOTIFYICONDATA;
begin
  result := true;
  GetWindowInfo(hwnd, ni);
   // Обработка информации о уведомлении о иконке...
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  nidData: NOTIFYICONDATA;
begin
  ListView1.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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TaskBar ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 10:00:13/0.006274938583374/0