Delphi 任务栏的自动隐藏与隐藏问题

 用SHAppBarMessage函数控制任务栏

一、显示和隐藏任务栏

            要想对任务栏进行操作,首先当然需要获得任务栏的句柄,所以首先利用FindWindow获取句柄,再操作
示例:
1、隐藏任务栏

       hWnd:integer;
       hWnd := FindWindow('Shell_TrayWnd',nil);
       ShowWindow(hWnd,SW_HIDE);
2、显示任务栏
       hWnd:integer;
       hWnd := FindWindow('Shell_TrayWnd',nil);
       ShowWindow(hWnd,SW_SHOW);

二、自动隐藏任务栏和取消自动隐藏任务栏(隐藏与自动隐藏不同自动隐藏是鼠标离开时就隐藏,进入时就显示)
需要利用一个API函数:SHAppBarMessage
WINSHELLAPI UINT APIENTRY SHAppBarMessage( DWORD dwMessage,       PAPPBARDATA pData     ); 

      APPBARDATA结构体

示例:

1、 设置任务栏自动隐藏或者取消自动隐藏

procedure TForm1.AutoHideTaskBar(bHide: BOOL);

const ABM_SETSTATE = 10 ;  // 0x0000000a  必须的,因为Delphi中不存在;

var

    apBar: APPBARDATA;

begin

    apBar.cbSize := sizeof(apBar);

    apBar.hWnd := FindWindow('Shell_TrayWnd', nil);

    if  apBar.hWnd >0  then

    begin

        if (bHide = TRUE) then

            apBar.lParam := ABS_AUTOHIDE //自动隐藏

       else

            apBar.lParam := ABS_ALWAYSONTOP; //取消自动隐藏

       SHAppBarMessage(ABM_SETSTATE, apBar); //设置任务栏自动隐藏

    end;

end;

 

调用: AutoHideTaskBar(True);  //设置为自动隐藏   或者 AutoHideTaskBar(False);  //取消自动隐藏

注意: Delphi的dwMessage的参数中不存在ABM_SETSTATE,而windows的API中存在,其值为0x0000000a  ;

所以在此设置ABM_SETSTATE,并且传入即可。直接使用ABM_SETAUTOHIDEBAR代替ABM_SETSTATE,是不起作用的。 

 

2、判断任务栏是否自动隐藏

function TForm1.IsTaskbarAutoHideOn : boolean;

var

    ABData : TAppBarData;

begin

     ABData.cbSize := sizeof(ABData);

     Result := (SHAppBarMessage(ABM_GETSTATE, ABData) and ABS_AUTOHIDE) > 0;

end;

 

三、API函数SHAppBarMessage的说明:

WINSHELLAPI UINT APIENTRY SHAppBarMessage(

    DWORD dwMessage,   //消息名名

    PAPPBARDATA pData   //AppBarData结构指针

   );参数说明:
dwMessage   可以为下列参数

ABM_ACTIVATE                            通知系统一个 appbar 已经激活;

ABM_GETAUTOHIDEBAR            检索屏幕边缘的 appbar

ABM_GETSTATE                           检索最顶层的Microsoft Windows任务栏的状态

ABM_GETTASKBARPOS               检索Windows任务栏的边界矩形

ABM_NEW                                     注册一个新的appbar,该系统并发送一消息给appbar

ABM_QUERYPOS                           appbar 大小和屏幕位置

ABM_REMOVE                               取消注册一个 appbar,并从系统内部列表移出

ABM_SETAUTOHIDEBAR              在屏幕边缘注册或取消注册自动隐藏appbar

ABM_SETPOS                                 设置appbar 的大小和屏幕位置

//ABM_SETSTATE                             设置appbar为最顶层,设置状态 Delphi中没有

ABM_WINDOWPOSCHANGED        当appbar得状态发送改变时向系统发送消息

pData                            一个APPBARDATA结构体

 

APPBARDATA结构体,结构跟参数说明:

typedef struct _AppBarData { // abd  

    DWORD  cbSize;           // sizeof(APPBARDATA) 

    HWND   hWnd;             // handle of appbar 任务栏句柄、

    UINT   uCallbackMessage; // see below callback指针

    UINT   uEdge;            // see below 边缘的位置

    RECT   rc;               // see below 矩形区域

    LPARAM lParam;           // see below 状态

    ABS_AUTOHIDE;//自动隐藏ABS_ALWAYSONTOP;//取消自动隐藏

} APPBARDATA, *PAPPBARDATA;

 

你可能感兴趣的:(windows,shell,Microsoft,Integer,任务,Delphi)