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