2008-09-26 68 views
7

.NET應用程序可能抓住當前打開的所有窗口句柄,並移動/調整這些窗口的大小?從.NET應用程序中抓取並移動應用程序窗口?

我很確定它可能使用P/Invoke,但我想知道是否有一些託管代碼包裝這個功能。

+0

使用的Mechanical Turk - 只是彈出一個消息框,要求用戶爲你做。一定要提供詳細的說明。 :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); 
      } 
     }   
    } 
} 

然後你就可以使用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消息,允許 重新繪製客戶區。作爲一個 一邊,可以使用帶rcDesktop是類型RECT的 可變,通過 引用傳遞類似於 GetClientRect(GetDesktopWindow(), & rcDesktop)的呼叫中獲得的屏幕座標 。

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

+0

+1不錯的答案。 – 2011-04-03 03:48:05