众所周知,Windows 的任务栏可以设定成自动隐藏,这样任务栏将只在需要的时候显示出来,而其它时间则隐藏起来,通常这样做可以为我们提供更大一点的工作空间。那么任务栏的隐藏是如何实现的呢?是否与我们通常情况隐藏窗口时采用不显示窗口的手法一致呢?
其实之所以提出以上问题,是由于在尝试识别当前任务栏状态的时候碰到了问题。按照通常的想法,如果想要识别任务栏是否处于显示状态,可以通过FindWindow 先取得任务栏的窗口句柄,然后根据窗口句柄调用函数IsWindowVisible 就可以取得当前任务栏的状态了。
根据上述思路识别任务栏当前是否显示的代码如下:
HWND hWnd = ::FindWindow("Shell_TrayWnd", NULL);
BOOL bSheTraVis = ::IsWindowVisible(hWnd);
注意 :FindWindow 的第一个参数是类名或窗口名,这里的“Shell_TrayWnd” 表明要查找的窗口是任务栏。
然而运行上述代码并跟踪IsWindowVisible 的返回值bSheTraVis ,可以发现无论任务栏是处于显示状态还是隐藏状态,其值均为1( 即真) 。这个测试结果证明任务栏的隐藏与普通窗口的隐藏并不太一样。那么除了不在屏幕上显示窗口以外还有什么方法可以实现窗口的隐藏呢?我能够想到的只有一种办法,那就是窗口虽然显示了,但是它却显示在屏幕之外!为了验证这个猜想,可以尝试取得隐藏之后的任务栏的位置,相关代码如下:
CRect rcShellTray;
HWND hWnd = ::FindWindow("Shell_TrayWnd", NULL);
::GetWindowRect(hWnd,&rcShellTray);
在屏幕分辨率为1024*768 的机器上运行上述测试代码并跟踪取得的rcShellTray 值,可以发现rcShellTray 中的数据如下:
top: 766 bottom: 800 left: 0 right: 1024
bottom 值为800 说明任务栏的底端在屏幕之外,而top 值为766 说明任务栏在隐藏时任务栏的顶边其实还是在屏幕范围之内的。之所以没有将top 值也设定到屏幕之外,我猜想是因为当我们将鼠标移到屏幕底端时任务栏需要监测到鼠标到达底端以便显示任务栏。
所以,任务栏的隐藏其实并不是真正隐藏了窗口,而只是将任务栏显示在了屏幕之外而已。知道了这些以后,就可以利用它实现一些需要的功能。例如,将以下代码置于窗口的OnInitDialog 函数中,就可以在屏幕右下角显示该窗口,但是如果任务栏处于正常显示状态时,它将显示于任务栏之上,而不会与任务栏之间产生遮盖现象。
// 屏幕宽度与高度 int with= GetSystemMetrics(SM_CXSCREEN); int heigh= GetSystemMetrics(SM_CYSCREEN); // 取得任务栏位置 CRect rcShellTray; HWND hWnd = ::FindWindow("Shell_TrayWnd", NULL); if(hWnd) { ::GetWindowRect(hWnd,&rcShellTray); } // 取得窗口大小 CRect rcDialog; GetWindowRect(&rcDialog); // 移动窗口位置 MoveWindow(with - rcDialog.Width(), rcShellTray.top - rcDialog.Height(), rcDialog.Width(), rcDialog.Height());
欢迎访问梦断洒醒的博客http://www.yanzhijun.com