c# - WndProc 处理程序效率低下

标签 c# .net winforms

我的表单中有以下 WndProc 处理程序。它应该防止水平移动表单(只允许垂直移动):

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if (!ShowCaption && m.Msg == 0x216)
    {  // Trap WM_MOVING
        var rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
        int w = rc.right - rc.left;
        rc.left = this.Left;
        rc.right = rc.left + w;
        Marshal.StructureToPtr(rc, m.LParam, false);
    }
    base.WndProc(ref m);
}

它可以工作,但是当用户移动表单时,CPU 使用率会显着增加。这个功能有什么效率如此低下的地方,有什么办法吗?

最佳答案

我试过你的代码,效果很好。它没有像你说的那样 100% CPU 饱和,只占用了 ~16%。

我想需要很长时间来处理的是窗体的绘制,或者背景窗口的绘制(而不是 wndproc 实现)。

尝试通过添加等待来限制表单每秒可以重绘的次数

System.Threading.Thread.Sleep(10);

在这一行之后:

Marshal.StructureToPtr(rc, m.LParam, false);

拖动时休眠 10 毫秒限制您的表单每秒重绘超过 100 次,同时让一些 CPU 未被使用...

编辑:忘记提及添加 sleep 将我盒子上的 ~16% 更改为 ~12%。

关于c# - WndProc 处理程序效率低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426879/

相关文章:

c# - 删除 GDI+ 对象

c# - 表中连续插入数据

c# XmlDocument SelectNodes 不返回节点

c# - 带等待的命名互斥量

c# - 如何在 Web 请求后在 C# 中反序列化复杂的嵌套 Json 数据

c# - IntPtr 不包含 native 值

c# - 使用 .net2 返回委托(delegate)的方法

c# - 如何检查 (c#) ControlCollection.Find() 是否返回结果

java - .Net 委托(delegate)相对于 Java 匿名类的真正优势是什么?

c# - 将面板绑定(bind)到窗体