众所周知,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());