是否可以使用窗口句柄或进程句柄来设置窗口的高度?
我到目前为止,假设有问题的应用程序是记事本。
Process[] processes = Process.GetProcessesByName("notepad"); foreach (Process p in processes) { if (p.MainWindowTitle == title) { handle = p.MainWindowHandle; while ((handle = p.MainWindowHandle) == IntPtr.Zero) { Thread.Sleep(1000); p.Refresh(); } break; } }
我可以使用handle
或p
来设置窗口的高度吗?
这是我将如何做到这一点:
using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; } [DllImport("user32.dll", SetLastError = true)] static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect); [DllImport("user32.dll", SetLastError = true)] static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int Width, int Height, bool Repaint); static void Main(string[] args) { Process[] processes = Process.GetProcessesByName("notepad"); foreach (Process p in processes) { IntPtr handle = p.MainWindowHandle; RECT Rect = new RECT(); if (GetWindowRect(handle, ref Rect)) MoveWindow(handle, Rect.left, Rect.right, Rect.right-Rect.left, Rect.bottom-Rect.top + 50, true); } } } }
虽然你可以用SetWindowPos
,而SetWindowPos
是更新更强大的API,但MoveWindow
只是更容易调用。
您应该能够使用Win32 SetWindowPos函数(用于位置和大小)。 这里有一个如何在C#中完成的链接 。
这是一个快速示例。 这将移动记事本到(10,10)在屏幕上,并调整到(450,450):
class Program { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags); static void Main(string[] args) { Console.WriteLine("Start notepad and hit any key..."); Console.ReadKey(true); Process[] processes = Process.GetProcessesByName("notepad"); foreach (Process p in processes) { var handle = p.MainWindowHandle; SetWindowPos(handle, new IntPtr(SpecialWindowHandles.HWND_TOP), 10,10,450,450,SetWindowPosFlags.SWP_SHOWWINDOW); break; } } } public enum SpecialWindowHandles { HWND_TOP = 0, HWND_BOTTOM = 1, HWND_TOPMOST = -1, HWND_NOTOPMOST = -2 } [Flags] public enum SetWindowPosFlags : uint { SWP_ASYNCWINDOWPOS = 0x4000, SWP_DEFERERASE = 0x2000, SWP_DRAWFRAME = 0x0020, SWP_FRAMECHANGED = 0x0020, SWP_HIDEWINDOW = 0x0080, SWP_NOACTIVATE = 0x0010, SWP_NOCOPYBITS = 0x0100, SWP_NOMOVE = 0x0002, SWP_NOOWNERZORDER = 0x0200, SWP_NOREDRAW = 0x0008, SWP_NOREPOSITION = 0x0200, SWP_NOSENDCHANGING = 0x0400, SWP_NOSIZE = 0x0001, SWP_NOZORDER = 0x0004, SWP_SHOWWINDOW = 0x0040, }