web-dev-qa-db-ja.com

C#で別のアプリケーションのウィンドウ位置を取得および設定する方法

C#を使用して別のアプリケーションの位置を取得および設定するにはどうすればよいですか?

たとえば、メモ帳の左上の座標(100,400のどこかに浮いているとしましょう)を取得し、このウィンドウを0,0の位置に配置したいとします。

これを達成する最も簡単な方法は何ですか?

23
James

私は実際にオープンソースを書いたDLLこの種のことのためだけに。 ここからダウンロード

これにより、他のアプリケーションウィンドウとそのコントロールに対して、検索、列挙、サイズ変更、再配置、または必要な操作を行うことができます。ウィンドウ/コントロールの値/テキストを読み書きし、それらに対してクリックイベントを実行する機能も追加されています。基本的にはスクリーンスクレイピングを行うように書かれていますが、すべてのソースコードが含まれているため、ウィンドウでやりたいことはすべてそこに含まれています。

34
DataDink

Davidの役立つ回答 重要なポインタと役立つリンクを提供します。

質問のサンプルシナリオを実装する自己完結型の例で使用するために、P/Invokeを介してWindowsAPIを使用します(System.Windows.Forms isnot関与):

using System;
using System.Runtime.InteropServices; // For the P/Invoke signatures.

public static class PositionWindowDemo
{

    // P/Invoke declarations.

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    const uint SWP_NOSIZE = 0x0001;
    const uint SWP_NOZORDER = 0x0004;

    public static void Main()
    {
        // Find (the first-in-Z-order) Notepad window.
        IntPtr hWnd = FindWindow("Notepad", null);

        // If found, position it.
        if (hWnd != IntPtr.Zero)
        {
            // Move the window to (0,0) without changing its size or position
            // in the Z order.
            SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
        }
    }

}
9
mklement0

FindWindowsignature )を使用して、ターゲットウィンドウのHWNDを取得してみてください。次に、 SetWindowPossignature )を使用して移動できます。

7
David

これを実現するには、som P/Invoke相互運用機能を使用する必要があります。基本的な考え方は、最初にウィンドウを見つけて(たとえば、 EnumWindows関数 を使用して)、次に GetWindowRect でウィンドウの位置を取得することです。

4
driis