これ絡みでちょっと実験してみた。
spy++でWindows XPのウィンドウ構成を見てみる。
"" #32769 (デスクトップ)
:
├ "" Shell_TrayWnd
: ├ "スタート" Button
├ "" TrayNotifyWnd
│ ├ "2:27" TrayClockWClass
│ ├ "" SysPager
│ │ └ "通知領域" ToolbarWindow32
│ └ "" Button
└ "" ReBarWindow32
├ "TF_FloatingLangBar_WndTitle" CiceroUIWndFrame
├ "実行中のアプリケーション" MSTaskSwWClass
│ └ "実行中のアプリケーション" ToolbarWindow32
└ "Quick Launch" ToolbarWindow32
名無しのShell_TrayWndクラスを持ったデスクトップの子ウィンドウがタスクバー全体のウィンドウのようだ。
その下に、"スタート" Button、TrayNotifyWndクラス、ReBarWindow32クラスの3つの子ウィンドウが存在する。
"スタート" Buttonはそのウィンドウ名のとおりスタートボタンそのもの。
TrayNotifyWndクラスはタスクトレイのウィンドウのようだ。
もう1つのReBarWindow32クラスは、スタートボタンとタスクトレイの間にある領域全部(タスクリストなど)を含んでいる。
TrayNotifyWndの子ウィンドウは、それぞれTrayClockWClassが時刻を表示しているウィンドウ、SysPagerが通知アイコンの表示領域、もう1つのボタンは「アクティブでないインジケータを隠す」ための矢印(<<)ボタン。
ReBarWindow32の子ウィンドウは、"TF_FloatingLangBar_WndTitle"が言語バー、"実行中のアプリケーション"がタスクリスト、"Quick Launch"はそのウィンドウ名のとおりクイック起動領域。
さて、問題のスタートボタンだが、EnumWindows()で "Shell_TrayWnd" のクラス名を持つウィンドウを探し、その子ウィンドウで "スタート" というウィンドウ名を持つウィンドウを探せばウィンドウハンドルを取得できる。
後は、非表示にする、位置、サイズを変えるなど自由に変えられるようだ。
ただし、位置、サイズについては、タスクトレイの「アクティブでないインジケータを隠す」ボタンを押したり、タスクバー全体のサイズを変更したりすると、再調整されてしまうため元に戻ってしまう。
この方法だと恒久的にスタートボタンを隠そうと思うなら、常駐して常にタスクバーを監視して再表示されないようにする必要がある。ちょっと実現性は薄い。
それよりはいっそスタートボタンウィンドウを永久に消してしまおう。スタートボタンウィンドウに WM_CLOSE を送りつけるとスタートボタンは完全に消え去った。復活の呪文は存在しない。
空虚な空きスペースのみが残った。