Q&A

  • 실행중인 Process의 핸들 얻기?
안녕하세요..



실행중인 Process의 ProcessID로 그 Process의 윈도우 핸들을



구할 수 있나요?



여기 있는 팁들을 보고 프로그램을 만들고 있는데,



실행 중인 프로세스를 찾아서 실행/종료 시키는 프로그램입니다..



근데 같은 프로그램이 두개 이상 실행될 수 있어서



그 프로그램의 캡션을 얻어서 두 프로그램을 구분해서 종료시키려 하거든요..



예를 들면, mytest.exe란 프로그램이 두개이상 실행될때,



캡션이 각각 mytest1, mytest2.... 이런식으로 실행된다고 생각하시면 됩니다..



좋은 답변 부탁드립니다..

2  COMMENTS
  • Profile
    김영대 1999.05.12 18:27
    강신구 wrote:

    > 안녕하세요..

    >

    > 실행중인 Process의 ProcessID로 그 Process의 윈도우 핸들을

    > 구할 수 있나요?

    > 여기 있는 팁들을 보고 프로그램을 만들고 있는데,

    > 실행 중인 프로세스를 찾아서 실행/종료 시키는 프로그램입니다..

    > 근데 같은 프로그램이 두개 이상 실행될 수 있어서

    > 그 프로그램의 캡션을 얻어서 두 프로그램을 구분해서 종료시키려 하거든요..

    > 예를 들면, mytest.exe란 프로그램이 두개이상 실행될때,

    > 캡션이 각각 mytest1, mytest2.... 이런식으로 실행된다고 생각하시면 됩니다..

    > 좋은 답변 부탁드립니다..



    안녕하세요 김영대입니다

    저도 비슷한 경험이 있어서 몇자 적어봅니다



    thread ID 를 가지고 EnumThreadWindows() 함수를 사용하면 원도우 핸들을

    구할 수 있고 반대로 원도우 핸들을 가지고 GetWindowThreadProcessID() 함수를

    사용하면 프로세스와 쓰레도 ID 를 구할 수 있습니다

    근데 Proess ID 를 가지고 window handle 을 구하는게 쉽지가 않고

    또 Process 를 TerminateProcess() 로 강제로 종료하면 그 프로그램이 사용했던

    resource 가 제대로 반납이 안되는 문제가 있으므로 해당 원도우에 WM_CLOSE

    메시지를 보내어 resource 를 반납할 기회를 주어야 좋을듯 합니다



    아래는 현재 실행중인 응용 프로그램들의 원도우 핸들을 구해서 처리하는

    예제입니다



    unit Unit1;



    interface



    uses

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

    StdCtrls;



    type

    TForm1 = class(TForm)

    ListBox1: TListBox;

    B_Search: TButton;

    B_Maximize: TButton;

    B_minimize: TButton;

    B_kill: TButton;

    procedure B_SearchClick(Sender: TObject);

    procedure B_MaximizeClick(Sender: TObject);

    procedure B_minimizeClick(Sender: TObject);

    procedure B_killClick(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    procedure GetAllWindowsProc(WinHandle: HWND; Slist: TStrings);

    var

    P: array[0..256] of Char; {title bar를 저장 할 buffer}

    begin

    P[0] := #0;

    GetWindowText(WinHandle, P, 255); {window's title bar를 알아낸다}

    if (P[0] <> #0) then

    (*

    if IsWindowVisible(WinHandle) and {invisible한 window는 제외}

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

    *)

    if IsWindowVisible(WinHandle) then {invisible한 window는 제외}

    Slist.AddObject(P, TObject(WinHandle)); {window의 handle 저장}

    end;



    procedure GetAllWindows(Slist: TStrings);

    var

    WinHandle: HWND;

    Begin

    WinHandle := FindWindow(nil, nil);

    GetAllWindowsProc(WinHandle, Slist);

    while (WinHandle <> 0) do {Top level의 window부터 순차적으로 handle을 구한다}

    begin

    WinHandle := GetWindow(WinHandle, GW_HWNDNEXT);

    GetAllWindowsProc(WinHandle, Slist);

    end;

    end;



    procedure TForm1.B_SearchClick(Sender: TObject);

    begin

    ListBox1.Items.Clear;

    GetAllWindows(ListBox1.Items);

    end;



    procedure TForm1.B_MaximizeClick(Sender: TObject);

    begin

    if ListBox1.ItemIndex < 0 then

    System.Exit;

    {선택한 window를 maximize}

    ShowWindow(HWND(ListBox1.Items.Objects[ListBox1.ItemIndex]), SW_MAXIMIZE);

    end;



    procedure TForm1.B_minimizeClick(Sender: TObject);

    begin

    if ListBox1.ItemIndex < 0 then

    System.Exit;

    {선택한 window를 minimize}

    ShowWindow(HWND(ListBox1.Items.Objects[ListBox1.ItemIndex]), SW_MINIMIZE);

    end;



    procedure TForm1.B_killClick(Sender: TObject);

    begin

    if ListBox1.ItemIndex < 0 then

    System.Exit;

    {선택한 window를 close 시킨다}

    PostMessage(HWND(ListBox1.Items.Objects[ListBox1.ItemIndex]), WM_CLOSE, 0, 0);

    end;



    end.





  • Profile
    신인재 1999.05.12 04:17
    HWND FindWindow(

    LPCTSTR lpClassName, // pointer to class name

    LPCTSTR lpWindowName // pointer to window name

    );



    를 써보세요. 예를 들어 캡션을 이용해 찾으려면.....



    myhwnd := findwindow(nil, 'mytest1');



    강신구 wrote:

    > 안녕하세요..

    >

    > 실행중인 Process의 ProcessID로 그 Process의 윈도우 핸들을

    >

    > 구할 수 있나요?

    >

    > 여기 있는 팁들을 보고 프로그램을 만들고 있는데,

    >

    > 실행 중인 프로세스를 찾아서 실행/종료 시키는 프로그램입니다..

    >

    > 근데 같은 프로그램이 두개 이상 실행될 수 있어서

    >

    > 그 프로그램의 캡션을 얻어서 두 프로그램을 구분해서 종료시키려 하거든요..

    >

    > 예를 들면, mytest.exe란 프로그램이 두개이상 실행될때,

    >

    > 캡션이 각각 mytest1, mytest2.... 이런식으로 실행된다고 생각하시면 됩니다..

    >

    > 좋은 답변 부탁드립니다..





    • summe
    • 1999.05.13 01:08
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김수지
      1999.07.31 00:21
      summe 께서 말씀하시기를... > 안녕하세요. > 답좀 부탁합니다. > TSToredProc 컴포넌트를 사용하려 합...
    • 정주영
      1999.05.13 06:05
      summe wrote: > 안녕하세요. > 답좀 부탁합니다. > TSToredProc 컴포넌트를 사용하려 합니다. > MSSQL ...
    • 영이...
    • 1999.05.13 00:38
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.05.13 00:43
      SQL.Add( and TDate="'+JunDate+'"'); 부분이 잘못 됐을꺼 같네요.... TDate가 혹시 date형 아닌가요...
    • 영이...
      1999.05.13 01:13
      신인재 wrote: > SQL.Add( and TDate="'+JunDate+'"'); > 부분이 잘못 됐을꺼 같네요.... > TDate가...
    • 하윤철
      1999.05.13 02:08
      영이... wrote: > TDate는 db상의 Date형식이고... > JunDate는 delphi의 var로 정의한 Date형의 변수입...
    • 이상윤
    • 1999.05.12 21:43
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.05.12 23:39
      이상윤 wrote: > 레지스트리를 읽어서 현재 기능을 > 쓸 수 있는지 없는지 알아내고자 합니다... > 그런...
    • 건맨
    • 1999.05.12 20:47
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.05.12 20:49
      폼의 OnCloseQuery 이벤트를 이용하시면 됩니다. 예를 들면... procedure TForm1.FormCloseQuery(Sende...
    • 이현신
      1999.05.13 00:34
      이정욱 wrote: > 폼의 OnCloseQuery 이벤트를 이용하시면 됩니다. > 예를 들면... > > procedure TFor...
    • 이정욱
      1999.05.13 02:35
      쩝.. 이게 그거에요.. 한번 해보세요... 이현신 wrote: > 이정욱 wrote: > > 폼의 OnCloseQuery 이...
    • 장일
    • 1999.05.12 19:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김지건
      1999.05.12 20:39
      장일 wrote: > 우편번호 검색프로그램을 구하려고 여기 저기 자료실을 돌아다니다가 > 다운 받으려고 했...
    • 현동식
    • 1999.05.12 19:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.05.12 19:39
      델파이에서 ActiveX폼을 만들어서 웹페이지에 띄우세요... 델파이는 ActiveX 폼을 만들기가 쉽죠...File/N...
    • 김명호
    • 1999.05.12 18:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조준형
      1999.05.21 23:52
      김명호 wrote: > Delphi 3.0에서 Midas관련해서 Test를 하려고 간단한 Program을 만들었는데 > Client에...
    • 이정욱
      1999.05.12 20:43
      사실 아래와 같이 하여도 문제는 발생하지 않습니다. 혹시 Uses문에 어떻게 하셨는지 모르겠네요.. Form2...
    • 송수정
    • 1999.05.12 03:46
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.05.12 06:51
      송수정 wrote: > 폼에 Image 컴포넌트를 놓고 일반 Text File 을 출력하는것 까지는 됐는데 > 문제는 ...
    • 송수정
      1999.05.13 03:21
      안치봉 wrote: > 송수정 wrote: > > 폼에 Image 컴포넌트를 놓고 일반 Text File 을 출력하는것 까지는...
    • 김봉재
    • 1999.05.12 02:52
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.05.12 05:19
      이런 부분을 한방에 할 수 있는 방법은 없습니다. 전역변수로 Boolean값을 정의 하고 FileListBox1에 M...
    • 강신구
    • 1999.05.12 02:52
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      1999.05.12 18:27
      강신구 wrote: > 안녕하세요.. > > 실행중인 Process의 ProcessID로 그 Process의 윈도우 핸들을 > 구...
    • 신인재
      1999.05.12 04:17
      HWND FindWindow( LPCTSTR lpClassName, // pointer to class name LPCTSTR lpWindowName // po...
    • 송재환
    • 1999.05.12 02:48
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      1999.05.12 08:13
      송재환님 안녕하세요? 하루는 24시간이니 날짜연산을 하세요. 아래는 김영대님이 올리신 날짜연산 예제...
    • 이호선
    • 1999.05.12 02:31
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.05.12 05:10
      한델 자료실에 있는 ICS를 이용해 보시지요.... 그럼 Character Set을 정하실 수 있을 겁니다. 이호...
    • chos
    • 1999.05.12 02:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하윤철
      1999.05.12 17:20
      chos wrote: > 델파이 4로 작성한 프로그램을 인스톨쉴드로 배포했는데 인스톨되는 컴퓨터의 > > ...
    • 땡글이
    • 1999.05.12 00:44
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      1999.05.12 02:01
      땡글이 wrote: > 실력은 엄꼬 궁금한것만 많은 왕초봅니다.... > 어제 올려주신 Q&A를 나름대로 봤는데요...
    • 안치봉
      1999.05.12 01:57
      땡글이 wrote: > 실력은 엄꼬 궁금한것만 많은 왕초봅니다.... > 어제 올려주신 Q&A를 나름대로 봤는데요...
    • 이호선
    • 1999.05.12 00:20
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.05.12 02:00
      치봉님께서 답변을 해주셨지만 조금 더 가닥을 잡기위해.. ^^; 일단 TBitmap을 생성하세요. 그리고 이미...
    • 안치봉
      1999.05.12 01:50
      이호선 wrote: > 안녕하세요. > 이미지를 이미지 콤퍼넌트를 이용하지 않고 지정된 화일만을 가지고 > ...
    • 이지훈
    • 1999.05.11 23:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신인재
      1999.05.12 02:29
      오라클을 접속하기 위해서는 sql-net인가 오라클에서 배포하는 네트웍 모듈이 있습니다. 이것을 깔아 주...
    • 왕초보
    • 1999.05.11 22:02
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.05.12 01:46
      왕초보 wrote: > 프로젝트 내의 form1, form2, form3중 form1만 프로젝트 옵션에서 > auto creation이고 ...
    • 왕초보
      1999.05.12 02:11
      안치봉 wrote: > 왕초보 wrote: > > 프로젝트 내의 form1, form2, form3중 form1만 프로젝트 옵션에서 >...