У меня проблема в том, что если я изменю LParam сообщения WM_MOVING, чтобы моя форма оставалась на определенной позиции, что является законным в соответствии с this , функция Windows Aero Shake будет запущена, и все другие окна сворачиваются. Поведение можно воспроизвести, создав проект Windows Forms в Visual Studio и вставив следующий код в форму:
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 думать, что я потрясаю Окно любым другим способом?
Спасибо!