###前提・実現したいこと
フォーム上のボタンをクリックすると、『前処理、「リモートデスクトップ接続」の接続、接続終了後に、後処理』を実行する。前処理にて、既に他のPCから「リモートデスクトップ接続」がされていることが判断された場合は、接続回避をしたい。
デスクトップアプリケーション(test.exe)のフォームに「ボタンコントロール」を配置し、「ボタンコントロール」のクリックで、
(0)接続してもよいか確認する前処理を実行、
(1)外部アプリケーションとして、「リモートデスクトップ接続」(「mstsc.exe /f /V:SVname」)を実行、
(2)「リモートデスクトップ接続」のダイアログが表示される。
(3)ログインに必要な所定情報を入力し、リモートデスクトップで作業を行う。
(4)利用者が、「リモートデスクトップ接続」の接続を解く(接続終了)、
(5)所定のプログラム( MsgBox("ok")、後処理(他のPCに接続してもよい旨を知らせる))を実行
を行いたい。
なお、リモートデスクトップの取り合いを無くす方法として、
https://oshiete.goo.ne.jp/qa/1617523.html
がありますが、この方法は、利用者がバッチファイルを直接実行するもので、今回、こちらの諸事情で採用は難しい状況です。
本件は、フォーム上のボタンをクリックしたときに、外部アプリケーションとして、mstsc.exeを実行する、を前提で解決を模索しています。
###発生している問題・エラーメッセージ
WaitForExit()が機能しない。
つまり、(1)の直後(5)が実行される。
(1)の実行後、数秒後に、(2)が表示される。この状態で、(3)を実行し、(4)を行っても、(5)は実行済されない(すでに実行済)。
###該当のソースコード
https://dobon.net/vb/dotnet/process/openfile.html
を参考に以下のコードを作成
Private Sub btnConnect_Click(sender As Object, e As EventArgs) ’前処理---接続してよいか確認する----(0) Dim p As New Process p.StartInfo.FileName = "mstsc.exe" p.StartInfo.Arguments = "/f /V:file_server" p.Start() p.WaitForExit() '-------(1),(2) p.Close() MsgBox("ok") '後処理(ここでは、分かり易いようにMsgBoxとしています)------(5) End Sub
###試したこと
(1)command.com で実行
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
p.StartInfo.Arguments = " /C start /wait mstsc.exe /f /V:file_server"
(2)バッチファイル(cc.bat)を実行
Dim sw As New IO.StreamWriter("cc.bat", False, System.Text.Encoding.GetEncoding("shift_jis"))
Using sw
sw.Write(System.Environment.GetEnvironmentVariable("ComSpec") & " /C start /wait mstsc.exe /f /V:file_server")
sw.WriteLine()
sw.Close()
End Using
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
p.StartInfo.Arguments = " /C start /wait cc.bat"
いずれも、mstsc.exeの終了まで、待機しない。
###補足情報(言語/FW/ツール等のバージョンなど)
windows7(64ビットOS)、Microsoft Visual Basic 2015でデスクトップアプリ(test.exe とします)を作成しています。
「mstsc.exe /f /V:SVname」の起動が遅すぎて、mstsc.exeの起動中にもかかわらず、WaitForExitが起動を検知できずに、終了と判断しているような挙動をします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/07 15:38