.NET应用程序是否可以获取当前打开的所有窗口句柄,并移动/调整这些窗口的大小?
我很确定它可能使用P/Invoke,但我想知道是否有一些托管代码包装器用于此功能.
是的,可以使用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)