喫茶XRAYトップページ


[3940] エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/21 (日) 23:54:38 Mr.XRAY
Windows XPでは,どうしても「ナビゲーション・ペイン」というのを
非表示にできないようですが,Vista以降ではAPIが追加されて可能に
なったようです.

エクスプローラ関係のシェルインターフェイスを実装するんですが,
中々情報がありません.
探してみたら,以下のサイトに貴重な記事がありました.
http://eternalwindows.jp/index.html

結構詳しい説明があります.
エクスプローラのフォルダツリー,フォルダビュー(ファイルリスト)
の表示が実現できました.
残念ながら,Vista以降,Delphi 2010以上でないと利用できません.

http://mrxray.on.coocan.jp/Delphi/plSamples/947_ExplorerBrowsert.htm

エクスプローラのもつ機能とほとんど同じ,でなければ,Delphiに
付属しているシェルコンポーネントを使うことになるかと思います.


[3942] Re:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/22 (月) 17:42:34 宮 〔HomePage
▼ Mr.XRAYさん
> Windows XPでは,どうしても「ナビゲーション・ペイン」というのを
> 非表示にできないようですが,Vista以降ではAPIが追加されて可能に
> なったようです.


あのぉ〜はずしていたらご免下さい。
「ナビゲーション・ペイン」というのが「ファイルとフォルダのタスク」のことなのか
分かりませんが、もしそれならXPでは
コントロールパネル→パフォーマンスとメンテナンス→システム
→詳細設定タブ→パフォーマンスの設定→
「フォルダでよく使用するタスクを使用する」→
→チェックをはずす→適用
で非表示になるのでは・・・・・?


> http://mrxray.on.coocan.jp/Delphi/plSamples/947_ExplorerBrowsert.htm
>
> エクスプローラのもつ機能とほとんど同じ,でなければ,Delphiに
> 付属しているシェルコンポーネントを使うことになるかと思います.


今後大いに参考にさせていただきます。
ありがとうございます。

[3943] Re2:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/22 (月) 18:13:27 Mr.XRAY
▼ 宮さん

> コントロールパネル→パフォーマンスとメンテナンス→システム
> →詳細設定タブ→パフォーマンスの設定→
> 「フォルダでよく使用するタスクを使用する」→
> →チェックをはずす→適用


おおっ,こんな設定があったんですね.
これでWindows 2000よりも前のと同じになります.
すると,やはりAPIにあるのかな?
MSDNを結構さがしたんですけど.


[3944] Re3:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/22 (月) 20:14:39 宮 〔HomePage
▼ Mr.XRAYさん

> すると,やはりAPIにあるのかな?
> MSDNを結構さがしたんですけど.


よく分かりませんが、マスターに
エクスプローラー周りをがっちりやってもらうため、
今からリクエストしておこ〜っと(他力本願(^_^;))

下記は以前小生のブラウザに付けていた機能で
ユーザーが自由に邪魔なペインを消せるようにしていたのですが
Win7では、@EnumWinProcUpdateが未定義となりコンパイルできないため
いまは取り外してあります。
(どうしてなのかの判断能力無し)
7になれば無用なので、しかしまだXPも多そうだし。迷っているところです。


//フォルダペインを変更した後レジストリを更新する
function EnumWinProcUpdate(aHandle: HWND; param: Pointer): BOOL; stdcall;
var
  wName :array [0..79] of Char;
begin
  Result := True;
  GetClassName(aHandle, wName, 80);
  if (StrLIComp(wName, 'ExploreWClass', 80) = 0) or
     (StrLIComp(wName, 'CabinetWClass', 80) = 0) then begin
    SendMessage(aHandle, WM_COMMAND, 28931, 0);
  end;
end;

//ファイルとフォルダのタスクを消す
procedure TformMDI.NotDispTaskPainClick(Sender: TObject);
const
    News='\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced';
var
    Reg:TRegistry;
begin
    if MessageDlg('サムネイル画面の「フォルダのタスク」窓を非表示にしますか?'
                +#13#10+#13#13+'これは、エクスプローラでも表示しません。XP以外はヘルプ参照',
                mtConfirmation, [mbYes, mbNo], 0)=mrNo  then exit;

    Reg:=TRegistry.Create;
    with Reg do
    begin
        try
            RootKey:=HKEY_CURRENT_USER;
            if OpenKey(News , False) then begin
                WriteInteger('WebView' , 0);
                reg.CloseKey;
            end;
            //更新
            EnumChildWindows(0, @EnumWinProcUpdate, 0);
        finally
            Free;
        end;
    end;
end;
//ファイルとフォルダのタスクを表示する
procedure TformMDI.DispTaskPainClick(Sender: TObject);
const
    News='\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced';
var
    Reg:TRegistry;
begin
    if MessageDlg('サムネイル画面で「フォルダのタスク」窓を表示しますか?'
                +#13#10+#13#13+'これは、エクスプローラでも表示します。XP以外はヘルプ参照',
                mtConfirmation, [mbYes, mbNo], 0)=mrNo  then exit;

    Reg:=TRegistry.Create;
    with Reg do
    begin
        try
            RootKey:=HKEY_CURRENT_USER;
            if OpenKey(News , False) then begin
                WriteInteger('WebView' , 1);
                reg.CloseKey;
            end;
            //更新
            EnumChildWindows(0, @EnumWinProcUpdate, 0);
        finally
            Free;
        end;
    end;
end;



[3945] Re4:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/22 (月) 21:19:55 Mr.XRAY
▼ 宮さん,どうも.

なるほどレジストリの操作ですね.
'ExploreWClass'と'CabinetWClass'の制御ですね.

これで,サンプルの
[945_エクスプローラのテスト]の書き換え,更新ができそうです.
例によっていつになるかわかりませんが.(^^;

http://mrxray.on.coocan.jp/Delphi/plSamples/945_ExplorerTest.htm


[3948] Re5:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/22 (月) 23:00:27 宮 〔HomePage
▼ Mr.XRAYさん
> これで,サンプルの
> [945_エクスプローラのテスト]の書き換え,更新ができそうです.
> 例によっていつになるかわかりませんが.(^^;
>

よりよいものを作っていただければ、それだけ周りの人々が幸せになるのです。
気長に待ってま〜す。



[3952] Re4:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/24 (水) 09:28:06 ぽむぽむ
▼ 宮さん

> //フォルダペインを変更した後レジストリを更新する
> function EnumWinProcUpdate(aHandle: HWND; param: Pointer): BOOL; stdcall;
> var
>   wName :array [0..79] of Char;
> begin
>   Result := True;
>   GetClassName(aHandle, wName, 80);
>   if (StrLIComp(wName, 'ExploreWClass', 80) = 0) or
>      (StrLIComp(wName, 'CabinetWClass', 80) = 0) then begin
>     SendMessage(aHandle, WM_COMMAND, 28931, 0);
>   end;
> end;


横レスで恐縮ですが、28931($7103) は、 Vista 以降、41504($A220) に
変わっていたはずです・・・が、環境がなくてテストできません。

Windows 7 Home で、41504を使ってリフレッシュするプログラムがあり、
動作確認していますが、ソースがなくて、28931で動作しない確認が
とれません。


参考資料
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200711/07110034.txt
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200809/08090055.txt

[3954] Re5:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/24 (水) 14:21:03 Mr.XRAY
▼ ぽむぽむさん,どうもです.

> 横レスで恐縮ですが、28931($7103) は、 Vista 以降、41504($A220) に
> 変わっていたはずです・・・が、環境がなくてテストできません。


Windows 7 + Delphi 2010でテストしてみました.
宮さんのコードそのままで,この値だけ変えてみました.
変更されませんでした.
下図の設定をする時に,コマンドの発行をフックして調べれば何か
わかるかも知れませんが,やっていません.そのうちに.
(サンプルプログラム集の[947]の時はフックして調べました)

あるいは,ナビゲーションペインの場合は,また違うのかも知れません.


[3956] Re6:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/24 (水) 18:44:27 宮 〔HomePage
▼ Mr.XRAYさん
> あるいは,ナビゲーションペインの場合は,また違うのかも知れません.

すみませんね。
vistaは持っていないので分かりませんが確か
マイ ドキュメント、マイ ピクチャ、マイ ミュージックの
「マイ」が取っ払われたはずなのに
7ではまたマイ ドキュメント、マイ ピクチャ、マイ ミュージック
の「マイ」が復活した。ただし、「コンピューター 」はとれたまま。
ただし、正式ファイルパスは「Documents」「Pictures」「Music」です???
昔は日本語でも英語でもどちらでもよかったのに、今回からだめみたいですよ。

7のあの訳の分からないエクスプローラ、(7からラーと付けるとか)
今もエクスプローラーをテストで、
ドキュメントの場所をデフォルトから他のドライブに移動、
「マイ ドキュメント」日本語を「Documents」英語に変えたら
ソフトで「ありません」と認識しない。
その逆をやったらまた無視される。
昔は日本語でも英語でも自動変換してくれたのに
Eドライブの実フォルダを正式に移動して名前をかえたら、
ライブラリのドキュメントは自動的に変えてくれない。
前記の原因が分かるまでちんぷんかんぷんでした。

ユーザーはとまどうでしょうね。
そんなこんなで
OSを調べてxpの時だけ働くようにしようかとも思いましたが、
アドレスもころころ変わるし、コンパイルが通らないし
XPも減るだろうし、7もXPほど長命ではないし、めんどくさいので取っ払いました。
7ではもう必要性がないので。でも何かで使用しなければならないかも。
これからエクスプローラー周りのプログラミングは要注意。
ちと真剣にどんな仕掛けになっているか
調べないと、ドジ踏みそう。
では。


[3957] Vistaと7は微妙に違います返信 削除
2010/11/24 (水) 20:01:03 Mr.XRAY
▼ 宮さん,ハッキリ言わせていただきます.

>これからエクスプローラー周りのプログラミングは要注意。

その通りだと思います.

> vistaは持っていないので分かりませんが確か

そうなんです.微妙に違うんです.
シェルの名前空間のインターフェイスも微妙に違うんです.

宮さんような実装ではなく,単純にエクスプローラのような機能を
アプリに組み込むには,Delphi付属のShell Componentですね.
あと,JAM Shellというのがあります.

http://www.jam-software.com/shellbrowser_delphi/
昔これ使っていました(有料)
いまだにバージョンアップの案内が来ています.


[3958] Re:Vistaと7は微妙に違います返信 削除
2010/11/24 (水) 20:21:08 Mr.XRAY
> そうなんです.微妙に違うんです.
> シェルの名前空間のインターフェイスも微妙に違うんです.


マイクロソフトもVistaは失敗作と言っているぐらいですから.
何とも.


[3959] Re6:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/25 (木) 10:15:59 ぽむぽむ
▼ Mr.XRAYさん

> あるいは,ナビゲーションペインの場合は,また違うのかも知れません.

レイアウトの変更のレジストリは、ここのようです。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\
Explorer\Modules\GlobalSettings\Sizer

ですが、ここを変更しても、SendMessage&WM_COMMANDでは
反応してくれないようです。

いずれかのウインドウで設定を変更すると、次回以降開いた分は、
設定が反映されますが現在開いているウインドウには影響ないようです。
拡張子の表示有無のような、表示内容の変更とは違うようですね。


[3960] Re7:エクスプローラのような(続) Vista,D2010以降限定返信 削除
2010/11/25 (木) 10:42:52 Mr.XRAY
▼ ぽむぽむさん.どうもです.

> 設定が反映されますが現在開いているウインドウには影響ないようです。
> 拡張子の表示有無のような、表示内容の変更とは違うようですね。


なるほど.そういうことですか.
レジストリの情報ありがとございます.
例によって,サンプルの見直しはいつになるかわかりませんが,
利用させていただきます.


INCM/CMT
Cyclamen v3.82