実行可能ファイルをVBで作成したEXEからCreateProcess、WaitForSingleObjectを使用して起動させました。
すると、その実行可能ファイル以外の描画が真っ白になってしまいました。
Shellで起動した時のように背景の描画が真っ白にならないようにするにはどうしたらいいでしょうか??
原因はWaitForSingleObjectのようなのですが、、、。
コードがないので予測ですが
WaitForSingleObjectの第二引数が大きすぎませんか?
WaitForSingleObject一回で待とうとしていませんか?
もしそうなら
while文で回してWaitForSingleObjectの戻り値で
while文を抜けるようにするといいです
第二引数はINFINITEです・・・。
これを物凄く小さくしてWhile文で回すという事でしょうか??
うーん。。。わかんないっす。
こんな感じでやってみては?
Dim IDProcess As Long
Dim hProcess As Long
Dim ExitCode As Long
Dim ret As Long
IDProcess = Shell("...", ?)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, IDProcess)
Do
ret = GetExitCodeProcess(hProcess, ExitCode)
DoEvents
Loop While (ExitCode = STILL_ACTIVE)
ret = CloseHandle(hProcess)
いちおうLoreley さんのやり方で動いてるようです。
ただ、この間呼び出し元のEXEは操作不可にしたいのですが、
WaitForSingleObjectのループに入る前にEnableをFalseにするってので
大丈夫ですかね??
戻ってきたらTrueにするのですが。
XPだと動かないのですが。。。どうしたらいいですか?
私の環境はXPですけど、
WaitForSingleObjectをINFINITEで呼ぶ方法、
値を小さくしてループする方法、
どちらも正常に動きますけど。
どの部分でどのようなエラーがでて、
動かないのでしょうか。
> CreateProcess、WaitForSingleObjectを使用して起動させました。
> すると、その実行可能ファイル以外の描画が真っ白になってしまいました。
替わりに、WshShellオブジェクトのRunメソッドが使えないでしょうか。
Private Sub Command1_Click()
Dim S As String
Dim R As Long
Me.Enabled = False
S = "C:\Project1.exe"
MsgBox S & "を起動します。", vbInformation Or vbSystemModal
R = CreateObject("WScript.Shell").Run(S, vbNormalFocus, True)
MsgBox "終了しました。戻り値=" & CStr(R), vbInformation Or vbSystemModal
DoEvents
Me.Enabled = True
End Sub
うーむ。
ループにDoEventsがないんですかね。
それとも呼び出したアプリケーションに問題があるとか。
描画が真っ白ってことは
再描画されていないということですので、
ループの部分を見たほうがいいかもしれません。
デスクトップの壁紙なども真っ白になるんですか?
ちなみにINFINITEではなくwhileの方が言ったのもそのためです。
INFINITEでは、起動させられたアプリが終了するまで、
起動させたアプリは応答しないと思います。
すると、再描画すら行わないので、真っ白になるというわけです。
とろさんのサンプルのように、
ループの中にDoEventsを渡しておけば
そこで、windowsがいつも自動でやってくれる処理を解決してくれますので。
遅くなりましたが解決しました!
本当にありがとうございます。
XPも正常に動きます。
DoEventsが抜けてました。。。本当にすみません。ありがとうございました。
ツイート | ![]() |