当窗口靠近屏幕边缘时,将窗口对齐到屏幕边缘

时间:2019-12-19 03:42:06

标签: c# wpf

我有一个WPF应用,当用户将主窗口拖动到角落时,我想将其主窗口捕捉到屏幕的左上角。

我写了几行代码来实现这一目标。

private void Window_LocationChanged(object sender, EventArgs e)
{
    if (Left < 10 && Top < 10)
    {
        Top = 0;
        Left = 0;
    }
}

基本上,当主窗口接近屏幕的左上角时,主窗口会自动将其自身调整为0、0位置。

它正在按预期方式工作,但是看起来并不漂亮,因为当主窗口足够接近以触发事件时,它会闪烁。我试图将事件更改为在鼠标左键向上移动时启动,但看来当标题栏被抓住时,应用无法检测到鼠标按钮的状态。

您有什么建议使窗口在拐角处不跳来跳去?

编辑:一旦窗口靠近角落,我试图抬起鼠标左键,但是一旦窗口被卡住,我就无法将其从角落移开,这使解决方案无法使用。另外,如果这是我一直在寻找的解决方案,则可以在加载应用程序开始时将窗口锁定到角落。

1 个答案:

答案 0 :(得分:0)

您可以使用本机mouse_event函数释放鼠标捕获。

您还应该确保您不处理捕捉窗口时引发的LocationChanged事件。您可以为此使用Boolean标志:

public partial class Window1 : Window
{
    private const uint MOUSEEVENTF_LEFTUP = 0x04;

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, UIntPtr dwExtraInfo);

    public Window1()
    {
        InitializeComponent();
        LocationChanged += Window_LocationChanged;
    }

    private bool _handle = true;
    private void Window_LocationChanged(object sender, EventArgs e)
    {
        if (_handle && Left < 100 && Top < 100)
        {
            _handle = false;
            mouse_event(MOUSEEVENTF_LEFTUP, 50, 50, 0, UIntPtr.Zero);
            Top = 0;
            Left = 0;
            _handle = true;
        }
    }
}