時計を隠す/表示する
ここでは、3種類のウィンドウを使用します。タスクバーという1つのメインウィンドウと、タスクバーの通知領域という子ウィンドウ、さらに時計という孫ウィンドウです。
時計は通知領域の内部にあり、通知領域はタスクバーの内部にあります。FindWindow APIを使ってタスクバーウィンドウ(Shell_TrayWnd)へのハンドルを取得し、それからFindWindowEx APIを使って通知領域(Tray_NotifyWnd)とその子ウィンドウである時計(TrayClockWClass)を取得する必要があります。時計ウィンドウへのハンドルが得られたら、ShowWindow APIを使用します。ShowWindowに値1を与えると時計ウィンドウが表示され、値0を与えると時計ウィンドウが隠されます。Show Clockという名前のボタンに次のコードを追加してください。
Private Sub btnClock_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnClock.Click
Select Case btnClock.Text
Case "Show Clock" 'If Hidden
Dim TaskBarWin As Long, TrayWin As Long, ClockWin As Long
'Find TaskBar
TaskBarWin = FindWindow("Shell_TrayWnd", vbNullString)
'Find Tray Window
TrayWin = FindWindowEx(TaskBarWin, 0, "TrayNotifyWnd", vbNullString)
'Find Clock Window
ClockWin = FindWindowEx(TrayWin, 0, "TrayClockWClass", vbNullString)
ShowWindow(ClockWin, 1) 'Show Clock
btnClock.Text = "Hide Clock"
Case "Hide Clock" 'If Shown
Dim TaskBarWin As Long, TrayWin As Long, ClockWin As Long
TaskBarWin = FindWindow("Shell_TrayWnd", vbNullString)
TrayWin = FindWindowEx(TaskBarWin, 0, "TrayNotifyWnd", vbNullString)
ClockWin = FindWindowEx(TrayWin, 0, "TrayClockWClass", vbNullString)
ShowWindow(ClockWin, 0) 'Hide Clock
btnClock.Text = "Show Clock"
End Select
End Sub
このコードではボタンのテキスト値を調べます。それがShow Clockなら時計が表示され、そうでなければ時計が隠されます。ボタンに表示される初期テキストはShow Clockなので、このボタンを2回クリックする必要があるかもしれません。このアプリケーションをいま実行すれば、図2のように時計がいったん消えて、また現れるでしょう。

タスクバーを固定/固定解除する
ここでもFindWindow APIを使用します。外部ウィンドウを参照する場合には、”必ずFindWindow APIを使用する”ことを忘れないでください。
Shell_TrayWnd(タスクバー)のハンドルを取得したら、システムに適切なメッセージを送る必要があります。このメッセージでは、何をすべきかをシステムに指示します。外部ウィンドウにメッセージを送るときは、PostMessage APIを使用できます。
PostMessageでは、メッセージの送信先ウィンドウ、メッセージのタイプ、メッセージ自体、および追加のパラメータを指定する必要があります。この場合、固定/固定解除のメッセージを目的のウィンドウに送るだけで、追加の情報はありません。コードは次のとおりです。
Private Sub btnLock_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnLock.Click
Dim TaskBarWin As Long
'Find TaskBar
TaskBarWin = FindWindow("Shell_TrayWnd", vbNullString)
'Lock TaskBar
PostMessage(TaskBarWin, WM_COMMAND, 424, vbNullString)
End Sub
