【发布时间】:2013-06-06 13:13:49
【问题描述】:
当我尝试用这个拖动我的窗口时,窗口会跳动并闪烁:
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_MOVE)
{
int x = (m.LParam.ToInt32() & 0xffff);
int y = ((m.LParam.ToInt32() >> 16) & 0xffff);
if (x < 500)
Location = new Point(0, y);
else
base.WndProc(ref m);
}
else
base.WndProc(ref m);
}
- 必须停止跳跃
-
WM_MOVE、WM_MOVING、WM_WINDOWPOSCHANGING或其他移动事件必须在拖动窗口时继续触发,因为我希望检查每个新位置。 - 另一个问题是
Location = new Point(0, y);触发另一个移动事件(这个应该被忽略)
请帮忙!
【问题讨论】:
-
您是否只是想通过拖动来阻止移动窗口?窗口从哪里开始(你在开始时设置 0,0)?
-
您忘记了 WM_MOVING 消息。为什么这需要是“winapi”非常不清楚,LocationChanged 事件运行良好。
-
听起来你应该使用WM_WINDOWPOSCHANGING。您可以更改 WINDOWPOS 结构以修改窗口位置和/或大小。使用 Marshal.PtrToStructure() 将其取出,并使用 Marshal.StructureToPtr() 将其放回;与我使用 WM_GETMINMAXINFO 所做的 here 非常相似。
-
@Idle_Mind 如果我修改不会触发移动/定位事件的 windowpos 结构,对吗?你能回答并帮助如何做到这一点(赚取积分)吗?
-
最初的移动和“捕捉”会触发一个 Move() 事件,但之后不会生成任何事件......它只会粘在原地。