by mir » 2005年10月19日(水) 22:12
Toshiさん、hiraさん すばやい返答ありがとうございます。
お二人方のお答えより、次のような形のプログラムを考えました。
コード: 全て選択
Dim hNew As DWord
Dim strExeFileName As String
Dim udtProcessAttributes As SECURITY_ATTRIBUTES
Dim udtThreadAttributes As SECURITY_ATTRIBUTES
Dim udtStartupInfo As STARTUPINFO
Dim udtProcessInformation As PROCESS_INFORMATION
Dim dwWaitForObjectEvent As DWord
'実行可能ファイル名を指定[起動にある程度時間がかかるソフトで試してみて下さい]
strExeFileName="C:\Program Files\Microsoft Office\Office10\Winword.exe"
'セキュリティ構造体を初期化
udtProcessAttributes.nLength=SizeOf(SECURITY_ATTRIBUTES)
udtThreadAttributes.nLength=SizeOf(SECURITY_ATTRIBUTES)
'新しいプロセスのメインウィンドウの表示状態を指定
udtStartupInfo.cb=SizeOf(STARTUPINFO)
'新しいプロセスを作成
CreateProcess(strExeFileName,NULL,udtProcessAttributes,udtThreadAttributes,FALSE,0,NULL,NULL,udtStartupInfo,udtProcessInformation)
'新しいプロセスが初期化を完了するまで待機
dwWaitForObjectEvent=WaitForInputIdle(udtProcessInformation.hProcess,INFINITE)
'待機結果を表示
Select Case dwWaitForObjectEvent
Case 0
MsgBox NULL,"プロセスを初期化しました。"
Case WAIT_TIMEOUT
MsgBox NULL,"待機はタイムアウトしました。"
Case -1
MsgBox NULL,"待機は失敗しました。"
End Select
With udtProcessInformation
CloseHandle(.hProcess)
CloseHandle(.hThread)
End With
hNew = GetForegroundWindow()
MessageBox(hNew, NULL, NULL, MB_OKCANCEL)
これを実行したとき、プロセスの初期化中に他のアプリケーションの操作をしないと、ちゃんとメッセージボックスが初期化したプロセスを親として持つのですが、プロセスの初期化中に他のアプリケーションを操作してしまうと、プロセスの初期化が完了しても、メッセージボックスは操作していたアプリケーションを親として持ってしまいます。
100%安全に初期化したプロセスのウィンドウハンドルを取得することはできないでしょうか?
Toshiさん、hiraさん すばやい返答ありがとうございます。
お二人方のお答えより、次のような形のプログラムを考えました。
[code]
Dim hNew As DWord
Dim strExeFileName As String
Dim udtProcessAttributes As SECURITY_ATTRIBUTES
Dim udtThreadAttributes As SECURITY_ATTRIBUTES
Dim udtStartupInfo As STARTUPINFO
Dim udtProcessInformation As PROCESS_INFORMATION
Dim dwWaitForObjectEvent As DWord
'実行可能ファイル名を指定[起動にある程度時間がかかるソフトで試してみて下さい]
strExeFileName="C:\Program Files\Microsoft Office\Office10\Winword.exe"
'セキュリティ構造体を初期化
udtProcessAttributes.nLength=SizeOf(SECURITY_ATTRIBUTES)
udtThreadAttributes.nLength=SizeOf(SECURITY_ATTRIBUTES)
'新しいプロセスのメインウィンドウの表示状態を指定
udtStartupInfo.cb=SizeOf(STARTUPINFO)
'新しいプロセスを作成
CreateProcess(strExeFileName,NULL,udtProcessAttributes,udtThreadAttributes,FALSE,0,NULL,NULL,udtStartupInfo,udtProcessInformation)
'新しいプロセスが初期化を完了するまで待機
dwWaitForObjectEvent=WaitForInputIdle(udtProcessInformation.hProcess,INFINITE)
'待機結果を表示
Select Case dwWaitForObjectEvent
Case 0
MsgBox NULL,"プロセスを初期化しました。"
Case WAIT_TIMEOUT
MsgBox NULL,"待機はタイムアウトしました。"
Case -1
MsgBox NULL,"待機は失敗しました。"
End Select
With udtProcessInformation
CloseHandle(.hProcess)
CloseHandle(.hThread)
End With
hNew = GetForegroundWindow()
MessageBox(hNew, NULL, NULL, MB_OKCANCEL)
[/code]
これを実行したとき、プロセスの初期化中に他のアプリケーションの操作をしないと、ちゃんとメッセージボックスが初期化したプロセスを親として持つのですが、プロセスの初期化中に他のアプリケーションを操作してしまうと、プロセスの初期化が完了しても、メッセージボックスは操作していたアプリケーションを親として持ってしまいます。
100%安全に初期化したプロセスのウィンドウハンドルを取得することはできないでしょうか?