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