時計を隠す/表示する
ここでは、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