|
에고.. 죄송합니다.. 제가 쫌 띄엄띄엄 해서.. -_-;;
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의 핸들값과
: 틀린값이 들어가 있어요..
:
: 제가 잘 모르는건지...
:
: 답변 다시한번 고맙구요 혹시 조언이 있으시면 부탁드립니다.
|