外部アプリケーションを起動して、ウィンドウの位置とサイズを変更する例えば、メモ帳を起動した後、メモ帳のウィンドウの位置と大きさを変えるにはどのようにすればよいのでしょうか? メモ帳の起動はProcess.Startメソッドで行えますが、起動後のウィンドウのサイズと表示位置を変更するための機能は.NET Frameworkにはありません。 そこでウィンドウのサイズと表示位置を変更するために、Win32 APIのMoveWindow関数を使用することにします。MoveWindow関数では対象とするウィンドウのハンドルを指定する必要がありますが、これにはProcessクラスのMainWindowHandleプロパティの値を使うことにします。(MainWindowHandleプロパティの値が適当でない時は、FindWindow関数等により、目的のウィンドウのハンドルを取得する必要があります。) メモ帳起動直後はメインウィンドウハンドルが作成されていない恐れがありますので、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号」で紹介したものです。) |
|
Copyright(C) DOBON!. All rights reserved.
|