工作列
Windows 介面包含稱為工作列的特殊應用程式桌面工具列。 您可以使用工作列來執行這類工作,例如在開啟的視窗和啟動新應用程式之間切換。
注意
如需從 Windows 7 開始對工作列所做的變更資訊,請參閱 工作列延伸模組。
本主題包含下列各節。
關於工作列
工作列包含下列專案:
- [開始] 功能表
- 快速啟動列 (Windows Vista 和更早版本)
- 工作列按鈕
- 工具列 (選擇性)
- [通知] 區域
[ 開始 ] 功能表包含可存取程式、檔和設定的命令。 這些命令包括所有程式、檔、主控台、遊戲、說明及支援、關機,以及搜尋程式和檔案。
舊版 Windows 中的 \[開始 \] 包含專案,例如 Find and Run,其功能包含在 Windows Vista 和更新版本中的 搜尋程式和檔案 中。
在 Windows 7 之前的 Windows 版本中提供的 [快速啟動] 列包含應用程式的快捷方式。 Windows 提供預設專案,例如 Windows Internet Explorer,而且使用者可以新增他們選擇的任何進一步快捷方式。 此區域中的圖示會回應單鍵。 在 Windows 7 和更新版本中,此功能會包含在工作列按鈕中。
殼層會在應用程式建立未擁有的視窗時,將按鈕放在工作列上,也就是沒有父系且具有適當擴充樣式位的視窗, (請參閱下方的管理 工作列按鈕) 。 若要切換至視窗,使用者按一下其視窗按鈕。 從 Windows 7 起,這項功能已大幅擴充。 如需詳細資訊,請參閱 工作列延伸模組。
應用程式可以將圖示放在通知區域中,以指出作業的狀態,或通知使用者有關事件。 例如,應用程式可能會將印表機圖示放在通知區域中,以顯示列印工作正在進行中。 不過,在 Windows 7 和更新版本中,通知區域先前所提供的部分資訊應該透過應用程式的工作列按鈕來提供。 如果工作列是水準) ,則通知區域位於任務 (欄的右邊緣,如果工作列是垂直) ,則位於底部 (。 如需詳細資訊,請參閱 通知和通知區域。
如果選取該選項,通知區域也會顯示目前的時間。 此選項會以下列方式找到:
- Windows 7 和更新版本:[通知區域圖示] 主控台應用程式之 [開啟或關閉系統圖示] 頁面中的[時鐘] 下拉式清單, (也可以透過通知區域屬性) 存取。
- Windows Vista:工作列和 [開始功能表] 屬性視窗之 [通知區域] 頁面中的 [時鐘] 核取方塊。
- Windows XP:任務欄和 [開始功能表] 屬性視窗中的 [顯示時鐘] 核取方塊。
使用者可以以滑鼠右鍵按一下工作列以顯示快捷方式功能表。 快捷方式功能表包含用來串聯視窗、堆疊視窗、並排顯示視窗、顯示桌面、啟動工作管理員,以及設定工作列屬性的命令。 快捷方式功能表也會提供選項,從工作列新增或移除一組工具列。 您可以將新的工具列新增至此功能表,方法是在 [CATID_DeskBand] 類別下註冊它們。 如需詳細資訊,請參閱 實作帶狀物件。 請注意,從 Windows 7 起,工作列和通知區域會有個別的快顯功能表。 這些快顯功能表會共用一些選項,例如視窗相片順序,以及新增其他選項。
工作列顯示選項
工作列支援兩個顯示選項:在 Windows Vista 和更早版本中,Always On Top (工作列一律在 Windows 7 和更新版本中處於此模式) 。 若要設定這些選項,使用者必須開啟工作列快捷方式功能表,按一下 [ 屬性],然後選取或清除 [自動隱藏任務 欄] 核取方塊,或 [將工作列保留在其他視窗上方 ] 核取方塊。 若要擷取這些顯示選項的狀態,請使用 ABM_GETSTATE 訊息。 如果您想要在這些顯示選項的狀態變更時收到通知,請在視窗程式中處理 ABN_STATECHANGE 通知訊息。 若要變更這些顯示選項的狀態,請使用 ABM_SETSTATE 訊息。
工作區域是工作列未遮蔽螢幕的部分。 若要擷取工作區域的大小,請使用設定SPI_GETWORKAREA值呼叫SystemParametersInfo函式。 若要擷取描述工作列位置的矩形座標,請使用 ABM_GETTASKBARPOS 訊息。
您可以藉由明確設定視窗矩形的大小等於 SetWindowPos的螢幕大小,來涵蓋工作列。 對於 Windows 2000 系統或更新版本,視窗必須缺少 WS_CAPTION 或 WS_THICKFRAME,否則視窗必須調整大小,讓工作區涵蓋整個螢幕。 此外,對於這些系統來說,如果工作列設定為 Always On Top,它只會在應用程式是前景應用程式時保持隱藏狀態。
將快捷方式新增至 [開始] 功能表
若要將專案新增至 Microsoft Windows NT 4.0、Windows 2000 及更新版本或 Windows 95 或更新版本的[程式] 子功能表,請遵循下列步驟。
- 使用IShellLink介面建立殼層連結。
- 使用 SHGetSpecialFolderLocation取得 Programs 資料夾的 PIDL,傳遞 CSIDL_PROGRAMS。
- 將 Shell 連結新增至 [程式] 資料夾。 您也可以在 [程式] 資料夾中建立資料夾,並將連結新增至該資料夾。
管理工作列按鈕
每當應用程式建立未擁有的視窗時,Shell 就會在工作列上建立按鈕。 若要確保視窗按鈕放置在工作列上,請使用 WS_EX_APPWINDOW 延伸樣式建立未擁有的視窗。 若要防止視窗按鈕放在工作列上,請使用 WS_EX_TOOLWINDOW 延伸樣式建立未擁有的視窗。 或者,您可以建立隱藏視窗,並將此隱藏視窗設為可見視窗的擁有者。
只有當視窗的樣式支援可見的工作列按鈕時,Shell 才會從工作列移除視窗的按鈕。 如果您想要以動態方式將視窗的樣式變更為不支援可見工作列按鈕的視窗,您必須呼叫具有SW_HIDE) 的 ShowWindow,以隱藏視窗第一個 (,變更視窗樣式,然後顯示視窗。
視窗按鈕通常包含應用程式圖示和標題。 不過,如果應用程式未包含系統功能表,則會在沒有圖示的情況下建立視窗按鈕。
如果您想要讓應用程式在視窗未使用時取得使用者的注意,請使用 FlashWindow 函式讓使用者知道訊息正在等候。 此函式會閃爍視窗按鈕。 一旦使用者按一下視窗按鈕來啟動視窗,您的應用程式就可以顯示訊息。
修改工作列的內容
4.71 版和更新版本的 Shell32.dll新增了修改工作列內容的功能。 您現在可以從應用程式新增、移除和啟用工作列按鈕。 啟用專案不會啟動視窗;它會顯示在工作列上按下的專案。
工作列修改功能是在元件物件模型中實作, (COM) 物件 (CLSID_TaskbarList ) 公開 ITaskbarList 介面 (IID_ITaskbarList) 。 您必須呼叫 ITaskbarList::HrInit 方法來初始化物件。 然後,您可以使用 ITaskbarList 介面的 方法來修改工作列的內容。
在通知區域中新增、修改和刪除圖示
使用 Shell_NotifyIcon 函式,從通知區域新增、修改或刪除圖示。 Shell_NotifyIcon的dwMessage參數是工作列的訊息,指定要採取的動作。 pnid參數是NOTIFYICONDATA結構的指標,可用來識別圖示,並傳遞系統處理訊息所需的任何其他資訊。
您可以使用通知區域圖示執行下列動作。
- 若要將圖示新增至工作列的通知區域,請呼叫Shell_NotifyIcon,並將 dwMessage參數設定為 NIM_ADD。 NOTIFYICONDATA結構可用來指定圖示的控制碼和識別碼,以及任何工具提示文字。 如果使用者已在工作列屬性中選取 [ 顯示時鐘 ] 核取方塊,系統會將圖示放在時鐘的左邊。 否則,圖示會出現在右側或工作列底部。 任何現有的圖示會向左移位,讓新圖示有空間。
- 若要修改圖示的資訊,包括圖示控制碼、工具提示文字和回呼訊息識別碼,請呼叫Shell_NotifyIcon,並將 dwMessage設定為 NIM_MODIFY。
- 若要從通知區域刪除圖示,請呼叫 Shell_NotifyIcon , 並將 dwMessage 參數設定為 NIM_DELETE。
當您完成使用者介面作業時,呼叫Shell_NotifyIcon 並將 dwMessage設定為NIM_SETFOCUS,以將焦點傳回通知區域。 例如,當工作列圖示顯示快捷方式功能表時,您可以執行此動作,但使用者按下 ESCAPE 鍵來取消它。
接收通知區域回呼訊息
應用程式通常會將圖示放在工作列的通知區域中,做為狀態指標。 當使用者執行滑鼠動作時,您可以提供其他資訊,例如將滑鼠指標移至圖示上方或按一下圖示。
系統會傳送與特定圖示相關聯的應用程式定義回呼訊息,通知您滑鼠和鍵盤事件。 如此一來,系統可以在使用者按一下圖示或按下按鍵來選取應用程式時通知應用程式。
當您將圖示新增至工作列時,您可以定義圖示的回呼訊息。 回呼訊息識別碼是在以 NIM_ADD傳遞之NOTIFYICONDATA結構的uCallbackMessage成員中指定。 事件發生時,系統會將回呼訊息傳送至 hWnd 成員所指定視窗的視窗程式。 訊息的 wParam 參數包含發生事件之工作列圖示的識別碼。 lParam參數會保存與事件相關聯的滑鼠或鍵盤訊息。 例如,當滑鼠指標移至工作列圖示時, lParam 會包含 WM_MOUSEMOVE。
各種滑鼠事件的結果可以摘要如下:
- 當使用者將滑鼠指標移至圖示上方時,系統會顯示 NOTIFYICONDATA中指定的工具提示文字。
- 當使用者按一下圖示時,您的應用程式會收到 WM_LBUTTONDOWN 通知。
- 當使用者以滑鼠右鍵按一下圖示時,您的應用程式會收到 WM_RBUTTONDOWN 通知。
- 當使用者按兩下圖示時,您的應用程式會收到 WM_LBUTTONDBLCLK 通知。
一般而言,按一下圖示會導致應用程式顯示具有其他資訊的視窗、以滑鼠右鍵按一下顯示快捷方式功能表,然後按兩下會執行預設快捷方式功能表命令。
如需如何變更與通知區域圖示相關聯之工具提示文字的範例,請參閱 狀態列圖示的批註工具提示。
Shell 控制碼的版本 5.0 和更新版本Shell_NotifyIcon滑鼠和鍵盤事件,與 Windows NT 4.0、Windows 95 和 Windows 98 上找到的舊版 Shell 事件不同。 差異如下:
- 如果使用者使用鍵盤要求通知圖示的快捷方式功能表,5.0 版 Shell 會將相關聯的應用程式傳送 WM_CONTEXTMENU 訊息。 舊版會傳送 WM_RBUTTONDOWN 和 WM_RBUTTONUP 訊息。
- 如果使用者選取具有鍵盤的通知圖示,並使用空格鍵或 ENTER 鍵加以啟用,5.0 版殼層會將相關聯的應用程式傳送 NIN_KEYSELECT 通知。 舊版會傳送 WM_RBUTTONDOWN 和 WM_RBUTTONUP 訊息。
- 如果使用者選取具有滑鼠的通知圖示,並使用 ENTER 鍵加以啟用,則 5.0 版 Shell 會將相關聯的應用程式傳送 NIN_SELECT 通知。 舊版會傳送 WM_RBUTTONDOWN 和 WM_RBUTTONUP 訊息。
- 如果使用者將滑鼠指標傳遞至與批註方塊工具提示相關聯的圖示上方,6.0 殼層 (Windows XP) 會傳送下列訊息。
-
- NIN_BALLOONSHOW - 當批註方塊顯示 (方塊排入佇列時傳送) 。
- NIN_BALLOONHIDE - 當氣球消失時傳送,例如刪除圖示時。 如果因逾時或按一下滑鼠而關閉方塊,則不會傳送此訊息。
- NIN_BALLOONTIMEOUT - 因逾時而關閉批註方塊時傳送。
- NIN_BALLOONUSERCLICK - 因為按一下滑鼠而關閉方塊時傳送。
-
您可以藉由呼叫將 dwMessage設定為NIM_SETVERSION 的 dwMessage呼叫 Shell_NotifyIcon,以選取殼層應該以何種方式運作。 設定NOTIFYICONDATA結構的uVersion成員,以指出您想要 5.0 版或版本 5.0 的行為。
工作列建立通知
使用 Microsoft Internet Explorer 4.0 和更新版本,Shell 會通知應用程式已建立工作列。 建立工作列時,它會向 TaskbarCreated 字串註冊訊息,然後將此訊息廣播至所有最上層視窗。 當您的工作列應用程式收到此訊息時,應該假設已移除它新增的任何工作列圖示,並再次新增它們。 這項功能通常只適用于殼層啟動時已在執行的服務。 下列範例示範處理此案例的簡化方法。
在Windows 10上,工作列也會在主要顯示器的 DPI 變更時廣播此訊息。
LRESULT CALLBACK WndProc(HWND hWnd,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
static UINT s_uTaskbarRestart;
switch(uMessage)
{
case WM_CREATE:
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
break;
default:
if(uMessage == s_uTaskbarRestart)
AddTaskbarIcons();
break;
}
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
使用工作列
本節包含示範如何將圖示新增至工作列通知區域的範例,以及如何處理工作列圖示的回呼訊息。
在通知區域中新增和刪除工作列圖示
您可以填入NOTIFYICONDATA結構,然後將結構傳遞至Shell_NotifyIcon,並將 dwMessage設定為NIM_ADD,將圖示新增至工作列通知區域。 結構成員必須指定加入圖示之視窗的控制碼,以及圖示識別碼和圖示控制碼。 您也可以指定圖示的工具提示文字。 如果您需要接收圖示的滑鼠訊息,請指定系統應該用來將訊息傳送至視窗程式的回呼訊息識別碼。
下列範例中的 函式示範如何將圖示新增至工作列。
// MyTaskBarAddIcon - adds an icon to the notification area.
// Returns TRUE if successful, or FALSE otherwise.
// hwnd - handle to the window to receive callback messages
// uID - identifier of the icon
// hicon - handle to the icon to add
// lpszTip - tooltip text
BOOL MyTaskBarAddIcon(HWND hwnd, UINT uID, HICON hicon, LPSTR lpszTip)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = MYWM_NOTIFYICON;
tnid.hIcon = hicon;
if (lpszTip)
hr = StringCbCopyN(tnid.szTip, sizeof(tnid.szTip), lpszTip,
sizeof(tnid.szTip));
// TODO: Add error handling for the HRESULT.
else
tnid.szTip[0] = (TCHAR)'\0';
res = Shell_NotifyIcon(NIM_ADD, &tnid);
if (hicon)
DestroyIcon(hicon);
return res;
}
若要從工作列通知區域刪除圖示,請填入NOTIFYICONDATA結構,並呼叫Shell_NotifyIcon,並將 dwMessage設定為NIM_DELETE。 刪除工作列圖示時,請只指定 結構的 cbSize、 hWnd和 uID 成員。 例如:
// MyTaskBarDeleteIcon - deletes an icon from the notification area.
// Returns TRUE if successful, or FALSE otherwise.
// hwnd - handle to the window that added the icon.
// uID - identifier of the icon to delete.
BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
res = Shell_NotifyIcon(NIM_DELETE, &tnid);
return res;
}
接收滑鼠事件
如果您指定工作列圖示的回呼訊息,則每當圖示周框內發生滑鼠事件時,系統就會將訊息傳送至您的應用程式。 訊息的 wParam 參數會指定工作列圖示的識別碼,而訊息的 lParam 參數會指定系統產生為滑鼠事件結果的訊息。
下列範例中的函式來自將電池和印表機圖示新增至工作列的應用程式。 應用程式在收到回呼訊息時呼叫 函式。 函式會判斷使用者是否已按一下其中一個圖示,如果按一下發生,則會呼叫應用程式定義的函式來顯示狀態資訊。
// On_MYWM_NOTIFYICON - processes callback messages for taskbar icons.
// wParam - first message parameter of the callback message.
// lParam - second message parameter of the callback message.
void On_MYWM_NOTIFYICON(WPARAM wParam, LPARAM lParam)
{
UINT uID;
UINT uMouseMsg;
uID = (UINT) wParam;
uMouseMsg = (UINT) lParam;
if (uMouseMsg == WM_LBUTTONDOWN)
{
switch (uID)
{
case IDI_MYBATTERYICON:
// The user clicked the battery icon. Display the
// battery status.
ShowBatteryStatus();
break;
case IDI_MYPRINTERICON:
// The user clicked the printer icon. Display the
// status of the print job.
ShowJobStatus();
break;
default:
break;
}
}
return;
}