[delphi-users:4268] Re: プロセスIDからウィンドウハンドルを取得するには
へのレスです.
こんにちは.Mr.XRAYです.
>■ 06_EXE のフルパスからウィンドウハンドルを取得
>
http://mrxray.on.coocan.jp/Delphi/plSamples/330_AppProcessList.htm#06
ちょっとしたテクニックというか,ノウハウ的に,こんな手もあります.
コールバック関数の引数を利用して,ウィンドハンドルを取得します.
//---------------------------------------------------------------------
// EnumWindowsのコールバック関数
// 以下の条件の時に終了とし,引数のlpにその時のウインドウハンドルを返す
// (1) hTopWndのプロセスIDが引数のlPと同じ
// (2) オーナーを持たないウィンドウ
// (3) 可視状態のウィンドウである
//---------------------------------------------------------------------
function EnumTopWindow(hTopWnd: HWND; lp: LPARAM): BOOL; stdcall;
var
p : LPDWORD;
ProcessId : DWORD;
begin
Result := True;
GetWindowThreadProcessId(hTopWnd, @ProcessId);
p := LPDWORD(lp);
if (ProcessId = p^) and (GetWindow(hTopWnd, GW_OWNER) = 0)
and IsWindowVisible(hTopWnd) then begin
p^ := hTopWnd;
Result := False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
dwIDOrigin : DWORD; //プロセスID
dwIDHandle : DWORD; //EnumWindowsで取得したウィンドウハンドル
begin
....
//これがミソ
dwIDHandle := dwIDOrigin;
//ウィンドウの列挙
EnumWindows(@EnumTopWindow, LPARAM(@dwIDHandle));
//dwIDHandleが元のプロセスIDと同じなら取得できなかったことになる
if dwIDHandle <> dwIDOrigin then begin
...
end;
end;
http://ad.freeml.com/cgi-bin/sa.cgi?id=nvPWD
------------------------------------------------------[freeml byGMO]--