ウィンドウの状態(最大化、最小化、非表示)を指定してアプリケーションを起動する方法は「ウィンドウの状態を最大化、最小化、非表示にして、外部アプリケーションを起動する」で説明しました。それでは、外部アプリケーションを起動して、ウィンドウの位置と大きさを変えるにはどのようにすればよいのでしょうか?
アプリケーションの起動はProcess.Startメソッドでできますが、ウィンドウのサイズと表示位置を変更するための機能は.NET Frameworkにはありません。
そこでウィンドウのサイズと表示位置を変更するために、Win32 APIのMoveWindow関数を使用することにします。MoveWindow関数では対象とするウィンドウのハンドルを指定する必要がありますが、これにはProcessクラスのMainWindowHandleプロパティの値を使うことにします。
補足:MainWindowHandleプロパティの値が適当でない時は、「画面上のすべてのウィンドウとそのタイトルを列挙する」を参考にして目的のウィンドウを探してください。
アプリケーション起動直後はメインウィンドウハンドルが作成されていない恐れがありますので、WaitForInputIdleメソッドにより待機した後にMainWindowHandleプロパティの値を取得します。WaitForInputIdleで待機しているため、実際にウィンドウの位置とサイズが変更されるまで、起動してからちょっと間が空きます。
Button1をクリックするとメモ帳を起動し、そのウィンドウの位置を(0, 10)に、サイズを300x200に変更する例を以下に紹介します。
'MoveWindow関数の宣言 Private Declare Function MoveWindow Lib "user32" Alias "MoveWindow" _ (ByVal hwnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _ ByVal nWidth As Integer, ByVal nHeight As Integer, _ ByVal bRepaint As Integer) As Integer Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click 'メモ帳を起動 Dim p As System.Diagnostics.Process = _ System.Diagnostics.Process.Start("notepad.exe") 'アイドル状態になるまで待機 p.WaitForInputIdle() 'ウィンドウの位置を(0, 10)に、サイズを300x200に変更する MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1) End Sub
//MoveWindow関数の宣言 [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth,int nHeight, int bRepaint); private void button1_Click(object sender, System.EventArgs e) { //メモ帳を起動 System.Diagnostics.Process p = System.Diagnostics.Process.Start("notepad.exe"); //アイドル状態になるまで待機 p.WaitForInputIdle(); //ウィンドウの位置を(0, 10)に、サイズを300x200に変更する MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1); }
(この記事は「.NETプログラミング研究 第15号」で紹介したものです。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。