SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

タスクバーとVB.NET

VB.NETプログラムでタスクバーを自由に設定しよう

  • X ポスト
  • このエントリーをはてなブックマークに追加

同類のタスクバーウィンドウをグループ化/グループ化解除する

 この設定はAPIだけで完全に処理されるわけではありません。この設定は実際には次のレジストリキーの下に格納されています。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\
Explorer\Advanced

 設定名はTaskBarGlommingです。値が0ならボタンのグループ化が解除され、1ならボタンがグループ化されます。従って、やるべきことは、このキーに1または0を書き込んでから、タスクバーウィンドウの表示を更新することです。これを行わないと、「explorer.exe」の再起動(コンピュータの再起動)まで、この設定は適用されません。タスクバーを更新するには、SendMessage APIを使用し、WM_WININIChangeメッセージをShellTrayWndに送信します。コードは次のようになります。

Private Sub btnGroup_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGroup.Click
Select Case btnGroup.Text
Case "Group Similar TaskBar Buttons"
Dim GroupRet As Long 'Used With SendMessage
Dim TaskBarWin As Long

'Find TaskBar
TaskBarWin = FindWindow("Shell_TrayWnd", vbNullString)

'Open Registry Key
Dim GroupKey As RegistryKey = _
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows _
\\CurrentVersion\\Explorer\\Advanced", True)

'Set Grouping On
GroupKey.SetValue("TaskBarGlomming", 1, RegistryValueKind.DWord)
'Store New Setting
GroupRet = SendMessage(TaskBarWin, WM_WININICHANGE, 0&, 0&)
btnGroup.Text = "Don't Group Similar TaskBar Buttons"
Case "Don't Group Similar TaskBar Buttons"
Dim GroupRet As Long
Dim TaskBarWin As Long

TaskBarWin = FindWindow("Shell_TrayWnd", vbNullString)

Dim GroupKey As RegistryKey = _
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows _
\\CurrentVersion\\Explorer\\Advanced", True)

'Set Grouping Off
GroupKey.SetValue("TaskBarGlomming", 0, RegistryValueKind.DWord)
GroupRet = SendMessage(TaskBarWin, WM_WININICHANGE, 0&, 0&)
btnGroup.Text = "Group Similar TaskBar Buttons"
End Select
End Sub

タスクバーのアクティブなウィンドウを隠す/表示する

 この操作の全体的なロジックは、前述の時計を隠す/表示する場合とほとんど同じです。ただし、幸いなことにタスクバーウィンドウと"Buttons"ウィンドウ(ReBarWindow32)だけを扱えば済みます。

 従って、やるべきことは、ReBarWindow32へのハンドルを取得してから、ShowWindow APIを使って開いているアクティブなウィンドウのボタンを隠す/表示することです。

Private Sub btnContents_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnContents.Click
Select Case btnContents.Text
Case "Show TaskBar Contents"
Dim TaskBarWin As Long, TaskButtonWin As Long

'Find TaskBar
TaskBarWin = FindWindow("Shell_TrayWnd", vbNullString)
'Find TaskBar Button Area
TaskButtonWin = _
FindWindowEx(TaskBarWin, 0, "ReBarWindow32", vbNullString)
ShowWindow(TaskButtonWin, 1) 'Show Active Buttons
btnContents.Text = "Hide TaskBar Contents"

Case "Hide TaskBar Contents"
Dim TaskBarWin As Long, TaskButtonWin As Long

TaskBarWin = FindWindow("Shell_TrayWnd", vbNullString)
TaskButtonWin = _
FindWindowEx(TaskBarWin, 0, "ReBarWindow32", vbNullString)
ShowWindow(TaskButtonWin, 0) 'Hide Active Buttons
btnContents.Text = "Show TaskBar Contents"

End Select
End Sub

 このボタンをクリックすると、開いているウィンドウの数にかかわらずタスクバーが空になり、図3のようになります。

図3 空になったタスクバー
図3 空になったタスクバー

アクティブでないアイコンを隠す設定をアクティブ/非アクティブにする

 次のコードセグメントから分かるように、基本的な仕組みはタスクバーのグループ化設定とまったく同じです。

Private Sub btnInactiveTrayIcons_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnInactiveTrayIcons.Click
Select Case btnInactiveTrayIcons.Text
Case "AutoHide Inactive Tray Icons Off"
Dim TrayWinRet As Long
Dim TrayWindow As Long

'Find TaskBar
TrayWindow = FindWindow("Shell_TrayWnd", vbNullString)

Dim InactiveKey As RegistryKey = _
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows _
\\CurrentVersion\\Explorer\\Advanced", True)

'Set Enable AutoTray Off
InactiveKey.SetValue("EnableAutoTray", 0, RegistryValueKind.DWord)
'Store
TrayWinRet = SendMessage(TrayWindow, WM_WININICHANGE, 0&, 0&)
btnInactiveTrayIcons.Text = "AutoHide Inactive Tray Icons On"

EnvRefresh() 'Refresh Explorer.exe
Case "AutoHide Inactive Tray Icons On"
Dim TrayWinRet As Long
Dim TrayWindow As Long

TrayWindow = FindWindow("Shell_TrayWnd", vbNullString)

Dim InactiveKey As RegistryKey = _
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows _
\\CurrentVersion\\Explorer\\Advanced", True)

'Set Enable AutoTray On
InactiveKey.SetValue("EnableAutoTray", 1, RegistryValueKind.DWord)
TrayWinRet = SendMessage(TrayWindow, WM_WININICHANGE, 0&, 0&)
btnInactiveTrayIcons.Text = "AutoHide Inactive Tray Icons Off"

EnvRefresh()
End Select
End Sub

EnvRefresh

 上記のコードセグメントの最後の行では、EnvRefreshという関数を呼び出しています。この関数は次のようなものです。

Public Sub EnvRefresh() ' Refresh Explorer
Dim EnvResult As IntPtr 'Result
SendMessageTimeout(HWND_BROADCAST, _
Convert.ToUInt32(WM_SETTINGCHANGE), _
0, 0, _
Convert.ToUInt32(SMTO_ABORTIFHUNG), _
Convert.ToUInt32(2000), _
EnvResult) 'Broadcast A Setting Change To All
End Sub

 これをフォームのクラスに追加してください。この関数の役割は、コンピュータを再起動せずに、変更したレジストリ設定を適用することです。この関数はSendMessageTimeout APIを使って、すべてのWM_SETTINGCHANGEメッセージをブロードキャストします。何かまずいことがあれば異常終了し、そうでなければ2秒以内に「explorer.exe」に対して変更内容の適用を試みます。

次のページ
タスクバーを自動的に隠す設定とタスクバーを他のウィンドウの手前に表示する設定を適用する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Hannes du Preez(Hannes du Preez)

プログラミングトレーナー。プログラミングを最大の趣味とする。Visual Basic 5からプログラミングを始め、Visual Basic 6.0、Visual C++ 6.0、Visual Basic .NETでアプリケーションを開発。プログラミングの知識はすべて独学によるもので、CodeGuru...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3473 2009/02/10 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング