C# WPF截获在模式窗口外单击

C# WPF截获在模式窗口外单击,c#,wpf,c++-cli,C#,Wpf,C++ Cli,是否可以检查用户何时在模式窗口外单击?我想以某种方式绕过模态逻辑,因为如果窗口未显示为模态,它将不会显示在活动窗口的顶部,而现在,这是正确显示它的唯一方法。我还没有找到一个正确的方法来实现这一点(因为“deactivate”事件将不再被触发。)一种方法是在主应用程序上连接事件处理程序,并在打开该窗口时响应它: EventManager.RegisterClassHandler(typeof(Window), Mouse.MouseDownEvent, new MouseButtonEventHa

是否可以检查用户何时在模式窗口外单击?我想以某种方式绕过模态逻辑,因为如果窗口未显示为模态,它将不会显示在活动窗口的顶部,而现在,这是正确显示它的唯一方法。我还没有找到一个正确的方法来实现这一点(因为“deactivate”事件将不再被触发。)

一种方法是在主应用程序上连接事件处理程序,并在打开该窗口时响应它:

EventManager.RegisterClassHandler(typeof(Window), Mouse.MouseDownEvent, new MouseButtonEventHandler(OnMousepDown), true);


即使它是一个模式窗口(显示时带有
ShowDialog()
调用),也可以向窗口的类添加一些偶数处理程序,并使其检查窗口外的鼠标单击,如下所示:

    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (posX < 0 || posX > this.Width || posY < 0 || posY > this.Height)
            this.Close();            
    }

    private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        Point p = e.GetPosition(this);

        posX = p.X; // private double posX is a class member
        posY = p.Y; // private double posY is a class member
    }

    private void Window_Activated(object sender, EventArgs e)
    {
        System.Windows.Input.Mouse.Capture(this, System.Windows.Input.CaptureMode.SubTree);
    }
private void Window\u MouseDown(对象发送器,MouseButtonEventArgs e)
{
if(posX<0 | | posX>this.Width | | posY<0 | | posY>this.Height)
这个。关闭();
}
私有无效窗口\u MouseMove(对象发送方,MouseEventArgs e)
{
点p=e.GetPosition(本);
posX=p.X;//private double posX是类成员
posY=p.Y;//private double posY是类成员
}
私有无效窗口\u已激活(对象发送方,事件参数e)
{
System.Windows.Input.Mouse.Capture(这是System.Windows.Input.CaptureMode.SubTree);
}

在一个困难的环境中,这为我完成了任务:混合了MFC、WindowsForms和庞大的应用程序——没有互操作,没有其他复杂的东西。希望它能帮助其他人面对这种奇怪的行为。

非常感谢你的提示。。不幸的是,我不能使用这种方法,因为该应用程序是旧的MFC应用程序。。也经历了一些Windows窗体阶段。。我尝试了互操作黑客和现代方法,最终可能找到了一个解决方案。哇,听起来像个坏家伙!祝你好运,+1到你下面的帖子!这种方法的一个警告是,如果用户单击窗口的标题栏,窗口将关闭。这也使得重新定位窗口变得不可能。这是一个很好的答案,但是没有必要使用MouseMove事件。您可以从MouseDown以完全相同的方式获取鼠标位置。
    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (posX < 0 || posX > this.Width || posY < 0 || posY > this.Height)
            this.Close();            
    }

    private void Window_MouseMove(object sender, MouseEventArgs e)
    {
        Point p = e.GetPosition(this);

        posX = p.X; // private double posX is a class member
        posY = p.Y; // private double posY is a class member
    }

    private void Window_Activated(object sender, EventArgs e)
    {
        System.Windows.Input.Mouse.Capture(this, System.Windows.Input.CaptureMode.SubTree);
    }