Захватить и переместить окна приложения из приложения .NET? - PullRequest
7 голосов
/ 26 сентября 2008

Возможно ли для приложения .NET захватить все открытые в данный момент дескрипторы окон и переместить / изменить их размер?

Я вполне уверен, что это возможно с помощью P / Invoke, но мне было интересно, есть ли какие-нибудь обертки управляемого кода для этой функции.

1 Ответ

14 голосов
/ 26 сентября 2008

Да, это возможно с помощью Windows API.

Этот пост содержит информацию о том, как получить все дескрипторы окон из активных процессов: http://www.c -sharpcorner.com / Forums / ShowMessages.aspx? ThreadID = 35545

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
       Process[] procs = Process.GetProcesses();
       IntPtr hWnd;
       foreach(Process proc in procs)
       {
          if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero)
          {
             Console.WriteLine("{0} : {1}", proc.ProcessName, hWnd);
          }
       }         
    }
 }

И затем вы можете переместить окно с помощью Windows API: http://www.devasp.net/net/articles/display/689.html

[DllImport("User32.dll", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int cx, int cy, bool repaint);

...

MoveWindow((IntPtr)handle, (trackBar1.Value*80), 20 , (trackBar1.Value*80)-800, 120, true);

Вот параметры для функции MoveWindow:

Для перемещения окна мы используем функция MoveWindow, которая принимает оконная ручка, координаты для верхнего угла, а также желаемая ширина и высота окно, основанное на экране координаты. Функция MoveWindow определяется как:

MoveWindow (HWND hWnd, int nX, int ny, int nWidth, int nHeight, BOOL bRepaint);

Флаг bRepaint определяет, будет ли зона клиента должен быть признан недействительным, вызывая WM_PAINT сообщение для отправки, позволяющее клиентская зона должна быть перекрашена. Как кроме того, координаты экрана могут быть полученный с помощью вызова, аналогичного GetClientRect (GetDesktopWindow (), & rcDesktop), причем rcDesktop является переменная типа RECT, переданная ссылка.

(http://windows -programming.suite101.com / article.cfm / client_area_size_with_movewindow )

...