エクスプローラのツールバーを非表示にするには?

解決


toro  2006-09-25 10:10:43  No: 63102  IP: 192.*.*.*

初めまして、こんにちわ
質問なのですが下記のようにエクスプローラを開いて
その表示されたエクスプローラのツールバーを非表示にするにはどうしたらよいのでしょうか?
よろしくお願いします。

ShellExecute(0,"open","explorer","/e,/root=e:\\",NULL,SW_SHOW);

環境はVC++6.0  MFC  WinXP ProsSP2です

編集 削除
Blue  2006-09-25 11:10:36  No: 63103  IP: 192.*.*.*

単純に考えると、

メニューの 表示 → ツールバー → 標準のボタン

のチェックをはずした状態にすればいいということになるので、
起動したエクスプローラを探して、ウィンドウハンドルを取得し、
WM_COMMANDでSendMessageをすればよさそうです。

「表示 → ツールバー → 標準のボタン」のIDはSpy++を使って調べれます。

// ダイアログクラスから操作する例
// ShellExecuteでopenを指定してExplorer起動するとクラス名は「CabinetWClass」になる。
// 第2引数にパスを指定できればよいが、ルートディレクトリの場合
// ボリューム名(であっていたかな)が、パスの前についてしまうので。
// 例) C:\\ を指定すると 「Windows (C:)」 というウィンドウタイトルになるため
// 複数起動している場合、FindWindowExで1つずつ調べる必要がありそう。
CWnd* pWnd = this->FindWindow( TEXT( "CabinetWClass" ), NULL );
// WinXP ProsSP2でSpy++で調べたところIDは0xA204だった
pWnd->SendMessage( WM_COMMAND, ( WPARAM )0xA204, ( LPARAM )0L );

編集 削除
Blue  2006-09-25 11:31:42  No: 63104  IP: 192.*.*.*

> WM_COMMANDでSendMessageをすればよさそうです。
はまずいことに気づきました。
もともと、「表示 → ツールバー → 標準のボタン」にチェックが入っていない場合、
逆に表示してしまいますな。
SendMessageする前にメニューの状態を調べる必要があるようです。

編集 削除
Blue  2006-09-25 13:11:11  No: 63105  IP: 192.*.*.*

いろいろ調べたところ、Explorerのメニューらしきものは、GetMenuから取得できないっぽいです。
(メニューではなく、ToolbarWindow32らしい)

ですので、、「表示 → ツールバー → 標準のボタン」をチェックするのは難しいかもと思います。



Shell32系のCOMを使って、何とかできるかもと思ったけど、ShellFolderViewオブジェクトの
ToolBarプロパティではメニューらしきものと、標準のボタン、アドレスバーとすべて消えます。

編集 削除
Blue  2006-09-25 14:03:52  No: 63106  IP: 192.*.*.*

小出しですみませんが、Windows Xp Sp2のExplorerでは、「標準のボタン」と呼ばれるコントロールは

CabinetWClass
  + WorkerW (0xA005)
    + ReBarWindow32 (0xA005)
        + ToolbarWindow32 (0xA000)

のコントロールです。
で、
>pWnd->SendMessage( WM_COMMAND, ( WPARAM )0xA204, ( LPARAM )0L );
を送る前に、このウィンドウハンドルを取得して、IsWindowで表示しているかどうかチェックすればよさそう。

if ( ( int )::ShellExecute( 0, _T( "open" ), _T( "explorer" ),
                            _T( "/e,/root=e:\\" ), NULL, SW_SHOW ) >= 32 )
{   
    CWnd* pExplorer;
    // CabinetWClass か ExploreWClass
    while ( ( pExplorer = this->FindWindow( _T( "ExploreWClass" ), NULL ) ) == NULL );
    while ( !pExplorer->IsWindowVisible() );
    CWnd* pWork = pExplorer->GetDlgItem( 0xA005 );
    if ( pWork )
    {
        CWnd* pReBar = pWork->GetDlgItem( 0xA005 );
        if ( pReBar )
        {
            CWnd* pToolBar = pReBar->GetDlgItem( 0xA000 );
            if ( pToolBar && pToolBar->IsWindowVisible() )
            {
                pExplorer->SendMessage( WM_COMMAND, ( WPARAM )0xA204, ( LPARAM )0L );
            }
        }
    }
}

編集 削除
toro  2006-09-25 16:06:19  No: 63107  IP: 192.*.*.*

Blueさん。

無事ツールバーも非表示にできました。
それにわかりやすい説明で非常に参考になりました。


本当にありがとうございました。

編集 削除