我的表单中有以下 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/