2008-09-26 3 views
7

Возможно ли, чтобы приложение .NET захватило все открытые ручки окна и перемещало/изменяло размер этих окон?Захват и перемещение окон приложений из приложения .NET?

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

+0

Использование механического турка - просто всплывающее окно и попросить пользователя сделать это для вас. Обязательно дайте подробные инструкции. : P Извините, просто развлекаюсь здесь ... – 2008-09-26 18:10:57

ответ

14

Да, это возможно с использованием 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); 
      } 
     }   
    } 
} 

И тогда вы можете переместить окно с помощью API Windows: 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 пХ, 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)

+0

+1 хороший ответ. – 2011-04-03 03:48:05