WinForms窗口拖动事件

WinForms窗口拖动事件,winforms,events,opacity,drag,Winforms,Events,Opacity,Drag,WinForms中是否存在在拖动窗口时触发get的事件 或者有没有更好的方法来实现我的目标:在拖动窗口时,将窗口的不透明度降低到80% 不幸的是,这是一个非常棘手的搜索过程,因为每个人都在寻找shell或其他对象的拖放操作。这是您想要的事件: private void YourApp_LocationChanged(object sender, EventArgs e) { this.Opacity = 0.8; } 您必须覆盖WndProc并处理退出移动事件,以将不透明度重置回1:

WinForms中是否存在在拖动窗口时触发get的事件

或者有没有更好的方法来实现我的目标:在拖动窗口时,将窗口的不透明度降低到80%

不幸的是,这是一个非常棘手的搜索过程,因为每个人都在寻找shell或其他对象的拖放操作。

这是您想要的事件:

private void YourApp_LocationChanged(object sender, EventArgs e)
{
    this.Opacity = 0.8;
}
您必须覆盖
WndProc
并处理退出移动事件,以将不透明度重置回1:

protected override void WndProc(ref Message m)
{
    Trace.WriteLine(m.ToString());
    switch (m.Msg)
    {
        case WMEXITSIZEMOVE:
            this.Opacity = 1.0;
            break;
    }
    base.WndProc(ref m);
}
不要忘记定义消息代码:

private const int WMEXITSIZEMOVE = 0x0232;
处理(code
0x0231
)消息而不是
LocationChanged
可能更有效,因为这只会导致设置一次不透明度(在拖动开始时),而不是在整个拖动过程中连续设置。

这是您想要的事件:

private void YourApp_LocationChanged(object sender, EventArgs e)
{
    this.Opacity = 0.8;
}
您必须覆盖
WndProc
并处理退出移动事件,以将不透明度重置回1:

protected override void WndProc(ref Message m)
{
    Trace.WriteLine(m.ToString());
    switch (m.Msg)
    {
        case WMEXITSIZEMOVE:
            this.Opacity = 1.0;
            break;
    }
    base.WndProc(ref m);
}
不要忘记定义消息代码:

private const int WMEXITSIZEMOVE = 0x0232;

处理(code
0x0231
)消息而不是
LocationChanged
可能更有效,因为这只会导致设置不透明度一次(在拖动开始时),而不是在整个拖动过程中持续设置不透明度。

无需WndProc黑客攻击,这可以正常工作:

protected override void OnResizeBegin(EventArgs e) {
  this.Opacity = 0.6;
}
protected override void OnResizeEnd(EventArgs e) {
  this.Opacity = 1.0;
}

移动也会触发OnResizeXxx事件。

无需WndProc黑客攻击,这可以正常工作:

protected override void OnResizeBegin(EventArgs e) {
  this.Opacity = 0.6;
}
protected override void OnResizeEnd(EventArgs e) {
  this.Opacity = 1.0;
}

移动也会触发OnResizeXxx事件。

我将尝试WMEXITSIZEMOVE和WM_ENTERSIZEMOVE,但这确实满足了我的需要。谢谢@Steve-我的意思是使用WM_ENTERSIZEMOVE而不是LocationChanged。我怀疑这是否有效,除非您将常规表单的不透明度设置为99%@nobugz-默认的
不透明度
1.0
。我已经让这两个版本的代码在一个应用程序中运行,没有任何问题。当您将不透明度从1.0更改为0.8时,将重新创建窗口句柄。这必须取消模式大小/移动循环,您将获得一个新窗口。如果它能起作用,请考虑这个无用的闲聊。我会尝试两个WMVITSIZEVS和WMIN SysSimeMeMeFe,但这确实做了我需要的。谢谢@Steve-我的意思是使用WM_ENTERSIZEMOVE而不是LocationChanged。我怀疑这是否有效,除非您将常规表单的不透明度设置为99%@nobugz-默认的
不透明度
1.0
。我已经让这两个版本的代码在一个应用程序中运行,没有任何问题。当您将不透明度从1.0更改为0.8时,将重新创建窗口句柄。这必须取消模式大小/移动循环,您将获得一个新窗口。如果它有效,请考虑这个无用的闲聊。它处理得好多了。如果您在Win7上执行类似Aero shake的操作,然后再次执行该操作以使窗口返回,它将丢失控制柄并将窗口保持在设置的不透明度,直到您再次移动它。+1但一件坏事是,如果您在应用程序的标题栏上按住鼠标右键,它将被视为“onresizebegin”事件。这是一个很好的调用。它处理得好多了。如果在Win7上执行类似Aero shake的操作,然后再次执行该操作以使窗口返回,则会丢失控制柄,并将窗口保持在设置的不透明度,直到再次移动它。+1但一件坏事是,如果在应用程序的标题栏上按住鼠标右键,它将被视为“onresizebegin”事件。