using System; using System.Drawing; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace Microsoft.Win32 { /// /// User32扩展 /// public static partial class Util { /// /// 开始更新,禁止控件重绘 /// /// 控件句柄 public static void BeginUpdate(IntPtr hWnd) { UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_SETREDRAW, 0, 0); } /// /// 开始更新,允许控件重绘 /// /// 控件句柄 public static void EndUpdate(IntPtr hWnd) { UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_SETREDRAW, 1, 0); } /// /// 开始拖动窗口 /// /// 窗口句柄 public static void BeginDrag(IntPtr hWnd) { UnsafeNativeMethods.ReleaseCapture(); UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_SYSCOMMAND, NativeMethods.SC_MOVE | NativeMethods.HTCAPTION, 0); } /// /// 在指定句柄窗口内按下鼠标,不等待消息处理完成立即返回 /// /// 窗口句柄 /// 相对于窗口的点 public static void PostMouseDown(IntPtr hWnd, Point pt) { IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y); UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_MOUSEMOVE, IntPtr.Zero, lParam); UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_LBUTTONDOWN, IntPtr.Zero, lParam); } /// /// 在指定句柄窗口内弹起鼠标,不等待消息处理完成立即返回 /// /// 窗口句柄 /// 相对于窗口的点 public static void PostMouseUp(IntPtr hWnd, Point pt) { IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y); UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_LBUTTONUP, IntPtr.Zero, lParam); } /// /// 在指定句柄窗口内单击鼠标,不等待消息处理完成立即返回 /// /// 窗口句柄 /// 相对于窗口的点 public static void PostMouseClick(IntPtr hWnd, Point pt) { IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y); UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_MOUSEMOVE, IntPtr.Zero, lParam); UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_LBUTTONDOWN, IntPtr.Zero, lParam); UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_LBUTTONUP, IntPtr.Zero, lParam); } /// /// 在指定句柄窗口内按下鼠标,等待消息处理完成后再返回 /// /// 窗口句柄 /// 相对于窗口的点 public static void SendMouseDown(IntPtr hWnd, Point pt) { IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y); UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_MOUSEMOVE, IntPtr.Zero, lParam); UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_LBUTTONDOWN, IntPtr.Zero, lParam); } /// /// 在指定句柄窗口内弹起鼠标,等待消息处理完成后再返回 /// /// 窗口句柄 /// 相对于窗口的点 public static void SendMouseUp(IntPtr hWnd, Point pt) { IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y); UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_LBUTTONUP, IntPtr.Zero, lParam); } /// /// 在指定句柄窗口内单击鼠标,等待消息处理完成后再返回 /// /// 窗口句柄 /// 相对于窗口的点 public static void SendMouseClick(IntPtr hWnd, Point pt) { IntPtr lParam = Util.MAKELPARAM(pt.X, pt.Y); UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_MOUSEMOVE, IntPtr.Zero, lParam); UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_LBUTTONDOWN, IntPtr.Zero, lParam); UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_LBUTTONUP, IntPtr.Zero, lParam); } /// /// 按下键盘键 /// /// 虚拟键码 public static void SendKeyDown(short vKey) { NativeMethods.INPUT[] input = new NativeMethods.INPUT[1]; input[0].type = NativeMethods.INPUT_KEYBOARD; input[0].ki.wVk = vKey; input[0].ki.time = UnsafeNativeMethods.GetTickCount(); UnsafeNativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0])); } /// /// 弹起键盘键 /// /// 虚拟键码 public static void SendKeyUp(short vKey) { NativeMethods.INPUT[] input = new NativeMethods.INPUT[1]; input[0].type = NativeMethods.INPUT_KEYBOARD; input[0].ki.wVk = vKey; input[0].ki.dwFlags = NativeMethods.KEYEVENTF_KEYUP; input[0].ki.time = UnsafeNativeMethods.GetTickCount(); UnsafeNativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0])); } /// /// 按一下并弹起键盘键 /// /// 虚拟键码 public static void SendKeyClick(short vKey) { SendKeyDown(vKey); SendKeyUp(vKey); } /// /// 显示或隐藏光标. /// /// 显示为true,否则为false. public static void ShowCursor(bool visible) { if (visible) { while (UnsafeNativeMethods.ShowCursor(true) < 0) { } } else { while (UnsafeNativeMethods.ShowCursor(false) >= 0) { } } } /// /// 获取光标是否显示.显示为true,否则为false. /// public static bool GetCursorVisible() { UnsafeNativeMethods.ShowCursor(false); return UnsafeNativeMethods.ShowCursor(true) >= 0; } /// /// 获取指定窗口的所有者窗口。 /// /// 指定窗口。 /// 所有者窗口。 public static IntPtr GetOwner(IntPtr hWnd) { return UnsafeNativeMethods.GetWindow(hWnd, NativeMethods.GW_OWNER); } /// /// 为指定窗口设置新的的所有者窗口。 /// /// 指定窗口。 /// 新的所有者窗口。 public static void SetOwner(IntPtr hWnd, IntPtr hWndNewOwner) { UnsafeNativeMethods.SetWindowLong(hWnd, NativeMethods.GWL_HWNDPARENT, (int)hWndNewOwner); } /// /// 获取指定窗口的父窗口。 /// /// 指定窗口。 /// 父窗口。 public static IntPtr GetParent(IntPtr hWnd) { return UnsafeNativeMethods.GetAncestor(hWnd, NativeMethods.GA_PARENT); } /// /// 为指定窗口设置新的父窗口。 /// /// 指定窗口。 /// 新的父窗口。 public static void SetParent(IntPtr hWnd, IntPtr hWndNewParent) { UnsafeNativeMethods.SetParent(hWnd, hWndNewParent); } /// /// 获取指定窗口包含的滚动条。 /// /// 窗口句柄。 /// 返回值见 System.Windows.Forms.ScrollBars 定义 public static int GetScrollBars(IntPtr hWnd) { int wndStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_STYLE); bool hsVisible = (wndStyle & NativeMethods.WS_HSCROLL) != 0; bool vsVisible = (wndStyle & NativeMethods.WS_VSCROLL) != 0; if (hsVisible) return vsVisible ? 3 : 1; else return vsVisible ? 2 : 0; } /// /// 获取指定窗口是否有左滚动条样式。 /// /// 窗口句柄。 /// 窗口有左滚动条样式返回 true,否则返回 false。 public static bool GetLeftScrollBar(IntPtr hWnd) { int wndExStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_EXSTYLE); return (wndExStyle & NativeMethods.WS_EX_LEFTSCROLLBAR) != 0; } /// /// 获取指定窗口边框宽度。 /// /// 窗口句柄。 /// 窗口边框宽度。 public static int GetBorderWidth(IntPtr hWnd) { int wndExStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_EXSTYLE); if ((wndExStyle & NativeMethods.WS_EX_STATICEDGE) != 0) return 3; else if ((wndExStyle & NativeMethods.WS_EX_WINDOWEDGE) != 0) return 2; else if ((wndExStyle & NativeMethods.WS_EX_CLIENTEDGE) != 0) return 2; else if ((UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_STYLE) & NativeMethods.WS_BORDER) != 0) return 1; else return 0; } /// /// 从 GDI+ Region 创建一个 GDI Region。 /// /// 控件句柄。 /// System.Drawing.Region 对象。 /// GDI Region 句柄。 public static IntPtr GetHRgn(IntPtr hWnd, Region region) { using (Graphics g = Graphics.FromHwndInternal(hWnd)) { return region.GetHrgn(g); } } /// /// 获取窗口的客户区相对于窗口左上角的矩形.(特别注意:如果有非客户区起点一般不为0,0 如果没有非客户区该值同ClientRectangle相等).该函数非常特别尽量不要调用,在非客户区操作时可能使用到,其余问题请咨询编写人员. by Tim 2013.11.23 /// /// 指定窗口句柄 /// 客户区相对于窗口坐标系的坐标和大小 public static NativeMethods.RECT GetClientRect(IntPtr hWnd) { NativeMethods.RECT wndRect = new NativeMethods.RECT();//窗口相对于屏幕的坐标和大小 NativeMethods.RECT clientRect = new NativeMethods.RECT();//以0,0开始的客户区坐标和大小 UnsafeNativeMethods.GetWindowRect(hWnd, ref wndRect);//窗口 UnsafeNativeMethods.GetClientRect(hWnd, ref clientRect);//客户区 UnsafeNativeMethods.MapWindowPoints(hWnd, NativeMethods.HWND_DESKTOP, ref clientRect, 2);//客户区映射到屏幕 //偏移 clientRect.left -= wndRect.left; clientRect.top -= wndRect.top; clientRect.right -= wndRect.left; clientRect.bottom -= wndRect.top; //返回 return clientRect; } /// /// 闪烁指定窗口。 /// /// 指定窗口句柄。 /// 闪烁次数。 /// 返回闪烁前窗口是否已被激活。 public static bool FlashWindow(IntPtr hWnd, int count) { NativeMethods.FLASHWINFO fwi = new NativeMethods.FLASHWINFO(); fwi.cbSize = Marshal.SizeOf(fwi); fwi.hwnd = hWnd; fwi.dwFlags = NativeMethods.FLASHW_TRAY; fwi.uCount = count; fwi.dwTimeout = 0; return UnsafeNativeMethods.FlashWindowEx(ref fwi); } #region 扩展 /// /// 将窗口置顶 /// /// 窗口类名 /// 窗口标题 public static void BringToFront(string lpClassName, string lpWindowName) { IntPtr hWnd = UnsafeNativeMethods.FindWindow(lpClassName, lpWindowName); if (hWnd != IntPtr.Zero) UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_TOP, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE); } /// /// 将窗口置底 /// /// 窗口类名 /// 窗口标题 public static void SendToBack(string lpClassName, string lpWindowName) { IntPtr hWnd = UnsafeNativeMethods.FindWindow(lpClassName, lpWindowName); if (hWnd != IntPtr.Zero) UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE); } /// /// 跨进程,向指定窗口发送WM_COPYDATA消息 /// /// 窗口标题 /// 区分标记 /// 要发送的字符串数据 public static void SendCopyData(string lpWindowName, int flag, string data) { IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName); if (hWnd == IntPtr.Zero) return; byte[] arr = Encoding.UTF8.GetBytes(data); NativeMethods.COPYDATASTRUCT cds = new NativeMethods.COPYDATASTRUCT(); cds.dwData = flag; cds.cbData = arr.Length + 1; cds.lpData = data; UnsafeNativeMethods.SendMessage(hWnd, NativeMethods.WM_COPYDATA, IntPtr.Zero, ref cds); } /// /// 向指定标题的窗口发送WM_CLOSE消息 /// /// 窗口标题 public static void CloseWindow(string lpWindowName) { IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName); if (hWnd == IntPtr.Zero) return; UnsafeNativeMethods.PostMessage(hWnd, NativeMethods.WM_CLOSE, IntPtr.Zero, IntPtr.Zero); } /// /// 设置窗口显示状态 /// /// 窗口标题 /// 显示指令 public static void ShowWindow(string lpWindowName, int nCmdShow) { IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName); if (hWnd == IntPtr.Zero) return; UnsafeNativeMethods.ShowWindow(hWnd, nCmdShow); } /// /// 设置控件TopMost(使窗口成为“TopMost”类型的窗口,这种类型的窗口总是在其它窗口的前面) /// /// 要设置的窗口 public static void SetTopMost(IntPtr hWnd) { try { UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_TOPMOST, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOACTIVATE); } catch { } } /// /// 设置控件NoTopMost(将窗口放在所有“TopMost”类型窗口的后面,其它类型窗口的前面) /// /// 要设置的窗口 public static void SetNoTopMost(IntPtr hWnd) { try { UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_NOTOPMOST, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOACTIVATE); } catch { } } /// /// 设置窗口的拥有窗口,可以跨进程 /// /// /// public static void SetOwner(Control child, string lpParentWindowName) { IntPtr hWndNewParent = UnsafeNativeMethods.FindWindow(null, lpParentWindowName); if (hWndNewParent != IntPtr.Zero) SetOwner(child.Handle, hWndNewParent); } /// /// 设置窗口的拥有窗口,可以跨进程 /// /// /// public static void SetOwner(string lpChildWindowName, Control parent) { IntPtr hWndChild = UnsafeNativeMethods.FindWindow(null, lpChildWindowName); if (hWndChild != IntPtr.Zero) SetOwner(hWndChild, parent.Handle); } /// /// 跨进程,向指定窗口发送指定消息,立即返回 /// /// 窗口标题 /// 消息 /// lParam public static void PostMessage(string lpWindowName, int msg, int lParam) { IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName); if (hWnd == IntPtr.Zero) return; UnsafeNativeMethods.PostMessage(hWnd, msg, IntPtr.Zero, (IntPtr)lParam); } /// /// 跨进程,向指定窗口发送指定消息,立即返回 /// /// 窗口标题 /// 消息 /// wParm /// lParm public static void PostMessage(string lpWindowName, int msg, int wParam, int lParam) { IntPtr hWnd = UnsafeNativeMethods.FindWindow(null, lpWindowName); if (hWnd == IntPtr.Zero) return; UnsafeNativeMethods.PostMessage(hWnd, msg, (IntPtr)wParam, (IntPtr)lParam); } /// /// 跨进程,向指定窗口发送指定消息,立即返回 /// /// 窗口句柄 /// 消息 /// lParam public static void PostMessage(IntPtr hWnd, int msg, int lParam) { if (hWnd == IntPtr.Zero) return; UnsafeNativeMethods.PostMessage(hWnd, msg, IntPtr.Zero, (IntPtr)lParam); } /// /// 跨进程,向指定窗口发送指定消息,立即返回 /// /// 窗口句柄 /// 消息 /// wParam /// lParam public static void PostMessage(IntPtr hWnd, int msg, int wParam, int lParam) { if (hWnd == IntPtr.Zero) return; UnsafeNativeMethods.PostMessage(hWnd, msg, (IntPtr)wParam, (IntPtr)lParam); } #endregion #region 窗口 /// /// 从 lParam 提取坐标 /// /// 消息中的 lParam 参数 /// 鼠标相对窗口坐标 public static Point GetMousePosition(IntPtr lParam) { return new Point(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); } /// /// 获取该控件的右下角相对于其容器的左上角的坐标。 /// /// 控件句柄。 /// System.Drawing.Point,它表示控件的右下角相对于其容器的左上角。 public static Point GetBottomRight(IntPtr hWnd) { NativeMethods.RECT lpRect = new NativeMethods.RECT(); UnsafeNativeMethods.GetWindowRect(hWnd, ref lpRect); NativeMethods.POINT pt = new NativeMethods.POINT(lpRect.bottom, lpRect.right); //父窗口不为空转换坐标 IntPtr hWndParent = GetParent(hWnd); if (hWndParent != IntPtr.Zero) UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWndParent, ref pt, 1); return new Point(pt.x, pt.y); } /// /// 获取一个值,该值指示是否将控件显示为顶级窗口。 /// /// 控件句柄。 /// 如果为 true,则将控件显示为顶级窗口;否则,为 false。 public static bool GetTopLevel(IntPtr hWnd) { int dwStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_STYLE); return ((dwStyle & NativeMethods.WS_CHILD) == 0); } /// /// 获取一个值,该值指示控件是否有与它关联的句柄。 /// /// 控件句柄。 /// 如果已经为控件分配了句柄,则为 true;否则为 false。 public static bool GetIsHandleCreated(IntPtr hWnd) { return (hWnd != IntPtr.Zero); } /// /// 获取一个值,该值指示是否显示该控件及其所有父控件。 /// /// 控件句柄。 /// 如果显示该控件及其所有父控件,则为 true;否则为 false。默认为 true。 public static bool GetVisible(IntPtr hWnd) { return UnsafeNativeMethods.IsWindowVisible(hWnd); } /// /// 设置一个值,该值指示是否显示该控件及其所有父控件。 /// /// 控件句柄。 /// 如果显示该控件及其所有父控件,则为 true;否则为 false。默认为 true。 public static void SetVisible(IntPtr hWnd, bool value) { UnsafeNativeMethods.SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOZORDER | NativeMethods.SWP_NOACTIVATE | (value ? NativeMethods.SWP_SHOWWINDOW : NativeMethods.SWP_HIDEWINDOW)); } /// /// 获取一个值,该值指示控件是否可以对用户交互作出响应。 /// /// 控件句柄。 /// 如果控件可以对用户交互作出响应,则为 true;否则为 false。默认为 true。 public static bool GetEnabled(IntPtr hWnd) { return UnsafeNativeMethods.IsWindowEnabled(hWnd); } /// /// 设置一个值,该值指示控件是否可以对用户交互作出响应。 /// /// 控件句柄。 /// 如果控件可以对用户交互作出响应,则为 true;否则为 false。默认为 true。 public static void SetEnabled(IntPtr hWnd, bool value) { UnsafeNativeMethods.EnableWindow(hWnd, value); } /// /// 获取一个值,该值指示控件是否有输入焦点。 /// /// 控件句柄。 /// 如果控件有焦点,则为 true;否则为 false。 public static bool GetFocused(IntPtr hWnd) { return (GetIsHandleCreated(hWnd) && (UnsafeNativeMethods.GetFocus() == hWnd)); } /// /// 获取一个值,该值指示控件是否可以接收焦点。 /// /// 控件句柄。 /// 如果控件可以接收焦点,则为 true;否则为 false。 public static bool GetCanFocus(IntPtr hWnd) { if (!GetIsHandleCreated(hWnd)) return false; return UnsafeNativeMethods.IsWindowVisible(hWnd) && UnsafeNativeMethods.IsWindowEnabled(hWnd); } /// /// 获取一个值,该值指示控件或它的一个子控件当前是否有输入焦点。 /// /// 控件句柄。 /// 如果控件或它的一个子控件当前已经有输入焦点,则为 true;否则为 false。 public static bool GetContainsFocus(IntPtr hWnd) { if (!GetIsHandleCreated(hWnd)) return false; IntPtr focus = UnsafeNativeMethods.GetFocus(); if (focus == IntPtr.Zero) return false; return ((focus == hWnd) || UnsafeNativeMethods.IsChild(hWnd, focus)); } /// /// 获取一个值,该值指示控件是否已捕获鼠标。 /// /// 控件句柄。 /// 如果控件已捕获鼠标,则为 true;否则为 false。 public static bool GetCapture(IntPtr hWnd) { return (GetIsHandleCreated(hWnd) && (UnsafeNativeMethods.GetCapture() == hWnd)); } /// /// 设置一个值,该值指示控件是否已捕获鼠标。 /// /// 控件句柄。 /// 如果控件已捕获鼠标,则为 true;否则为 false。 public static void SetCapture(IntPtr hWnd, bool value) { if (value) UnsafeNativeMethods.SetCapture(hWnd); else UnsafeNativeMethods.ReleaseCapture(); } /// /// 获取该控件的左上角相对于其容器的左上角的坐标。 /// /// 控件句柄。 /// System.Drawing.Point,它表示控件的左上角相对于其容器的左上角。 public static Point GetLocation(IntPtr hWnd) { NativeMethods.RECT lpRect = new NativeMethods.RECT(); UnsafeNativeMethods.GetWindowRect(hWnd, ref lpRect); NativeMethods.POINT pt = new NativeMethods.POINT(lpRect.left, lpRect.top); //父窗口不为空转换坐标 IntPtr hWndParent = GetParent(hWnd); if (hWndParent != IntPtr.Zero) UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWndParent, ref pt, 1); return new Point(pt.x, pt.y); } /// /// 设置该控件的左上角相对于其容器的左上角的坐标。 /// /// 控件句柄。 /// System.Drawing.Point,它表示控件的左上角相对于其容器的左上角。 public static void SetLocation(IntPtr hWnd, Point value) { UnsafeNativeMethods.SetWindowPos(hWnd, IntPtr.Zero, value.X, value.Y, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOZORDER | NativeMethods.SWP_NOACTIVATE); } /// /// 获取控件的高度和宽度。 /// /// 控件句柄。 /// System.Drawing.Size,表示控件的高度和宽度(以像素为单位)。 public static Size GetSize(IntPtr hWnd) { NativeMethods.RECT lpRect = new NativeMethods.RECT(); UnsafeNativeMethods.GetWindowRect(hWnd, ref lpRect); return lpRect.Size; } /// /// 设置控件的高度和宽度。 /// /// 控件句柄。 /// System.Drawing.Size,表示控件的高度和宽度(以像素为单位)。 public static void SetSize(IntPtr hWnd, Size value) { UnsafeNativeMethods.SetWindowPos(hWnd, IntPtr.Zero, 0, 0, value.Width, value.Height, NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOZORDER | NativeMethods.SWP_NOACTIVATE); } /// /// 获取控件(包括其非工作区元素)相对于其父控件的大小和位置(以像素为单位)。 /// /// 控件句柄。 /// 相对于父控件的 System.Drawing.Rectangle,表示控件(包括其非工作区元素)的大小和位置(以像素为单位)。 public static Rectangle GetBounds(IntPtr hWnd) { NativeMethods.RECT lpRect = new NativeMethods.RECT(); UnsafeNativeMethods.GetWindowRect(hWnd, ref lpRect); //父窗口不为空转换坐标 IntPtr hWndParent = GetParent(hWnd); if (hWndParent != IntPtr.Zero) UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWndParent, ref lpRect, 2); return lpRect.ToRectangle(); } /// /// 设置控件(包括其非工作区元素)相对于其父控件的大小和位置(以像素为单位)。 /// /// 控件句柄。 /// 相对于父控件的 System.Drawing.Rectangle,表示控件(包括其非工作区元素)的大小和位置(以像素为单位)。 public static void SetBounds(IntPtr hWnd, Rectangle value) { UnsafeNativeMethods.SetWindowPos(hWnd, IntPtr.Zero, value.X, value.Y, value.Width, value.Height, NativeMethods.SWP_NOZORDER | NativeMethods.SWP_NOACTIVATE); } /// /// 获取控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。 /// /// 控件句柄。 /// System.Int32 表示控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。 public static int GetLeft(IntPtr hWnd) { return GetLocation(hWnd).X; } /// /// 设置控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。 /// /// 控件句柄。 /// System.Int32 表示控件左边缘与其容器的工作区左边缘之间的距离(以像素为单位)。 public static void SetLeft(IntPtr hWnd, int value) { Point pt = GetLocation(hWnd); pt.X = value; SetLocation(hWnd, pt); } /// /// 获取控件上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。 /// /// 控件句柄。 /// System.Int32 表示控件下边缘与其容器的工作区上边缘之间的距离(以像素为单位)。 public static int GetTop(IntPtr hWnd) { return GetLocation(hWnd).Y; } /// /// 设置控件上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。 /// /// 控件句柄。 /// System.Int32 表示控件上边缘与其容器的工作区上边缘之间的距离(以像素为单位)。 public static void SetTop(IntPtr hWnd, int value) { Point pt = GetLocation(hWnd); pt.Y = value; SetLocation(hWnd, pt); } /// /// 获取控件右边缘与其容器的工作区左边缘之间的距离(以像素为单位)。 /// /// 控件句柄。 /// System.Int32 表示控件右边缘与其容器的工作区左边缘之间的距离(以像素为单位)。 public static int GetRight(IntPtr hWnd) { return GetBottomRight(hWnd).X; } /// /// 获取控件下边缘与其容器的工作区上边缘之间的距离(以像素为单位)。 /// /// 控件句柄。 /// System.Int32 表示控件下边缘与其容器的工作区上边缘之间的距离(以像素为单位)。 public static int GetBottom(IntPtr hWnd) { return GetBottomRight(hWnd).Y; } /// /// 获取控件的宽度。 /// /// 控件句柄。 /// 控件的宽度(以像素为单位)。 public static int GetWidth(IntPtr hWnd) { return GetSize(hWnd).Width; } /// /// 设置控件的宽度。 /// /// 控件句柄。 /// 控件的宽度(以像素为单位)。 public static void SetWidth(IntPtr hWnd, int value) { Size sz = GetSize(hWnd); sz.Width = value; SetSize(hWnd, sz); } /// /// 获取控件的高度。 /// /// 控件句柄。 /// 控件的高度(以像素为单位)。 public static int GetHeight(IntPtr hWnd) { return GetSize(hWnd).Height; } /// /// 设置控件的高度。 /// /// 控件句柄。 /// 控件的高度(以像素为单位)。 public static void SetHeight(IntPtr hWnd, int value) { Size sz = GetSize(hWnd); sz.Height = value; SetSize(hWnd, sz); } /// /// 获取控件的工作区的高度和宽度。 /// /// 控件句柄。 /// 一个 System.Drawing.Size,表示控件的工作区的维数。 public static Size GetClientSize(IntPtr hWnd) { NativeMethods.RECT lpRect = new NativeMethods.RECT(); UnsafeNativeMethods.GetClientRect(hWnd, ref lpRect); return lpRect.Size; } /// /// 设置控件的工作区的高度和宽度。 /// /// 控件句柄。 /// 一个 System.Drawing.Size,表示控件的工作区的维数。 public static void SetClientSize(IntPtr hWnd, Size value) { NativeMethods.RECT lpRect = new NativeMethods.RECT(0, 0, value.Width, value.Height); int dwStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_STYLE); int dwExStyle = UnsafeNativeMethods.GetWindowLong(hWnd, NativeMethods.GWL_EXSTYLE); UnsafeNativeMethods.AdjustWindowRectEx(ref lpRect, dwStyle, false, dwExStyle); SetSize(hWnd, lpRect.Size); } /// /// 获取表示控件的工作区的矩形。 /// /// 控件句柄。 /// 一个 System.Drawing.Rectangle,它表示控件的工作区。 public static Rectangle GetClientRectangle(IntPtr hWnd) { NativeMethods.RECT lpRect = new NativeMethods.RECT(); UnsafeNativeMethods.GetClientRect(hWnd, ref lpRect); return lpRect.ToRectangle(); } /// /// 获取与此控件关联的文本。 /// /// 控件句柄。 /// 与该控件关联的文本。 public static string GetText(IntPtr hWnd) { if (!GetIsHandleCreated(hWnd)) return string.Empty; int windowTextLength = UnsafeNativeMethods.GetWindowTextLength(hWnd); if (UnsafeNativeMethods.GetSystemMetrics(NativeMethods.SM_DBCSENABLED) != 0) windowTextLength = (windowTextLength * 2) + 1; StringBuilder lpString = new StringBuilder(windowTextLength + 1); UnsafeNativeMethods.GetWindowText(hWnd, lpString, lpString.Capacity); return lpString.ToString(); } /// /// 设置与此控件关联的文本。 /// /// 控件句柄。 /// 与该控件关联的文本。 public static void SetText(IntPtr hWnd, string value) { if (GetIsHandleCreated(hWnd)) return; UnsafeNativeMethods.SetWindowText(hWnd, value); } /// /// 将与此控件关联的文本重置为其默认值。 /// /// 控件句柄。 public static void ResetText(IntPtr hWnd) { SetText(hWnd, string.Empty); } /// /// 向用户显示控件。 /// /// 控件句柄。 public static void Show(IntPtr hWnd) { SetVisible(hWnd, true); } /// /// 对用户隐藏控件。 /// /// 控件句柄。 public static void Hide(IntPtr hWnd) { SetVisible(hWnd, false); } /// /// 将控件带到 Z 顺序的前面。 /// /// 控件句柄。 public static void BringToFront(IntPtr hWnd) { UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_TOP, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE); } /// /// 将控件发送到 Z 顺序的后面。 /// /// 控件句柄。 public static void SendToBack(IntPtr hWnd) { UnsafeNativeMethods.SetWindowPos(hWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0, NativeMethods.SWP_NOSIZE | NativeMethods.SWP_NOMOVE); } /// /// 为控件设置输入焦点。 /// /// 控件句柄。 /// 如果输入焦点请求成功,则为 true;否则为 false。 public static bool Focus(IntPtr hWnd) { if (GetCanFocus(hWnd)) UnsafeNativeMethods.SetFocus(hWnd); return GetFocused(hWnd); } /// /// 为控件创建 System.Drawing.Graphics。 /// /// 控件句柄。 /// 控件的 System.Drawing.Graphics。 public static Graphics CreateGraphics(IntPtr hWnd) { return Graphics.FromHwndInternal(hWnd); } /// /// 将指定屏幕点的位置计算成工作区坐标。 /// /// 控件句柄。 /// 要转换的屏幕坐标 System.Drawing.Point。 /// 一个 System.Drawing.Point,它表示转换后的 System.Drawing.Point、p(以工作区坐标表示)。 public static Point PointToClient(IntPtr hWnd, Point p) { NativeMethods.POINT pt = new NativeMethods.POINT(p.X, p.Y); UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWnd, ref pt, 1); return new Point(pt.x, pt.y); } /// /// 将指定工作区点的位置计算成屏幕坐标。 /// /// 控件句柄。 /// 要转换的工作区坐标 System.Drawing.Point。 /// 一个 System.Drawing.Point,它表示转换后的 System.Drawing.Point、p(以屏幕坐标表示)。 public static Point PointToScreen(IntPtr hWnd, Point p) { NativeMethods.POINT pt = new NativeMethods.POINT(p.X, p.Y); UnsafeNativeMethods.MapWindowPoints(hWnd, NativeMethods.HWND_DESKTOP, ref pt, 1); return new Point(pt.x, pt.y); } /// /// 计算指定屏幕矩形的大小和位置(以工作区坐标表示)。 /// /// 控件句柄。 /// 要转换的屏幕坐标 System.Drawing.Rectangle。 /// 一个 System.Drawing.Rectangle,它表示转换后的 System.Drawing.Rectangle、r(以工作区坐标表示)。 public static Rectangle RectangleToClient(IntPtr hWnd, Rectangle r) { NativeMethods.RECT rect = new NativeMethods.RECT(r); UnsafeNativeMethods.MapWindowPoints(NativeMethods.HWND_DESKTOP, hWnd, ref rect, 2); return rect.ToRectangle(); } /// /// 计算指定工作区矩形的大小和位置(以屏幕坐标表示)。 /// /// 控件句柄。 /// 要转换的工作区坐标 System.Drawing.Rectangle。 /// 一个 System.Drawing.Rectangle,它表示转换后的 System.Drawing.Rectangle、r(以屏幕坐标表示)。 public static Rectangle RectangleToScreen(IntPtr hWnd, Rectangle r) { NativeMethods.RECT rect = new NativeMethods.RECT(r); UnsafeNativeMethods.MapWindowPoints(hWnd, NativeMethods.HWND_DESKTOP, ref rect, 2); return rect.ToRectangle(); } /// /// 使控件的整个图面无效并导致重绘控件。 /// /// 控件句柄。 public static void Invalidate(IntPtr hWnd) { Invalidate(hWnd, false); } /// /// 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。 /// /// 控件句柄。 /// 一个 System.Drawing.Rectangle,表示要使之无效的区域。 public static void Invalidate(IntPtr hWnd, Rectangle rc) { Invalidate(hWnd, rc, false); } /// /// 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。 /// /// 控件句柄。 /// 要使之无效的 System.Drawing.Region。 public static void Invalidate(IntPtr hWnd, Region region) { Invalidate(hWnd, region, false); } /// /// 使控件的特定区域无效并向控件发送绘制消息。还可以使分配给该控件的子控件无效。 /// /// 控件句柄。 /// 若要使控件的子控件无效,则为 true;否则为 false。 public static void Invalidate(IntPtr hWnd, bool invalidateChildren) { if (GetIsHandleCreated(hWnd)) { if (invalidateChildren) { UnsafeNativeMethods.RedrawWindow(hWnd, IntPtr.Zero, IntPtr.Zero, NativeMethods.RDW_ALLCHILDREN | NativeMethods.RDW_INVALIDATE);//.Net Framework :多NativeMethods.RDW_ERASE } else { UnsafeNativeMethods.InvalidateRect(hWnd, IntPtr.Zero, false);//.Net Framework :支持透明为true,否则false } } } /// /// 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。 /// /// 控件句柄。 /// 一个 System.Drawing.Rectangle,表示要使之无效的区域。 /// 若要使控件的子控件无效,则为 true;否则为 false。 public static void Invalidate(IntPtr hWnd, Rectangle rc, bool invalidateChildren) { if (rc.IsEmpty) { Invalidate(hWnd, invalidateChildren); } else if (GetIsHandleCreated(hWnd)) { if (invalidateChildren) { NativeMethods.RECT rcUpdate = NativeMethods.RECT.FromXYWH(rc.X, rc.Y, rc.Width, rc.Height); UnsafeNativeMethods.RedrawWindow(hWnd, ref rcUpdate, IntPtr.Zero, NativeMethods.RDW_ALLCHILDREN | NativeMethods.RDW_INVALIDATE);//.Net Framework :多NativeMethods.RDW_ERASE } else { NativeMethods.RECT rect = NativeMethods.RECT.FromXYWH(rc.X, rc.Y, rc.Width, rc.Height); UnsafeNativeMethods.InvalidateRect(hWnd, ref rect, false);//.Net Framework :支持透明为true,否则false } } } /// /// 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。 /// /// 控件句柄。 /// 要使之无效的 System.Drawing.Region。 /// 若要使控件的子控件无效,则为 true;否则为 false。 public static void Invalidate(IntPtr hWnd, Region region, bool invalidateChildren) { if (region == null) { Invalidate(hWnd, invalidateChildren); } else if (GetIsHandleCreated(hWnd)) { IntPtr hRgn = GetHRgn(hWnd, region); try { if (invalidateChildren) { UnsafeNativeMethods.RedrawWindow(hWnd, IntPtr.Zero, hRgn, NativeMethods.RDW_ALLCHILDREN | NativeMethods.RDW_INVALIDATE);//.Net Framework :多NativeMethods.RDW_ERASE } else { UnsafeNativeMethods.InvalidateRgn(hWnd, hRgn, false);//.Net Framework :支持透明为true,否则false } } finally { UnsafeNativeMethods.DeleteObject(hRgn); } } } /// /// 用当前大小和位置更新控件的边界。 /// /// 控件句柄。 public static void Update(IntPtr hWnd) { UnsafeNativeMethods.UpdateWindow(hWnd); } /// /// 强制控件使其工作区无效并立即重绘自己和任何子控件。 /// /// 控件句柄。 public static void Refresh(IntPtr hWnd) { Invalidate(hWnd, true); Update(hWnd); } #endregion } }