C# 同步重画窗口控件(使用阻塞方法)
我试图做的是使控件(在同一个过程中,但我无法控制)重新绘制自身,并阻止我的代码,直到它完成重新绘制 我试过使用,但似乎没有等到重新绘制完成 我需要等待它完成重画的原因是我想在之后抓取屏幕 该控件不是dotNet控件,而是常规的windows控件 我已经证实:C# 同步重画窗口控件(使用阻塞方法),c#,winapi,gdi,invalidation,redraw,C#,Winapi,Gdi,Invalidation,Redraw,我试图做的是使控件(在同一个过程中,但我无法控制)重新绘制自身,并阻止我的代码,直到它完成重新绘制 我试过使用,但似乎没有等到重新绘制完成 我需要等待它完成重画的原因是我想在之后抓取屏幕 该控件不是dotNet控件,而是常规的windows控件 我已经证实: 手柄是正确的 UpdateWindow返回true 在调用UpdateWindow之前,尝试发送invalidate(hWnd,IntPtr.Zero,true),以确保窗口需要失效 尝试在控件的父窗口上执行相同的操作 使用的代码: [
- 手柄是正确的
返回trueUpdateWindow
- 在调用
之前,尝试发送UpdateWindow
,以确保窗口需要失效invalidate(hWnd,IntPtr.Zero,true)
- 尝试在控件的父窗口上执行相同的操作
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool InvalidateRect(IntPtr hWnd, IntPtr rect, bool bErase);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UpdateWindow(IntPtr hWnd);
public bool PaintWindow(IntPtr hWnd)
{
InvalidateRect(hWnd, IntPtr.Zero, true);
return UpdateWindow(hWnd);
}
//returns true
您可以使用强制应用程序处理所有排队的消息(包括WM_PAINT!)。大概是这样的:
public bool PaintWindow(IntPtr hWnd)
{
InvalidateRect(hWnd, IntPtr.Zero, true);
if (UpdateWindow(hWnd))
{
Application.DoEvents();
return true;
}
return false;
}
但若你们无论如何都要抓住屏幕,那个么通过发送信息来一举两得不是更好吗
您可以通过以下代码执行此操作:
internal static class NativeWinAPI
{
[Flags]
internal enum DrawingOptions
{
PRF_CHECKVISIBLE = 0x01,
PRF_NONCLIENT = 0x02,
PRF_CLIENT = 0x04,
PRF_ERASEBKGND = 0x08,
PRF_CHILDREN = 0x10,
PRF_OWNED = 0x20
}
internal const int WM_PRINT = 0x0317;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg,
IntPtr wParam, IntPtr lParam);
}
public static void TakeScreenshot(IntPtr hwnd, Graphics g)
{
IntPtr hdc = IntPtr.Zero;
try
{
hdc = g.GetHdc();
NativeWinAPI.SendMessage(hwnd, NativeWinAPI.WM_PRINT, hdc,
new IntPtr((int)(
NativeWinAPI.DrawingOptions.PRF_CHILDREN |
NativeWinAPI.DrawingOptions.PRF_CLIENT |
NativeWinAPI.DrawingOptions.PRF_NONCLIENT |
NativeWinAPI.DrawingOptions.PRF_OWNED
))
);
}
finally
{
if (hdc != IntPtr.Zero)
g.ReleaseHdc(hdc);
}
}
也许你可以在WM_PAINT case中禁用渲染,然后再重新启用。@S.A.Parkhid你能详细说明一下吗?嗯。。为什么你认为UpdateWindow似乎没有等待重画完成?谢谢,我会尝试一下,让你知道。我明天才能测试它,我会尽快更新。
应用程序。如果事件不起作用,WM\u PRINT
不幸没有起作用。谢谢你的帮助!