2008-09-26 11 views
7

Czy aplikacja .NET może pobrać wszystkie aktualnie otwarte klamki okienne i przenieść/zmienić rozmiar tych okien?Chwyć i przenieś okna aplikacji z aplikacji .NET?

Byłbym całkiem pewny, że jest to możliwe za pomocą P/Invoke, ale zastanawiałem się, czy istnieje kilka zarządzanych wrapperów kodu dla tej funkcjonalności.

+0

użycie mechanicznego Turka - po prostu pojawiają się okno komunikatu i poprosić użytkownika, aby to zrobić dla ciebie. Pamiętaj, aby podać szczegółowe instrukcje. : P Przykro mi, po prostu bawię się tutaj ... –

Odpowiedz

14

Tak, jest to możliwe przy użyciu interfejsu API systemu Windows.

Ten wpis nie zawiera informacji o tym, jak uzyskać wszystkie okna uchwyty z aktywnych procesów: 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); 
      } 
     }   
    } 
} 

a następnie można przenieść okno przy użyciu 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); 

Oto parametry funkcji MoveWindow:

Aby się przenieść Okno używamy funkcję MoveWindow, która przyjmuje uchwyt okna, współrzędne na górnym rogu, a także żądaną szerokość i wysokość okna , opartych na ekranie współrzędnych. Funkcja MoveWindow jest zdefiniowany jako:

MoveWindow (HWND hWnd int nX, Int NY, Int nWidth int nHeight, bool bRepaint);

bRepaint flag określa, czy obszar roboczy powinny być unieważnione, powodując wiadomość WM_PAINT do wysłania, pozwalając obszaru roboczego zostać przemalowane. Jako bok, ekranu koordynuje można otrzymać stosując połączenie podobny do GetClientRect (GetDesktopWindow(), & rcDesktop) z rcDesktop będąc zmienna typu rect zapadają odniesienia.

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

+0

+1 ładna odpowiedź. –

Powiązane problemy