프로세스의 pID를 알고 있다고 가정함.
(CreateProcess를 통해서 프로세스를 실행시켰거나...)



type
  TPIDandHWND=record
    pID: DWORD;
    hWindow: HWND;
  end;



// aHWND의 캡션을 반환
function GetWindowText(aHWND: HWND): String;
var iLen: Integer;
begin
  iLen:=SendMessage(aHWND, WM_GETTEXTLENGTH, 0, 0);
  SetLength(Result, iLen+1);
  SendMessage(aHWND, WM_GETTEXT, iLen+1, lParam(PWideChar(Result))); 
end;

// 윈도우를 뒤져서 pID, 캡션, 클래스명이 일치하는 윈도우의 핸들 가져오기
function EnumWindowProc(hWindow: HWND; var lParam: TPIDandHWND): Boolean; stdcall;
var
  pID: DWORD;
  sClassName, sCaption: array [0..MAX_PATH] of WideChar;
begin
  GetWindowThreadProcessID(hWindow, @pID);
  GetClassName(hWindow, sClassName, MAX_PATH);
  StrCopy(sCaption, PWideChar(GetWindowText(hWindow)));
  if (lParam.pID=pID) and (sClassName='SciCalc') and (sCaption='계산기') then begin
    lParam.hWindow:=hWindow;
    Result:=False;
  end
  else Result:=True;
end;

// 프로세스ID로 윈도우 핸들 가져오기
function WindowFromProcessID(pID: DWORD): HWND;
var lParam: TPIDandHWND;
begin
  lParam.pID:=pID;
  lParam.hWindow:=0;
  EnumWindows(@EnumWindowProc, Integer(@lParam));
  Result:=lParam.hWindow;
end;













Posted by bloodguy
,