• 締切済み

VBで外部プログラムを位置のみ指定して実行したい

Form1上のボタンを押すと、ある別のアプリケーションを実行し、そのウィンドウをForm1の横に大きさを保持したまま配置したいです。 現在は下記のコードを使っていますが、この場合 ・幅・高さが変わる ・一瞬別の位置にウィンドウが見える といった問題があります。 ・位置のみを指定する、もしくは外部のウィンドウのサイズを取得する方法 ・表示する前に位置を変える方法 あるいは ・位置のみを指定して実行する方法 について教えていただきたいです。 Dim p As Process = Process.Start(application) p.WaitForInputIdle() MoveWindow(p.MainWindowHandle, Me.Right, Me.Top, 100, 100, 1)

みんなの回答

回答No.3

SetWindowPosにSWP_SHOWWINDOWというのがあったのでいちいちShowWindowを使うまでも なかったですね。 ShowWindowでも出来ますが、おそらく起動が完了していない状態で ウィンドウを操作しようとしているためうまくいかないのでしょう。 p.WaitForInputIdle() をいれるとうまくいくでしょう。 電卓で試してみたコードです。(VS2005) Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal hWndInertAfter As IntPtr, _ ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Integer Private Const SWP_NOACTIVATE As Integer = &H10 Private Const SWP_NOSIZE As Integer = &H1 Private Const SWP_NOZODER As Integer = &H4 Private Const SWP_SHOWWINDOW As Integer = &H40 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim psi As New ProcessStartInfo psi.FileName = "calc.exe" psi.WindowStyle = ProcessWindowStyle.Hidden Dim p As Process = Process.Start(psi) p.WaitForInputIdle() SetWindowPos(p.MainWindowHandle, IntPtr.Zero, Me.Right, Me.Top, 0, 0, _ SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOZODER Or SWP_SHOWWINDOW) End Sub

回答No.2

>・一瞬別の位置にウィンドウが見える ですが、Process.Startで非表示で起動が出来るようですので、 とりあえず非表示にして、SetWindowPos後、ShowWindowするとかでどうでしょうかね? 細かい条件を指定してプログラムを起動する http://jeanne.wankuma.com/tips/vb.net/process/startinfo.html ShowWindow Declare宣言等 http://www.winapi-database.com/Window/Change/ShowWindow.html # HWNDはIntPtrのほうがよい気もするが・・・

riwity
質問者

お礼

Dim psi As New ProcessStartInfo psi.FileName = app psi.WindowStyle = ProcessWindowStyle.Hidden Dim p As Process = Process.Start(psi) SetWindowPos(p.MainWindowHandle, 0, Me.Right, Me.Top, 0, 0, SWP_NOSIZE) ShowWindow(p.MainWindowHandle, SW_SHOW) とやってみましたが、消えたままです。 WindowStyleとShowWindowは互換しないのでしょうか。 また、表示されているウィンドウをShowWindowで非表示にし、位置変更後ShowWindowで再表示してみましたが、移動が適応されていません。 Process.Startの前にShowWindowは使えないので、「表示されているウィンドウのWindowStyle」を変更する方法が必要なようです。

回答No.1

とりあえず、 >・位置のみを指定して実行する方法 はMoveWindowの引数の指定がまずいというか、高さ・幅をともに100にするコードになっています。 MoveWindowはやめてSetWindowPosを使って開始位置のみ指定してみてはどうでしょうか。 Declare宣言と各定数は http://www.winapi-database.com/Window/Change/SetWindowPos.html を参考に。 SetWindowPos(p.MainwindowHandle, 0, Me.Right, Me.Top, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVE) # 実行していないので自身はないです (;^^)

riwity
質問者

お礼

>高さ・幅をともに100にするコードに このコードは質問用に改変したものです。実際は0になっています。 この部分がどんな数値であっても無視したいので、まずくはないです。 SetWindowPosのSWP_NOSIZEフラグを使うことで位置のみ変更出来ました。 ありがとうございます! SetWindowPos(p.MainWindowHandle, 0, Me.Right, Me.Top, 0, 0, SWP_NOSIZE)

関連するQ&A