Как получить и установить положение окна другого приложения в С#
Как я могу получить и установить позицию другого приложения с помощью С#?
Например, я хотел бы получить верхние левые координаты Notepad (скажем, что он плавает где-то на 100 400), и положение этого окна на 0,0.
Какой самый простой способ достичь этого?
Ответы
Ответ 1
Я действительно написал DLL с открытым исходным кодом только для такого рода вещей.
Загрузить здесь
Это позволит вам находить, перечислять, изменять размер, перемещать или делать то, что вы хотите для других окон приложений и их элементов управления.
Существует также добавленная функциональность для чтения и записи значений/текста окон/элементов управления и нажатия на них событий. В основном это было написано для создания скриншотов экрана - но все исходные коды включены, поэтому все, что вы хотите сделать с окнами, включено там.
Ответ 2
Попробуйте использовать FindWindow (подпись), чтобы получить HWND целевого окна. Затем вы можете использовать SetWindowPos (подпись), чтобы переместить его.
Ответ 3
Для достижения этой цели вам потребуется использовать som P/Invoke interop. Основная идея заключалась бы в том, чтобы сначала найти окно (например, используя EnumWindows function), а затем получить позицию окна с GetWindowRect.
Ответ 4
Полезный ответ Дэвида содержит важнейшие указатели и полезные ссылки.
Чтобы использовать их в автономном примере, который реализует примерный сценарий в вопросе, использование API Windows через P/Invoke (System.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);
}
}
}