如何判断屏幕的WorkingArea何时发生变化(即任务栏被移动)?

时间:2010-04-23 19:16:39

标签: c# .net wpf winforms interop

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

3 个答案:

答案 0 :(得分:0)

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

你需要互操作才能做到这一点,这里是关于用C#做这个的Code Project文章,虽然我只用C ++做了所以我不能保证这篇文章,但它应该是一个公平的起点。 http://www.codeproject.com/KB/dotnet/AppBar.aspx

答案 1 :(得分:0)

我最后采用非常简单的方法运行DispatcherTimer,每两秒钟一次,只需检查当前的WorkingArea与最后检查的WorkingArea,如果它们不同则发送一个事件。

答案 2 :(得分:0)

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

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!!!!
            }
        }
    }