秘密基地、どこに作った?

Form1上のボタンを押すと、ある別のアプリケーションを実行し、そのウィンドウをForm1の横に大きさを保持したまま配置したいです。
現在は下記のコードを使っていますが、この場合
・幅・高さが変わる
・一瞬別の位置にウィンドウが見える
といった問題があります。

・位置のみを指定する、もしくは外部のウィンドウのサイズを取得する方法
・表示する前に位置を変える方法
あるいは
・位置のみを指定して実行する方法
について教えていただきたいです。

Dim p As Process = Process.Start(application)
p.WaitForInputIdle()
MoveWindow(p.MainWindowHandle, Me.Right, Me.Top, 100, 100, 1)

A 回答 (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
    • good
    • 0

>・一瞬別の位置にウィンドウが見える


ですが、Process.Startで非表示で起動が出来るようですので、
とりあえず非表示にして、SetWindowPos後、ShowWindowするとかでどうでしょうかね?

細かい条件を指定してプログラムを起動する
http://jeanne.wankuma.com/tips/vb.net/process/st …

ShowWindow Declare宣言等
http://www.winapi-database.com/Window/Change/Sho …


# HWNDはIntPtrのほうがよい気もするが・・・
    • good
    • 0
この回答へのお礼

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」を変更する方法が必要なようです。

お礼日時:2011/01/07 19:54

とりあえず、


>・位置のみを指定して実行する方法
はMoveWindowの引数の指定がまずいというか、高さ・幅をともに100にするコードになっています。

MoveWindowはやめてSetWindowPosを使って開始位置のみ指定してみてはどうでしょうか。

Declare宣言と各定数は
http://www.winapi-database.com/Window/Change/Set …
を参考に。

SetWindowPos(p.MainwindowHandle, 0, Me.Right, Me.Top, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVE)

# 実行していないので自身はないです (;^^)
    • good
    • 2
この回答へのお礼

>高さ・幅をともに100にするコードに
このコードは質問用に改変したものです。実際は0になっています。
この部分がどんな数値であっても無視したいので、まずくはないです。

SetWindowPosのSWP_NOSIZEフラグを使うことで位置のみ変更出来ました。
ありがとうございます!

SetWindowPos(p.MainWindowHandle, 0, Me.Right, Me.Top, 0, 0, SWP_NOSIZE)

お礼日時:2011/01/07 19:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報