利用Delphi全面控制Windows任務(wù)欄

字號(hào):

使用Windows95/NT/98操作系統(tǒng)的用戶知道:Windows正常啟動(dòng)后,在電腦屏幕下方出現(xiàn)一塊 任務(wù)欄。從系統(tǒng)功能角度而言,整個(gè)任務(wù)欄包括幾個(gè)不同的子區(qū)域,從左至右依次是:開(kāi)始 按鈕、應(yīng)用程序切換區(qū)(Application Switch Bar)、任務(wù)欄通知區(qū)(Notification Area)以 及任務(wù)欄時(shí)鐘。與其它Windows應(yīng)用程序相同,任務(wù)欄程序(systray.exe)由幾個(gè)不同的窗體 組成,這些窗體是具有各自的窗口類名、顯示方式等信息。因此,只要得到有關(guān)窗口信息, 即可通過(guò)編程全面控制Windows任務(wù)欄的不同區(qū)域。
    1. 編程思想
    (1)任務(wù)欄窗體的窗口信息為:
    ①任務(wù)欄的窗口類名是:ShellTrayWnd。
    ②開(kāi)始按鈕的窗口類名是:Button。
    ③應(yīng)用程序切換區(qū)的窗口類名是:ReBarWindow32。
    ④任務(wù)欄通知區(qū)的窗口類名是:TrayNotifyWnd。
    ⑤任務(wù)欄時(shí)鐘的窗口類名是:TrayClockWClass。
    (2)調(diào)用FindWindow函數(shù)得到任務(wù)欄的窗口句柄。
    (3)調(diào)用FindWindowEx函數(shù)得到任務(wù)欄各子區(qū)域的窗口句柄。
    (4)根據(jù)窗口句柄,調(diào)用ShowWindow函數(shù)控制任務(wù)欄各區(qū)域顯示或隱藏 (show/hide);調(diào)用En ableWindow函數(shù)控制任務(wù)欄各區(qū)域有效或無(wú)效(enabled/disabled)。
    2. 編程方法
    (1)在Delphi3.0 IDE中新建工程Project1, Project1中包含F(xiàn)orm1, 窗體如下圖所示:
    (2)定義窗口句柄數(shù)組:Wnd:array[0..4] of THandle;
    (3)GetHandles過(guò)程代碼如下:
    procedure TForm1.GetHandles;
    begin
    //得到Tray Bar的窗口句柄;
    Wnd[0]:=FindWindow(′ShellTrayWnd′,nil);
    //得到開(kāi)始按鈕的窗口句柄;
    Wnd[1]:=FindWindow(′ShellTrayWnd′,nil);
    Wnd[1]:=FindWindowEx(Wnd[1],HWND(0),′Button′,nil); //得到應(yīng)用程序切換區(qū)的窗口句柄;
    Wnd[2]:=FindWindow(′ShellTrayWnd′,nil);
    Wnd[2]]:=FindWindowEx(Wnd[2],HWND(0),′ReBarWindow32′,nil);
    //得到任務(wù)欄通知區(qū)的窗口句柄;
    Wnd[3]:=FindWindow(′ShellTrayWnd′,nil);
    Wnd[3]:=FindWindowEx(Wnd[3],HWND(0),′TrayNotifyWnd′,nil);
    //得到任務(wù)欄時(shí)鐘的窗口句柄;
    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過(guò)程代碼如下:
    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;