2008-09-26 67 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