Как получить и установить положение окна другого приложения в C#

Как я могу получить и установить положение другого приложения, используя C#?

Например, я хотел бы получить координаты левого верхнего блока Блокнота (скажем, он где-то с плавающей точкой в ​​100 400) и положение этого окна в 0,0.

Какой самый простой способ добиться этого?

4 ответа

Решение

Я на самом деле написал DLL с открытым исходным кодом только для такого рода вещей. Скачать здесь

Это позволит вам находить, перечислять, изменять размер, перемещать или делать то, что вы хотите, с другими окнами приложений и их элементами управления. Также добавлена ​​функциональность для чтения и записи значений / текста окон / элементов управления и создания событий щелчков на них. Он был в основном написан для очистки экрана, но весь исходный код включен, поэтому все, что вы хотите сделать с окнами, включено в него.

Полезный ответ Дэвида содержит важные указатели и полезные ссылки.

Чтобы использовать их в отдельном примере, который реализует пример сценария в вопросе, используя Windows API через P/Invoke (System.Windows.Forms не участвует):

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);
        }
    }

}

Попробуйте использовать FindWindow ( подпись), чтобы получить HWND целевого окна. Затем вы можете использовать SetWindowPos ( подпись), чтобы переместить его.

Вам нужно будет использовать взаимодействие Som P/Invoke для достижения этой цели. Основная идея заключается в том, чтобы сначала найти окно (например, с помощью функции EnumWindows), а затем получить положение окна с помощью GetWindowRect.

Другие вопросы по тегам