デベロッパー

デベロッパー

タスクバーとVB.NET

Hannes du Preez
2009年3月3日 / 10:00
 
 

はじめに

 数日前、ある学生に尋ねられました。VB.NETプログラムからタスクバーを操作することは可能かどうかと。そこで私はその学生のためにこのサンプルアプリケーションを作成することにしました。この記事では、タスクバーの大部分の設定を操作できるアプリケーションの作成方法を示します。ここで扱う機能は次のとおりです。

  • 時計を隠す
  • タスクバーを固定する
  • 同類のタスクバーボタンをグループ化する
  • タスクバーの内容(アクティブなウィンドウのボタン)を隠す
  • アクティブでないトレイアイコンを自動的に隠す
  • タスクバーを自動的に隠す
  • タスクバーを他のウィンドウの手前に表示する
  • スタートボタンを無効にする
  • スタートボタンのテキストを変更する
  • タスクバーのプロパティを表示する
  • デスクトップ機能を表示する

デザイン

 今回は図1のようなフォームをデザインしました。ボタンの名前は自分にとって分かりやすいものに変更するとよいでしょう。

図1 デザイン
図1 デザイン

コーディング

 コードウィンドウの冒頭に次のImportを追加してください。この記事全体でいくつかのレジストリ機能を使用するからです。

Imports Microsoft.win32 'Registry Functions
Imports System.Runtime.InteropServices 'API functions
 曖昧さを避けるため、私はすべてのAPIとそれらに関連する定数から始めることにしました。下記のコードをコードウィンドウに追加してください。

'Find External Window
Private Declare Function FindWindow Lib "user32.dll" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Int32

'Find Child Window Of External Window
Private Declare Function FindWindowEx Lib "user32.dll" Alias _
"FindWindowExA" (ByVal hWnd1 As Int32, _
ByVal hWnd2 As Int32, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Int32

'Show A Window
Private Declare Function ShowWindow Lib "user32.dll" _
(ByVal hwnd As Int32, _
ByVal nCmdShow As Int32) As Int32

'Post Message To Window
Private Declare Function PostMessage Lib "user32.dll" Alias _
"PostMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, _
ByVal wParam As Int32, _
ByVal lParam As Int32) As Int32

'Enable A Window
Private Declare Function EnableWindow Lib "user32.dll" _
(ByVal hwnd As Int32, ByVal fEnable As Int32) As Int32

'SendMessage lParam = String
Private Declare Function SendMessageSTRING Lib _
"user32.dll" Alias "SendMessageA" _
(ByVal hwnd As Int32, _
ByVal wMsg As Int32, _
ByVal wParam As Int32, _
ByVal lParam As String) As Int32

'Send Message & Wait
Declare Auto Function SendMessageTimeout Lib "User32" ( _
ByVal hWnd As Integer, _
ByVal Msg As UInt32, _
ByVal wParam As Integer, _
ByVal lParam As Integer, _
ByVal fuFlags As UInt32, _
ByVal uTimeout As UInt32, _
ByRef lpdwResult As IntPtr _
) As Long

'Normal SendMessage
Private Declare Function SendMessage Lib "user32.dll" _
Alias "SendMessageA" _
(ByVal hwnd As Int32, _
ByVal wMsg As Int32, _
ByVal wParam As Int32, _
ByVal lParam As Int32) As Int32

'Get Handle To Desktop
Private Declare Function GetDesktopWindow Lib "user32" () As IntPtr

Private Const WM_WININICHANGE = &H1A 'INI File Update
Private Const HWND_BROADCAST = &HFFFF& 'Send To All
Private Const WM_SETTINGCHANGE = &H1A 'Setting Change
Private Const SMTO_ABORTIFHUNG = &H2 'Stop If Hang
Private Const WM_COMMAND As Int32 = &H111 'Send Command
Private Const WM_USER As Int32 = &H400 'User
Private Const WM_SETTEXT = &HC 'Change Text
Private Const WM_GETTEXT = &HD 'Get Text
 コメントを読めば、それぞれのAPIの機能がどのようなものか概ね分かるはずです。APIを初めてみる方には、この記事を読むようお勧めします。もちろん、本稿でも詳しい説明を行います。

時計を隠す/表示する

 ここでは、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のように時計がいったん消えて、また現れるでしょう。

図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

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

 この設定は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」に対して変更内容の適用を試みます。

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

 ここでは、この2つのタスクバープロパティによって、今までに慣れたものとは違う方法をとることにしました。というのも、コードでデスクトップツールバーオブジェクトを作成し、それをタスクバーの場合と同じやり方で操作できるからです。タスクバーを右クリックして、新規ツールバーの作成を選択すれば、それは通常のコンピュータユーザーにとってデスクトップツールバーを意味します。プログラマは、このデスクトップツールバーを「アプリケーションバー(AppBar)」と呼びます。アプリケーションバーはタスクバーと同じ機能を持っており、ボタンとメニューを収容したり、隠したり、サイズを変更したり、移動したりすることができます。

 作業を楽にするため、新しいアプリケーションバークラスを作成することにしました。このクラスは新しいクラスとして追加することも、フォームのクラスの中に入れることもできます。どちらにしても、「TBAppBar」のような分かりやすい名前を付け、そこに次のコードを追加してください。

Public Class TBAppBar

'Get Message Sent By App Bar
Private Declare Function GetAppBarMessage Lib "shell32" _
Alias "SHAppBarMessage" _
(ByVal dwMessage As Integer, _
ByRef pData As APPBARDATA) = As Integer

'Send Message To App BAr
Private Declare Function SetAppBarMessage Lib "shell32" _
Alias "SHAppBarMessage" _
(ByVal dwMessage As Integer, _
ByRef pData As APPBARDATA) As Integer

'AppBar Structure
Private Structure APPBARDATA
Dim cbSize As Integer
Dim hwnd As Integer
Dim uCallbackMessage As Integer
Dim uEdge As Integer
Dim rc As Rectangle
Dim lParam As Integer
End Structure

'Get Current State
Private Const ABM_GETSTATE As Int32 = &H4
'Get TaskBar Position
Private Const ABM_GETTASKBARPOS As Int32 = &H5
'Apply Setting(s)
Private Const ABM_SETSTATE As Int32 = &HA
'Autohide
Private Const ABS_AUTOHIDE As Int32 = &H1
'Always on Top
Private Const ABS_ALWAYSONTOP As Int32 = &H2

Private TBAppBAutoHide As Boolean
Private TBAppBarAlwaysOnTop As Boolean

Public Sub New()
Me.GetState() 'Get Current State
End Sub

Private Sub GetState()

'What Setting?
Dim AppBarSetting As New APPBARDATA

'Initialise
AppBarSetting.cbSize = Marshal.SizeOf(AppBarSetting)

'Get Current State
Dim AppBarState As Int32 = _
GetAppBarMessage(ABM_GETSTATE, AppBarSetting)

Select Case AppBarState

'Nothing Set
Case 0
TBAppBAutoHide = False
TBAppBarAlwaysOnTop = False

'Always On Top
Case ABS_ALWAYSONTOP
TBAppBAutoHide = False
TBAppBarAlwaysOnTop = True

Case Else
'AutoHide
TBAppBAutoHide = True

End Select

End Sub

'Apply Settings
Private Sub SetState()

'Setting We Want To Apply
Dim AppBarSetting As New APPBARDATA
'Initialise
AppBarSetting.cbSize = Marshal.SizeOf(AppBarSetting)

If Me.AutoHide Then
AppBarSetting.lParam = ABS_AUTOHIDE 'AutoHide
End If

'Always On Top
If Me.AlwaysOnTop Then
AppBarSetting.lParam = AppBarSetting.lParam Or ABS_ALWAYSONTOP
End If

SetAppBarMessage(ABM_SETSTATE, AppBarSetting)

End Sub

Public Property AutoHide() As Boolean 'Autohide
Get
Return TBAppBAutoHide
End Get
Set(ByVal Value As Boolean)
TBAppBAutoHide = Value
Me.SetState()
End Set
End Property

Public Property AlwaysOnTop() As Boolean 'Always On Top
Get
Return TBAppBarAlwaysOnTop
End Get
Set(ByVal Value As Boolean)
TBAppBarAlwaysOnTop = Value
Me.SetState()
End Set
End Property

End Class

用法

 フォームクラス内に新しいTBAppBarオブジェクトを作成することを忘れないでください。

Private AB As New TBAppBar 'AppBar Object
 この2つのフォームボタンに次のコードを追加して、TBAppBarクラスの該当するプロパティを適用します。

Private Sub btnAutoHide_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnAutoHide.Click

Select Case btnAutoHide.Text
Case "Auto Hide TaskBar"
btnAutoHide.Text = "Auto Hide TaskBar Off"
AB.AutoHide = True 'Set AutoHide On
Case "Auto Hide TaskBar Off"
btnAutoHide.Text = "Auto Hide TaskBar"
AB.AutoHide = False 'Set AutoHide Off
End Select
End Sub

Private Sub btnTop_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnTop.Click
Select Case btnTop.Text
Case "Keep TaskBar on Top"
AB.AlwaysOnTop = True 'Set Always On Top On
btnTop.Text = "Don't Keep TaskBar on Top"
Case "Don't Keep TaskBar on Top"
AB.AlwaysOnTop = False 'Set Always On Top Off
btnTop.Text = "Keep TaskBar on Top"
End Select
End Sub
 このアプリケーションバークラスにはもっと多くのメソッドと値(API定数)がありますが、ここではAutoHideAlwaysOnTopだけを説明します。このクラスには関連するAPIが2つあります。

  1. GetAppBarMessage
  2. SetAppBarMessage
 GetAppBarMessageはツールバーの現在の状態を取得します。SetAppBarMessageはツールバーの現在の状態を変更するのに使われます。現在の状態とは、ツールバーのプロパティ、位置、可視性などを指します。このクラスの中で2つのプロパティを作成しましたが、その1つはAutoHideに対応するもので、もう1つはAlwysOnTopに対応するものです。この2つの設定は互いに緊密な関係があるので、どちらもSetStateメソッドを使って簡単に操作できます。アプリケーションバーについては各自でもう少し深く研究してみてください。

 タスクバー領域に関しては基本的にこれで完了です。まだ触れていないタスクバー領域としては、昔ながらのスタートボタンとスタートメニューがあります。

スタートボタンの設定

 実のところ、このセクションのタイトルは誤解を招くものかもしれません。スタートボタンには実はWindows XPで設定できるプロパティはないのですが、スタートボタンを有効/無効にしたり、スタートボタンテキストのようなものを変更したりすることができます。

スタートボタンを有効/無効にする

 やるべきことは、タスクバー内のスタートボタンのウィンドウへのハンドルを取得してから、EnableWindowTrue(有効)またはFalse(無効)を指定することによってスタートボタンウィンドウを有効/無効にすることです。

Private Sub btnStartButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnStartButton.Click
Select Case btnStartButton.Text
Case "Disable Start Button"
Dim TaskBarWin As Long, StartButtonWin As Long

'Find TaskBar
TaskBarWin = FindWindowEx(0, 0, "Shell_TrayWnd", Nothing)
'Find Start Button
StartButtonWin = FindWindowEx(TaskBarWin, 0, "Button", Nothing)
'Disable Start Button
EnableWindow(StartButtonWin, False)
btnStartButton.Text = "Enable Start Button"
Case "Enable Start Button"
Dim TaskBarWin As Long, StartButtonWin As Long

TaskBarWin = FindWindowEx(0, 0, "Shell_TrayWnd", Nothing)
StartButtonWin = FindWindowEx(TaskBarWin, 0, "Button", Nothing)
EnableWindow(StartButtonWin, True) 'Enable Start Button
btnStartButton.Text = "Disable Start Button"
End Select

End Sub

スタートボタンテキストを変更する

 もしかしたら、この記事の中で1番先に読まれるのはこのトピックかもしれません。

 スタートボタンウィンドウ(ボタン)へのハンドルを取得したら、修正版のSendMessage APIを使って、このウィンドウに新しいテキストを送る必要があります。お使いのAPIをよく見ると、次の2つのものに気付くでしょう。

  • SendMessage
    'Normal SendMessage
    Private Declare Function SendMessage Lib "user32.dll" _
    Alias "SendMessageA" (ByVal hwnd As Int32, _
    ByVal wMsg As Int32, _
    ByVal wParam As Int32, _
    ByVal lParam As Int32) As Int32
  • SendMessageSTRING
    'SendMessage lParam = String
    Private Declare Function SendMessageSTRING Lib "user32.dll" _
    Alias "SendMessageA" (ByVal hwnd As Int32, _
    ByVal wMsg As Int32, _
    ByVal wParam As Int32, _
    ByVal lParam As String) As Int32
 両者の実際の違いは、後者のlParamパラメータが“文字列”であって、Int32ではないという点だけです。このようになっている理由は、スタートボタンテキストとして数値メッセージではなく文字列メッセージを送るからです。

 次のプロシージャをコードに追加してください。

Private Sub SetStartCaption(ByVal NewStr As String)
Dim TaskBarWin As Long
Dim StartWin As Long
Dim StartText As String

'Find TaskBar
TaskBarWin = FindWindow("Shell_TrayWnd", vbNullString)
'Find Start Button
StartWin = FindWindowEx(TaskBarWin, 0&, "button", vbNullString)
'Set StartButton Text
StartText = Microsoft.VisualBasic.Left(NewStr, 5)
'Send The Message
SendMessageSTRING(StartWin, WM_SETTEXT, 256, StartText)

Exit Sub 'Don't Do Anything Else
End Sub
 このプロシージャはスタートボタンのテキストを更新するためのものです。ハンドルを取得してから、スタートボタンウィンドウに文字列メッセージを送ります。送られる内容は、Change Start Button TextボタンのコードのInputBoxに何を入力するかで決まります。

Private Sub btnText_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnText.Click
Select Case btnText.Text
Case "Change Start Button Text"
Dim NewText As String
NewText = InputBox("Enter New Text") 'Get New Start Button Text
SetStartCaption(NewText)
btnText.Text = "Change Back Start Button Text"
Case "Change Back Start Button Text"
SetStartCaption("Start") 'Revert Back To "Start"
btnText.Text = "Change Start Button Text"
End Select

End Sub
 テキストを入力した後のスタートボタンの表示は、例えば図4のようになります。

図4 変更後のスタートボタン
図4 変更後のスタートボタン
 これの唯一の問題点は、ウィンドウ内に収まる文字数までしか入力できないことです。

タスクバーのプロパティウィンドウを表示する

'TaskBar & Start Menu Properties
Private Sub btnTaskProp_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnTaskProp.Click
Process.Start("rundll32.exe", "shell32.dll,Options_RunDLL 1")
End Sub
 「RunDll32.exe」を使用し、「shell32.dll」の助けを借りて、タスクバーのプロパティウィンドウを表示します。このプロセスの詳細については、この記事で説明しています。

図5 タスクバーのプロパティ
図5 タスクバーのプロパティ

スタートメニューのメニューを表示する/隠す

 このセクションでは、スタートメニューからお気に入りウィンドウを隠したり表示したりします。グループ化の値の変更に使用したときと同じキーの下のレジストリ値を更新します。ただし、ここで扱うのはStartMenuFavorites値で、違いはそれだけです。値を1にするとお気に入りメニューが表示され、0にするとお気に入りメニューが隠されます。変更結果をすぐに見るために、ここでもEnvRefresh関数を呼び出します。コードは次のとおりです。

Private Sub btnFavourites_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFavourites.Click
Select Case btnFavourites.Text
Case "Show Favourites In Menu"

Dim FavKey As RegistryKey = _
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows _
\\CurrentVersion\\Explorer\\Advanced", True)
'Show Favourites Menu
FavKey.SetValue("StartMenuFavorites", 1, RegistryValueKind.DWord)

EnvRefresh() 'Refresh Explorer.exe
btnFavourites.Text = "Hide Favourites In Menu"
Case "Hide Favourites In Menu"

Dim FavKey As RegistryKey = _
Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows _
\\CurrentVersion\\Explorer\\Advanced", True)
'Hide Favourites
FavKey.SetValue("StartMenuFavorites", 0, RegistryValueKind.DWord)

EnvRefresh()
btnFavourites.Text = "Show Favourites In Menu"
End Select
End Sub

独自のデスクトップ表示ボタンを作成する

 これはタスクバーやスタートボタンの機能とは言えないかもしれませんが、それでも役に立つことに変わりはありません。ただし、方法論は異なります。やるべきことは、Microsoft Shell Controls And Automation(Shell32.dll)への“COM参照”を設定することです。参照を設定するには、[プロジェクト]から[参照の追加]を選択し、[COM]タブを選択します。そこから、このライブラリまでスクロールします。これを追加し終わったら、新しいシェルオブジェクトを作成し、そのToggleDesktopメソッドを使って、すべてを最小化してデスクトップウィンドウを表示します。コードは次のとおりです。

Private Sub btnShowDesktop_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnShowDesktop.Click
'Create Instance Of Shell Class
'Referenced COM Library "Microsoft Shell Controls And Automation"
'(shell32.dll)
Dim objShell As New Shell32.ShellClass()
'Show Desktop
DirectCast(objShell, Shell32.IShellDispatch4).ToggleDesktop()

End Sub
 このボタンをクリックすれば、いつでもデスクトップが表示されます。

まとめ

 なかなか楽しい作業ではないでしょうか?少なくとも私は楽しくコーディングを行いました。残念ながら、楽しいことには必ず終わりがあり、今回も例外ではありません。この記事は参考になったでしょうか。またお会いしましょう。

著者紹介

Hannes du Preez(Hannes du Preez)
プログラミングトレーナー。プログラミングを最大の趣味とする。Visual Basic 5からプログラミングを始め、Visual Basic 6.0、Visual C++ 6.0、Visual Basic .NETでアプリケーションを開発。プログラミングの知識はすべて独学によるもので、CodeGuruにも大いにお世話になっている。
【関連記事】
VB.NETによるマウス設定の変更
VB.NetでWindowsサービスをリモートから制御/インストール/アンインストールする
Visual Basicのソートアルゴリズム
日本オラクル、Visual Basic 開発者の Java 移行支援で無償トレーニングを開始
オープンソースの開発環境『Mono』に『VB』コンパイラが登場

New Topics

Special Ad

ウマいもの情報てんこ盛り「えん食べ」
ウマいもの情報てんこ盛り「えん食べ」 「えん食べ」は、エンジョイして食べる、エンターテイメントとして食べものを楽しむための、ニュース、コラム、レシピ、動画などを提供します。 てんこ盛りをエンジョイするのは こちらから

Hot Topics

IT Job

Interviews / Specials

Popular

Access Ranking

Partner Sites