Windows7 のタスクバーをなんとかして裏側に回したい

Windows7 になって、タスクバーがいろいろと強化されたのはいいけれど、常に最前面に表示されるようになってしまって画面が狭くなってしまった。XPでいうところの「常に手前に表示」を解除できない状態。
「タスクバーを自動的に隠す」を使うとカーソルが画面端にきたときにパタパタ^2してうっとーしいことこのうえないうえに、時計が隠れてしまう。

なんとかして、XPのタスクバーように常時表示しつつも他の窓の後ろ、裏側にまわせないものか、と少し試行錯誤してみた。

まずググってみたけれど「できないので自動で隠すを使ってね」みたいなのしかない。
レジストリでなんとかなりそうな気もするがこちらも情報発見できず。

仕方ないので、無理矢理なんとかする方向でいくことにして、最前面=ウィンドウスタイルに TOPMOST がらみの属性が付いてるんだろうと VisualStudio2008 の SPY++ で調べたところ、案の定 WS_EX_TOPMOST 属性が設定されていた。
これをひっぺがせば何とかなるんじゃないかと、適当に↓のコードを使って実験してみた。

#include "stdafx.h"
#include "windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
	HWND taskbar_wnd = FindWindow(TEXT("Shell_TrayWnd"), NULL);
	SetWindowPos(taskbar_wnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE);
}

その結果、WS_EX_TOPMOST 属性を外すのには成功して、タスクバーの挙動も属性通り他のウィンドウの裏側に回せるようになった。
しかしながら、しばらく使っているとタスクバーは自己顕示欲を復活させて最前面を陣取ってしまい、元の状態に戻ってしまう。
SPY++ で確認すると案の定 WS_EX_TOPMOST 属性が復活している。

この属性復活しているタイミングを調べたところ、

  • タスクバー上をクリックするなどしてタスクバーがアクティブになった場合
    • もすこし細かく書くと何らかの操作をしてタスクバーが最前面に出てきたた場合
  • エアロスナップが働いた場合

というタイミングで WS_EX_TOPMOST が再設定されている様子。

さて、これをどうしたものか、、
タスクバーの属性を定期的に監視して WS_EX_TOPMOST が有効になってたらすかさずそれを解除すのがいいのか、何か別の賢い方法があるのか、、

時間あるときにもう少し詰めてみたいと思う。


レジストリを弄ると最前面解除できてXP時代の動作ってのが平和なんだけどね。。


※エアロスナップが働いた場合、というのは勘違いだったたので取り消し
最大化してもタスクバーまでしか最大化してくれない…
こんなツールが出てきていたり http://www.sevenforums.com/tutorials/54842-taskbar-always-top-disable-enable.html