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

解決


toro  2006-09-25 19:10:43  No: 63102

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

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

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


Blue  2006-09-25 20:10:36  No: 63103

単純に考えると、

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

のチェックをはずした状態にすればいいということになるので、
起動したエクスプローラを探して、ウィンドウハンドルを取得し、
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 20:31:42  No: 63104

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


Blue  2006-09-25 22:11:11  No: 63105

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

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

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


Blue  2006-09-25 23:03:52  No: 63106

小出しですみませんが、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-26 01:06:19  No: 63107

Blueさん。

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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