본문 바로가기

Delphi/꿀팁

실행중인 프로그램 목록과 아이콘 가져오기

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;


반응형