c# - 使用 Graphics.FromHwnd 在屏幕上绘图和清除

标签 c# winforms graphics screen handle

我正在尝试创建一个程序来获取光标下窗口的句柄,显示有关它的一些数据并在整个窗口的顶部绘制一个填充的矩形(具有非常低的 alpha)。我正在使用 C# 和 winforms。

我已经成功地这样做了,但问题是我的绘制方法在 BackgroundWorker 的循环中并且它不断地在窗口上制作越来越多的矩形(-> 具有更高 alpha 的矩形)或者当将鼠标移动到另一个旧窗口时一个仍然存在。

我还没有设法找到一种方法来清除绘制的矩形,因为它只是“存在”在屏幕上并且没有绑定(bind)到图形对象或任何东西。

我尝试过使用某些本地方法,例如

[DllImport("User32.dll")]
public static extern Int64 SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]
public static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);

[DllImport("user32.dll")]
public static extern bool UpdateWindow(IntPtr hWnd);

[DllImport("user32.dll")]
public static extern bool RedrawWindow(IntPtr hWnd, IntPtr lprcUpdate, IntPtr hrgnUpdate, RedrawWindowFlags flags);

但以上都没有正常工作。其中一些确实有效,但是当消息进入队列时,重绘不会立即发生,或者非常缓慢且出现故障(闪烁等)。

所以,问题是,我如何“删除”我使用 Graphics.FromHwnd(handleOfWindowUnderCursor) 绘制的矩形?实际上,我认为它在其他窗口上绘制并不重要,因为我之前在尝试摆脱我自己的表单上的绘图时也遇到过同样的问题(也从未修复过!)。

或者,关于如何在不使用我现在的方法的情况下完成绘制和删除光标下窗口上的矩形的任何建议?

最佳答案

我注意到绘图使用

Graphics g = Graphics.FromHwnd(form.Handle);

在其控制下绘制表单背景。这是你想要完成的吗?

// draw the rectangle
Brush b = new SolidBrush(Color.FromArgb(20, 0, 0, 255));
g.FillRectangle(b, new Rectangle(5, 5, 200, 200));

// clear the rectangle
g.Clear(this.BackColor);

如果我直接在屏幕上绘制,用这个:

Graphics g = Graphics.FromHwnd(IntPtr.Zero);

Windows 刷新屏幕后矩形立即消失。

还有第三种选择,这不是很简单。

不绘制矩形,而是创建一个不透明度较低、TopMost 属性设置为 true 且无边框的表单。然后让它对事件透明:

protected override void WndProc(ref Message m)
        {
            const int WM_NCHITTEST = 0x0084;
            const int HTTRANSPARENT = (-1);

            if (m.Msg == WM_NCHITTEST)
            {
                m.Result = (IntPtr)HTTRANSPARENT;
            }
            else
            {
                base.WndProc(ref m);
            }
        }

在那之后你唯一需要注意的就是这个表单的 Visible、Location 和 Size 属性。

关于c# - 使用 Graphics.FromHwnd 在屏幕上绘图和清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15682543/

相关文章:

c# - 获取总结果数并允许在与 MongoDB 的同一查询中进行分页

c# - 使用泛型使算法适用于 "something"列表而不是仅适用于字符串

c# - 设置 TabPage 标题颜色

c# - richtextbox selectioncolor 和 selectionbackcolor 属性

optimization - 最优脏矩形集

python - 结合两种不同的语言(不是你想的那样)

C# 字符串字符替换

c# - 自定义绑定(bind)的数据 GridView

r - 轴标签放置

c# - Sones GraphDB 查询返回错误