【问题标题】:How can I tell when a screen's WorkingArea changes (i.e. task bar is moved)?如何判断屏幕的 WorkingArea 何时发生变化(即移动任务栏)?
【发布时间】:2011-02-11 16:21:23
【问题描述】:

我有一些窗口停靠在工作区域的边缘/角落,我需要知道屏幕的 WorkingArea 是否/何时发生变化,以便更新这些窗口的位置。我记得,我之前尝试过解决这个问题,但无济于事。

【问题讨论】:

  • 您在工作区使用哪种面板?什么语言,WinForms 还是 WPF?
  • 好吧,我大部分时间都在使用 WPF(窗口是 WPF 窗口),但使用 WinForms 通过 System.Windows.Forms.Screen.PrimaryScreen.WorkingArea 获取 WorkingArea。

标签: c# .net wpf winforms interop


【解决方案1】:

1- 在表单中创建一个属性,用于保存工作区或最后一个屏幕的最后位置(如代码示例中所示)。

2- 覆盖表单中的 LocationChanged 以检查表单的新位置是否在新的 WorkingArea 上。如果是这样,则表单位于新屏幕(工作区)上。

    protected override void OnLocationChanged(EventArgs e)
    {
        base.OnLocationChanged(e);
        WorkingScreen = Screen.AllScreens.ToList().FirstOrDefault(s => s.WorkingArea == Screen.GetWorkingArea(this));
    }

    Screen _WorkingScreen = null;

    Screen WorkingScreen
    {
        get { return _WorkingScreen; }
        set
        {
            if (WorkingScreen != value)
            {
                _WorkingScreen = value;
                // Screen changed or working area changed!!!!
            }
        }
    }

【讨论】:

  • 嗨,Alnaouq,欢迎来到该网站!如果您可以添加一些文本来阐明您的代码示例如何以及为什么解决问题并为其提供一些上下文,那就太好了。
【解决方案2】:

我最终只采用了一种非常简单的方法,即运行 DispatcherTimer,每两秒计时一次,然后简单地检查当前的 WorkingArea 与上次检查的 WorkingArea,如果它们不同,则发送一个事件。

【讨论】:

    【解决方案3】:

    一种方法是将您的窗口注册为应用程序桌面工具栏 (AppBar) http://msdn.microsoft.com/en-us/library/bb776821(VS.85).aspx 然后系统会在您的窗口需要重新定位、调整大小等时向您发送通知。例如,当发生影响 AppBar 的大小/位置/可见性等的事情时,AppBar 会从系统收到 ABN_POSCHANGED 通知。

    您需要互操作才能做到这一点,这里有一篇关于使用 C# 执行此操作的代码项目文章,虽然我只使用 C++ 完成过,所以我不能保证这篇文章,但它应该是一个公平的起点。 http://www.codeproject.com/KB/dotnet/AppBar.aspx

    【讨论】:

    • 感谢您的回复。我会将此标记为答案,因为这是一个好主意,即使我最终采用了不同的(更简单,但不那么优雅)方法(见帖子)。
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多