Q&A

  • 현재작업표시줄에 떠있는 프로그램 목록구하기
어제 밤에 질문을 올렸는데...답변이 없어서 다시 글을 올립니다.

작업표시줄에 나타나는 프로그램이나 혹은 Ctrl+Alt+Del키를 눌렀을때 나타나는 프로그램의 목록을 불러올수 있는 방법이 없을까요?

어제부터 델파이 관련 자료를 찾느라 죽을 맛입니다. 실행중인 프로세서를 불러오는것은 되는데 너무 세세한것 까지 불러오는 바람에...(보는 사람이 무슨 프로그램이 떠 있는지 확인하기가 난해해서요)

아시는 분은 도움주십시요.

그럼...즐코하세요. 이만..

3  COMMENTS
  • Profile
    톰과 제리 2000.07.01 07:48
    태스크바에 나타나는 프로그램 목록 예젭니다.

    그럼.



    function EnumWindowsProc(Wnd: HWND; lb: TListbox): BOOL; stdcall;

    var

    caption: Array [0..128] of Char;

    begin

    Result := True;

    if {skip invisible windows}

    IsWindowVisible(Wnd) and

    {only process truly top-level windows. GetWindowLong must be used, not GetParent}

    ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or

    (HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow)) and

    {skip WS_EX_TOOLWINDOW windows}

    ((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0) then

    begin

    SendMessage(Wnd, WM_GETTEXT, Sizeof(caption), integer(@caption));

    lb.Items.AddObject(caption, TObject(Wnd));

    end;

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    ListBox1.Clear;

    EnumWindows(@EnumWindowsProc, Integer(ListBox1));

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    var

    i: Integer;

    Wnd: HWND;

    begin

    for i := 0 to ListBox1.Items.Count-1 do

    begin

    Wnd := HWND(ListBox1.Items.Objects[i]);

    // 이 프로그램이 아니고 minimized(iconic)가 아니면...

    if (Wnd <> 0) and (Wnd <> Application.Handle) then

    if not IsIconic(Wnd) then

    begin

    ShowWindow(Wnd, SW_HIDE);

    ShowWindow(Wnd, SW_MINIMIZE);

    end;

    end;

    end;



    procedure TForm1.ListBox1Click(Sender: TObject);

    var

    theClassname: array [0..128] of Char;

    Wnd: HWND;

    tid, pid: DWORD;

    begin

    with Sender as TListbox do

    begin

    if ItemIndex >= 0 then

    begin

    Wnd := HWND(Items.Objects[itemindex]);

    if Wnd <> 0 then

    begin

    Windows.GetClassname(Wnd, theClassname, Sizeof(classname));

    tid := GetWindowThreadProcessID(Wnd, @pid );

    label1.caption :=

    Format(

    'HWND: %8.8x'#13#10+

    'Class: %s'#13#10+

    'Process ID: %8.8x'#13#10+

    'Thread ID: %8.8x',

    [Wnd, theClassname, pid, tid] );

    end;

    end;

    end;

    end;







    임형호 wrote:

    > 어제 밤에 질문을 올렸는데...답변이 없어서 다시 글을 올립니다.

    > 작업표시줄에 나타나는 프로그램이나 혹은 Ctrl+Alt+Del키를 눌렀을때 나타나는 프로그램의 목록을 불러올수 있는 방법이 없을까요?

    > 어제부터 델파이 관련 자료를 찾느라 죽을 맛입니다. 실행중인 프로세서를 불러오는것은 되는데 너무 세세한것 까지 불러오는 바람에...(보는 사람이 무슨 프로그램이 떠 있는지 확인하기가 난해해서요)

    > 아시는 분은 도움주십시요.

    > 그럼...즐코하세요. 이만..dd

  • Profile
    임형호 2000.07.01 08:32
    감사합니다.

    잘 되는것 같습니다.

    정말로 감사드립니다.



    톰과 제리 wrote:

    > 태스크바에 나타나는 프로그램 목록 예젭니다.

    > 그럼.

    >

    > function EnumWindowsProc(Wnd: HWND; lb: TListbox): BOOL; stdcall;

    > var

    > caption: Array [0..128] of Char;

    > begin

    > Result := True;

    > if {skip invisible windows}

    > IsWindowVisible(Wnd) and

    > {only process truly top-level windows. GetWindowLong must be used, not GetParent}

    > ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or

    > (HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow)) and

    > {skip WS_EX_TOOLWINDOW windows}

    > ((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0) then

    > begin

    > SendMessage(Wnd, WM_GETTEXT, Sizeof(caption), integer(@caption));

    > lb.Items.AddObject(caption, TObject(Wnd));

    > end;

    > end;

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > begin

    > ListBox1.Clear;

    > EnumWindows(@EnumWindowsProc, Integer(ListBox1));

    > end;

    >

    > procedure TForm1.Button2Click(Sender: TObject);

    > var

    > i: Integer;

    > Wnd: HWND;

    > begin

    > for i := 0 to ListBox1.Items.Count-1 do

    > begin

    > Wnd := HWND(ListBox1.Items.Objects[i]);

    > // 이 프로그램이 아니고 minimized(iconic)가 아니면...

    > if (Wnd <> 0) and (Wnd <> Application.Handle) then

    > if not IsIconic(Wnd) then

    > begin

    > ShowWindow(Wnd, SW_HIDE);

    > ShowWindow(Wnd, SW_MINIMIZE);

    > end;

    > end;

    > end;

    >

    > procedure TForm1.ListBox1Click(Sender: TObject);

    > var

    > theClassname: array [0..128] of Char;

    > Wnd: HWND;

    > tid, pid: DWORD;

    > begin

    > with Sender as TListbox do

    > begin

    > if ItemIndex >= 0 then

    > begin

    > Wnd := HWND(Items.Objects[itemindex]);

    > if Wnd <> 0 then

    > begin

    > Windows.GetClassname(Wnd, theClassname, Sizeof(classname));

    > tid := GetWindowThreadProcessID(Wnd, @pid );

    > label1.caption :=

    > Format(

    > 'HWND: %8.8x'#13#10+

    > 'Class: %s'#13#10+

    > 'Process ID: %8.8x'#13#10+

    > 'Thread ID: %8.8x',

    > [Wnd, theClassname, pid, tid] );

    > end;

    > end;

    > end;

    > end;

    >

    >

    >

    > 임형호 wrote:

    > > 어제 밤에 질문을 올렸는데...답변이 없어서 다시 글을 올립니다.

    > > 작업표시줄에 나타나는 프로그램이나 혹은 Ctrl+Alt+Del키를 눌렀을때 나타나는 프로그램의 목록을 불러올수 있는 방법이 없을까요?

    > > 어제부터 델파이 관련 자료를 찾느라 죽을 맛입니다. 실행중인 프로세서를 불러오는것은 되는데 너무 세세한것 까지 불러오는 바람에...(보는 사람이 무슨 프로그램이 떠 있는지 확인하기가 난해해서요)

    > > 아시는 분은 도움주십시요.

    > > 그럼...즐코하세요. 이만..dd

  • Profile
    서동범 2000.10.31 20:39
    그대로 했는데 안되는 이유가 뭘까요. 초보입니다. 게시판 뒤지다가 한번 써보려고 했는데 안되는군요. 한수 부탁드립니다. 앞에 답변하신분의 내용은 그대로 입니다. use나 이런곳에

    뭐 추가 해주어야 할게 있나요...





    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls;



    type

    TForm1 = class(TForm)

    ListBox1: TListBox;

    Button1: TButton;

    Button2: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure ListBox1Click(Sender: TObject);

    private

    { Private declarations }

    function EnumWindowsProc(Wnd: HWND; lb: TListbox): BOOL; stdcall;

    public

    { Public declarations }



    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}



    function TForm1.EnumWindowsProc(Wnd: HWND; lb: TListbox): BOOL; stdcall;

    var

    caption: Array [0..128] of Char;

    begin

    Result := True;

    if {skip invisible windows}

    IsWindowVisible(Wnd) and

    {only process truly top-level windows. GetWindowLong must be used, not GetParent}

    ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or

    (HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow)) and

    {skip WS_EX_TOOLWINDOW windows}

    ((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0) then

    begin

    SendMessage(Wnd, WM_GETTEXT, Sizeof(caption), integer(@caption));

    lb.Items.AddObject(caption, TObject(Wnd));

    end;

    end;





    procedure TForm1.Button1Click(Sender: TObject);

    begin

    ListBox1.Clear;

    EnumWindows(@EnumWindowsProc, Integer(ListBox1));

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    var

    i: Integer;

    Wnd: HWND;

    begin

    for i := 0 to ListBox1.Items.Count-1 do

    begin

    Wnd := HWND(ListBox1.Items.Objects[i]);

    // 이 프로그램이 아니고 minimized(iconic)가 아니면...

    if (Wnd <> 0) and (Wnd <> Application.Handle) then

    if not IsIconic(Wnd) then

    begin

    ShowWindow(Wnd, SW_HIDE);

    ShowWindow(Wnd, SW_MINIMIZE);

    end;

    end;

    end;





    procedure TForm1.ListBox1Click(Sender: TObject);

    var

    theClassname: array [0..128] of Char;

    Wnd: HWND;

    tid, pid: DWORD;

    begin

    with Sender as TListbox do

    begin

    if ItemIndex >= 0 then

    begin

    Wnd := HWND(Items.Objects[itemindex]);

    if Wnd <> 0 then

    begin

    Windows.GetClassname(Wnd, theClassname, Sizeof(classname));

    tid := GetWindowThreadProcessID(Wnd, @pid );

    label1.caption :=

    Format(

    'HWND: %8.8x'#13#10+

    'Class: %s'#13#10+

    'Process ID: %8.8x'#13#10+

    'Thread ID: %8.8x',

    [Wnd, theClassname, pid, tid] );

    end;

    end;

    end;

    end;



    end.