C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[21158] Re:Re:Re:CreateProcess로 실행한 프로그램의 윈도 핸들값을 가져오는 방법은?
유영인.Chris [cuperido] 2293 읽음    2002-08-31 14:01
에고.. 죄송합니다.. 제가 쫌 띄엄띄엄 해서.. -_-;;

Windows Handle의 경우에는 직접 알 수 있는 방법은 없고, 각각의 Window의 ThreadID를 비교하여 추출해 내는 방법이 있습니다. 우선은 그냥 이렇게 사용하고 있습니다. 더 좋은 방법이 있을지는요.. -_-;;

아래 예제는 실행한 윈도우의 캡션을 바꾸는 예제입니다.
그냥 된다는 것만 보여드리기 위해서 한거라서...

      hdWindow = GetHandle(piParam.dwThreadId);
      if(hdWindow) SetWindowText(hdWindow, "실행중인 윈도우");

이 부분이 계속 실행 되는걸 막으셔야 할 것 같습니다.


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND RETURN_HANDLE = NULL;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

BOOL CALLBACK EnumWindowsProc(HWND hdHandle, LPARAM lpParam)
{

int               itThreadID;


if(RETURN_HANDLE) return(true);

itThreadID = GetWindowThreadProcessId(hdHandle, NULL);
if(itThreadID == lpParam) RETURN_HANDLE = hdHandle;

return(true);

}

//---------------------------------------------------------------------------

HWND __fastcall TForm1::GetHandle(int itThreadID)
{

HWND              hdHandle;
RECT              rtPosition;
LONG              lnStyle;


RETURN_HANDLE = NULL;
EnumWindows((WNDENUMPROC)EnumWindowsProc, itThreadID);

return(RETURN_HANDLE);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

HWND                            hdWindow;
STARTUPINFO                  siParam;
PROCESS_INFORMATION      piParam;
DWORD                           dwExitCode;

String stCommand = "C:\\Winnt\\notepad.exe";

// 초기화
FillMemory(&siParam, sizeof(STARTUPINFO), 0);
FillMemory(&piParam, sizeof(PROCESS_INFORMATION), 0);

// Param 섯팅
siParam.cb               = sizeof(STARTUPINFO);
siParam.dwFlags       = STARTF_USESHOWWINDOW;
siParam.wShowWindow   = SW_SHOW;

CreateProcess(NULL, stCommand.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &siParam, &piParam);
WaitForInputIdle(GetCurrentProcess(), INFINITE);

// 프로세스가 종료될때까지 대기함
if(piParam.hProcess) {
   dwExitCode = STILL_ACTIVE;

   while(dwExitCode == STILL_ACTIVE) {
      hdWindow = GetHandle(piParam.dwThreadId);
      if(hdWindow) SetWindowText(hdWindow, "실행중인 윈도우");

      WaitForSingleObject(piParam.hProcess, 1000);
      GetExitCodeProcess(piParam.hProcess, &dwExitCode);
      UpdateWindow(Handle);
   }
}

}
//---------------------------------------------------------------------------



sulzip 님이 쓰신 글 :
: 영인님 늘 좋은 답변 고맙구요..
:
: 근데 .hProcess 의 핸들과 실행프로그램의 윈도 핸들하고 같은가요?
:
: 잘 모르겠지만 틀린거로 알고 있거든요?
:
: ::SetParent( , ) API실행시 앞인자는 client의 윈도 핸들이 들어가고
: 뒤 인자는 부모 윈도의 핸들이 들어가는거로 알고 있는데
:
: .hProcess 의 값을 앞인자에 넣고 제 폼의 handle를 뒤 인자에 넣으면
: 시스템이 다운되는 현상이 생깁니다..
:
: 그리고 winsight로 해당 프로그램의 핸들값을 보면 .hProcess의 핸들값과
: 틀린값이 들어가 있어요..
:
: 제가 잘 모르는건지...
:
: 답변 다시한번 고맙구요 혹시 조언이 있으시면 부탁드립니다.

+ -

관련 글 리스트
21149 CreateProcess로 실행한 프로그램의 윈도 핸들값을 가져오는 방법은? sulzip 1315 2002/08/31
21150     Re:CreateProcess로 실행한 프로그램의 윈도 핸들값을 가져오는 방법은? 유영인.Chris 1454 2002/08/31
21152         Re:Re:CreateProcess로 실행한 프로그램의 윈도 핸들값을 가져오는 방법은? sulzip 2144 2002/08/31
21158             Re:Re:Re:CreateProcess로 실행한 프로그램의 윈도 핸들값을 가져오는 방법은? 유영인.Chris 2293 2002/08/31
21177                 감사드립니다.. sulzip 930 2002/09/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.