【发布时间】:2018-10-07 01:33:32
【问题描述】:
我遇到的问题是,如果我更改 WM_MOVING 消息的 LParam 以将我的表单保持在某个位置,根据 this 是合法的,Windows Aero Shake 功能将被触发并且所有其他 Windows 最小化。可以通过在 Visual Studio 中创建 Windows 窗体项目并将以下代码粘贴到窗体中来重现该行为:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace FormsTest
{
public partial class ShakeTest : Form
{
[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 16)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
public const int WM_MOVING = 0x0216;
public ShakeTest()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_MOVING:
{
RECT rec;
rec.bottom = 500;
rec.left = 100;
rec.top = 100;
rec.right = 500;
Marshal.StructureToPtr(rec, m.LParam, true);
m.Result = new IntPtr(1);
}
break;
}
base.WndProc(ref m);
}
}
}
如果您现在抓住窗口的标题栏并稍微移动鼠标,则应该触发摇动手势,即使窗口根本没有移动。
到目前为止,我仅在 Windows 10 上对此进行了测试。
所以我的问题是,我可以禁用某个窗口或进程的摇动功能吗?如果不是,我可以防止 Windows 认为我以其他方式摇动 Window 吗?
谢谢!
【问题讨论】:
-
不,这不是要阻止用户最大化表单,这个例子只是非常简单,我真正做的是将窗口捕捉到某些“Dock Areas”
-
我回复的评论突然消失了
-
@SergeyShevchenko 这对我的情况不起作用,因为它只在移动开始时触发一次,我需要在移动时改变窗口的边界
-
好的,我刚刚编译了你的代码,发现窗口一直保持在同一个位置,所以我决定——这就是你想要实现的。我会再举一个例子……