1. 폼위에 ListView, Button, ImageList를 올려놓습니다.
2. 폼의 OnCreate 이벤트에서 초기 설정을 해줍니다.
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.BkColor := ListView1.Color;
ListView1.ViewStyle := vsReport;
ListView1.SmallImages := ImageList1;
ListView1.Columns.Add;
ListView1.Columns[0].Caption :='실행중인 프로그램';
ListView1.Columns[0].Width := ListView1.Width;
end;
3. 프로그램 목록을 가져오는 전역 함수를 작성합니다.
function EnumWindowProc(hWindow: HWND; lParam: LPARAM): Boolean; stdcall;
function GetIcon(hWindow: HWND): HICON;
begin
Result := SendMessage(hWindow, WM_GETICON, ICON_SMALL2, 0);
if Result = 0 then
begin
Result := SendMessage(hWindow, WM_GETICON, ICON_SMALL, 0);
if Result = 0 then
Result := GetClassLong(hWindow, GCL_HICONSM);
end;
end;
Var
WndText : string;
AItem : TListItem;
AIcon : TIcon;
begin
Result := True;
if not IsWindowVisible(hWindow) then Exit; //보여지고 있는 프로그램만 리스트뷰에 추가합니다.
SetLength(WndText, MAX_PATH);
if GetWindowText(hWindow, PChar(WndText), MAX_PATH) > 0 then
begin
SetLength(WndText, StrLen(PChar(WndText)));
AIcon := TIcon.Create;
try
AItem := Form1.ListView1.Items.Add;
AItem.Caption := WndText;
AIcon.Handle := GetIcon(hWindow); //아이콘의 이미지 정보를 가져옵니다.
AItem.ImageIndex := Form1.ImageList1.AddIcon(AIcon);
finally
FreeAndNil(AIcon);
end;
end;
end;
4. 버튼의 OnClick 이벤트에서 프로그램 목록을 불러옵니다.
procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.Items.Clear;
ImageList1.Clear;
EnumWindows(Addr(EnumWindowProc), 0); //실행되고 있는 최상위 프로그램을 가져옵니다.
//참조 -> https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumwindows
end;