gpt4 book ai didi

c# - 同步重绘窗口控件(采用阻塞方式)

转载 作者:太空狗 更新时间:2023-10-29 21:58:34 25 4
gpt4 key购买 nike

我想做的是让一个控件(在同一进程中,但我无法控制)重绘自身,并让我的代码阻塞,直到它完成重绘

我尝试使用 UpdateWindow但这似乎并没有等待重绘完成。

我需要等待它完成重绘的原因是我想在之后抓取屏幕。

该控件不是 dotNet 控件,它是常规的 Windows 控件。

我已经确认:

  • 句柄正确。
  • UpdateWindow 返回 true。
  • 尝试在调用 UpdateWindow 之前发送 InvalidateRect(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

最佳答案

您可以使用 Application.DoEvents 强制应用程序处理所有排队的消息(包括 WM_PAINT!) .像这样:

public bool PaintWindow(IntPtr hWnd)
{
InvalidateRect(hWnd, IntPtr.Zero, true);
if (UpdateWindow(hWnd))
{
Application.DoEvents();
return true;
}

return false;
}

但是如果你无论如何都要抢屏,发送WM_PRINT不是一石二鸟吗?消息?

可以通过以下代码实现:

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);
}
}

关于c# - 同步重绘窗口控件(采用阻塞方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14057039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com