zoukankan      html  css  js  c++  java
  • 全面控制Windows任务栏

    使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块 任务栏。从系统功能角度而言,整个任务栏包括几个不同的子区域,从左至右依次是:开始 按钮、应用程序切换区(Application Switch Bar)、任务栏通知区(Notification Area)以 及任务栏时钟。与其它Windows应用程序相同,任务栏程序(systray.exe)由几个不同的窗体 组成,这些窗体是具有各自的窗口类名、显示方式等信息。因此,只要得到有关窗口信息, 即可通过编程全面控制Windows任务栏的不同区域。

    任务栏按钮没有句柄的,只能取按钮ID后,通过消息来隐藏,这是任务栏结构

    Shell_TrayWnd
         |- Button
         |- TrayNotifyWnd
         |        |- TrayClockWClass
         |        \- ToolbarWindow32
         \- ReBarWindow32
                  |- MSTaskSwWClass
                  |         \- SysTabControl32
                  \- ToolbarWindow32

    任务栏换栏是 SysTabControl32类的,只有依次取得上级窗口句柄才能逐次取得SysTabControl32
    的句柄,然后通过消息取按钮id,但不知为什么取到ReBarWindow32的句柄后,始终无法取得MSTaskSwWClass
    类控件的句柄,所以无法取SysTabControl32的句柄,哪位高手研究一下.

    通过ShowWindow来隐藏窗口的任务栏图标是不持久的。某些动作会使任务栏图标重现。你可以将隐藏的应用程序窗口设为

    Tool Window来移走程序的任务栏图标而避免它再次出现。Tool windows永远不会有任务栏图标。 使应用程序窗口成为一个Tool

    Window有一个副作用:当用户按下Alt-TAB时它将不在程序列表中出现。你可以调用API函数GetWindowLong和SetWindowLong来使

    应用程序窗口成为一个Tool Window。

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);
            dwExStyle |= WS_EX_TOOLWINDOW;
            SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);
            try
            {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
            }
            catch (Exception &exception)
            {
                 Application->ShowException(&exception);
            }
            return 0;
    }

           1. 编程思想

           (1)任务栏窗体的窗口信息为:

           ①任务栏的窗口类名是:ShellTrayWnd。

           ②开始按钮的窗口类名是:Button。

           ③应用程序切换区的窗口类名是:ReBarWindow32。

           ④任务栏通知区的窗口类名是:TrayNotifyWnd。

           ⑤任务栏时钟的窗口类名是:TrayClockWClass。

           (2)调用FindWindow函数得到任务栏的窗口句柄。

           (3)调用FindWindowEx函数得到任务栏各子区域的窗口句柄。

           (4)根据窗口句柄,调用ShowWindow函数控制任务栏各区域显示或隐藏        (show/hide);调用En ableWindow函数控制任务栏各区域有效或无效(enabled/disabled)。

           2. 编程方法

           (1)在Delphi3.0 IDE中新建工程Project1, Project1中包含Form1, 窗体如下图所示:

           (2)定义窗口句柄数组:Wnd:array[0..4] of THandle;

           (3)GetHandles过程代码如下:

    procedure TForm1.GetHandles;

    begin

    //得到Tray Bar的窗口句柄;

    Wnd[0]:=FindWindow(′ShellTrayWnd′,nil);

    //得到开始按钮的窗口句柄;

    Wnd[1]:=FindWindow(′ShellTrayWnd′,nil);

    Wnd[1]:=FindWindowEx(Wnd[1],HWND(0),′Button′,nil);

    //得到应用程序切换区的窗口句柄;

    Wnd[2]:=FindWindow(′ShellTrayWnd′,nil);

    Wnd[2]]:=FindWindowEx(Wnd[2],HWND(0),′ReBarWindow32′,nil);

    //得到任务栏通知区的窗口句柄;

    Wnd[3]:=FindWindow(′ShellTrayWnd′,nil);

    Wnd[3]:=FindWindowEx(Wnd[3],HWND(0),′TrayNotifyWnd′,nil);

    //得到任务栏时钟的窗口句柄;

    Wnd[4]:=FindWindow(′ShellTrayWnd′,nil);

    Wnd[4]:=FindWindowEx(Wnd[4],HWND(0),′TrayNotifyWnd′,nil);

    Wnd[4]:=FindWindowEx(Wnd[4],HWND(0),′TrayCLockWClass′,nil);

    end;

           (4)EnableOrDisable过程代码如下:

    procedure TForm1.EnableOrDisable(Sender:TOBject);

    begin

    GetHandles;

    if TCheckBox(Sender). Checked then

    case TCheckBox(Sender). Tag of

    0: EnableWindow(Wnd[0], False);

    1: EnableWindow(Wnd[1], False);

    2: EnableWindow(Wnd[2], False);

    3: EnableWindow(Wnd[3], False);

    4: EnableWindow(Wnd[4], False);

    end

    else

    case TCheckBox(Sender). Tag of

    0: EnableWindow(Wnd[0], True);

    1: EnableWindow(Wnd[1], True);

    2: EnableWindow(Wnd[2], True);

    3: EnableWindow(Wnd[3], True);

    4: EnableWindow(Wnd[4], True);

    end;

    end;

           (5)HideOrShow过程代码如下:

    procedure TForm1.HideOrShow(Sender:TObject);

    begin

    GetHandles;

    if TCheckBox(Sender). Checked then

    case TCheckBox(Sender). Tag of

    0: ShowWindow(Wnd[0],SWHIDE);

    1: ShowWindow(Wnd[1],SWHIDE);

    2: ShowWindow(Wnd[2],SWHIDE);

    3: ShowWindow(Wnd[3],SWHIDE);

    4: ShowWindow(Wnd[4],SWHIDE);

    end

    else

    case TCheckBox(Sender). Tag of

    0: ShowWindow(Wnd[0],SWShow);

    1: ShowWindow(Wnd[1],SWShow);

    2: ShowWindow(Wnd[2],SWShow);

    3: ShowWindow(Wnd[3],SWShow);

    4: ShowWindow(Wnd[4],SWShow);

    end;

    end;

           (6)FormClose事件代码如下://将Windows任务栏恢复到正常状态;

    procedure TForm1.FormClose(Sender:TObject; var Action: TCloseAction);

    var i:Integer;

    begin

    for i:=0 to 4 do

    begin

    EnableWindow(Wnd[i],True);

    ShowWindow(Wnd[i],SWShow);

    end;

    end;

           (7)按F9运行程序。以上程序在Delphi3.0/4.0、Windows95/98简体中文版环境下调试通过。

  • 相关阅读:
    Maven下java.lang.NoClassDefFoundError
    FastDFS的配置、部署与API使用解读(5)FastDFS配置详解之Tracker配置(转)
    FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置(转)
    FastDFS的配置、部署与API使用解读(3)以流的方式上传文件的客户端代码(转)
    FastDFS的配置、部署与API使用解读(2)以字节方式上传文件的客户端代码(转)
    FastDFS的配置、部署与API使用解读(1)Get Started with FastDFS(转)
    软件测试全景图(转)
    让Quality Center走下神坛--测试管理工具大PK(转)
    测试管理杂谈之理论篇(转)
    管理杂谈之理论篇(转)
  • 原文地址:https://www.cnblogs.com/absolute8511/p/1649703.html
Copyright © 2011-2022 走看看