.NET应用程序是否可以获取当前打开的所有窗口句柄,并移动/调整这些窗口的大小?
我很确定它可以使用P / Invoke,但我想知道是否有一些托管代码包装器用于此功能。
答案 0 :(得分: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消息,允许 客户区域要重新绘制。作为一个 除此之外,屏幕坐标可以是 使用类似的电话获得 GetClientRect(GetDesktopWindow() & rcDesktop),rcDesktop是一个 传递的RECT类型的变量 参考
(http://windows-programming.suite101.com/article.cfm/client_area_size_with_movewindow)