C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Shellコンテキストメニューの新規作成


(過去ログ 125 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■74622 / inTopicNo.1)  Shellコンテキストメニューの新規作成
  
□投稿者/ mayopees (1回)-(2015/01/14(Wed) 11:44:16)

分類:[VB.NET/VB2005 以降] 

環境:VB2008(.NET 3.5 + Win7/SP1 or Vista)、WinFormApplication

Shellコンテキストメニューの新規作成と同じ機能を実装したいのですが
以下の点がわからないので、教えてください。

(1)レジストリのShellNewキーにItemNameを持つ拡張子の場合
新規作成時のファイル名をEXE、DLL等のリーソースから取得したい。
(現在はSHGetFileInfo関数で取得しています。)

(例)「.txt」の場合
キー==>HKEY_CLASSES_ROOT\.txt\ShellNew
ItemNameの値==>@%SystemRoot%\system32\notepad.exe,-470

notepad.exeの
id「-470」から期待する値は「新しいテキスト ドキュメント」
id「-500」から期待する値は「新規 テキスト ドキュメント」

(2)ブリーフケースを指定フォルダに新規作成したい。
XPではProcess.Start("rundll32.exe", "syncui.dll,Briefcase_Create")でDesktopにはできました。

以上、どちらでもいいので教えてください。

引用返信 編集キー/
■74625 / inTopicNo.2)  Re[1]: Shellコンテキストメニューの新規作成
□投稿者/ とっちゃん (292回)-(2015/01/14(Wed) 16:07:55)
とっちゃん さんの Web サイト
No74622 (mayopees さん) に返信
> Shellコンテキストメニューの新規作成と同じ機能を実装したいのですが
> 以下の点がわからないので、教えてください。
>
まずは、シェル関連のリファレンスのトップ(これがすべてではありませんが起点にはなります)をリンクしておきます。
http://msdn.microsoft.com/en-us/library/bb773177.aspx

コンテキストメニューだけじゃなく、シェルの様々な機能についての解説やリファレンスがあるので押さえておくとよいかと。
ちなみに、これよりもずっと規模が小さかった頃(シェルがエクスプローラ固定になったころ)の時点でシェル関連だけで本一冊分のボリュームがありました。
それから約20年、Windows 8で、それは削っちゃだめだろう?というものまで削られてもなお、当時よりボリュームがありますが...w


> (1)レジストリのShellNewキーにItemNameを持つ拡張子の場合
> 新規作成時のファイル名をEXE、DLL等のリーソースから取得したい。
> (現在はSHGetFileInfo関数で取得しています。)
>
> (例)「.txt」の場合
> キー==>HKEY_CLASSES_ROOT\.txt\ShellNew
> ItemNameの値==>@%SystemRoot%\system32\notepad.exe,-470
>
> notepad.exeの
> id「-470」から期待する値は「新しいテキスト ドキュメント」
> id「-500」から期待する値は「新規 テキスト ドキュメント」
>
レジストリの内容を直接参照して、自分でメニューを作りたいということですかね?


文字列を要求する場所で「@」で始まる値を指定している場合、
アイコンリソースを取得するときと同じ仕組みで、文字列リソースから取得するようになっています。

例の場合であれば、
ItemNameは、%SystemRoot%\system32\notepad.exe というファイルの
文字列リソースの470番(-なのは、リソース番号を指定する規約、プラスの場合は先頭からのインデックス)の文字列を
利用するという意味になります。

ちなみに、notepad.exe は、MUIリソースを持っているので、実際に参照されるのは
%SystemRoot%\system32\ja-jp\notepad.exe.mui の、文字列リソース 470 番となります。




> (2)ブリーフケースを指定フォルダに新規作成したい。
> XPではProcess.Start("rundll32.exe", "syncui.dll,Briefcase_Create")でDesktopにはできました。
>
こちらは95の頃にちょっと触ってみたことがある程度で、使ったことがないので分かりません。
ですが、Briefcase は Windows8 から搭載されていません。それは問題になることはないのでしょうか?




ところで、やろうとしていることは、もしかして自分でシェルのコンテキストメニューと同じことを
やろうとしています?

もしそうなら、IContextMenu インターフェースを使ってシェルのコンテキストメニューを表示する
ことを検討してみてください。
引用返信 編集キー/
■74626 / inTopicNo.3)  Re[2]: Shellコンテキストメニューの新規作成
□投稿者/ mayopees (2回)-(2015/01/14(Wed) 20:23:42)
No74625 (とっちゃん さん) に返信

とっちゃん様、返信ありがとうございます。

> まずは、シェル関連のリファレンスのトップ(これがすべてではありませんが起点にはなります)をリンクしておきます。
> http://msdn.microsoft.com/en-us/library/bb773177.aspx
>
お気に入りに登録して、少しずつ読んでいきます。

>>(1)レジストリのShellNewキーにItemNameを持つ拡張子の場合
>>新規作成時のファイル名をEXE、DLL等のリーソースから取得したい。
>>
質問後、自己解決しました。
LoadString関数で取得できました。
自分のPC(Win7,64bit)では
ID -469==>テキスト ドキュメント
ID -470==>新しいテキスト ドキュメント
となっていました。-500は登録されていませんでした。取得失敗の場合は"新規〜"となるようです。


>>(2)ブリーフケースを指定フォルダに新規作成したい。

> こちらは95の頃にちょっと触ってみたことがある程度で、使ったことがないので分かりません。
> ですが、Briefcase は Windows8 から搭載されていません。それは問題になることはないのでしょうか?
>

Windows8から搭載されていないとは知りませんでした。
こちらについてはそういう事であれば、あきらめます。
Windows7のメインストリームサポート期間も終了しましたね。

> レジストリの内容を直接参照して、自分でメニューを作りたいということですかね?

> ところで、やろうとしていることは、もしかして自分でシェルのコンテキストメニューと同じことを
> やろうとしています?
>
> もしそうなら、IContextMenu インターフェースを使ってシェルのコンテキストメニューを表示する
> ことを検討してみてください。
>
ご推察の通りです。
趣味でプログラミングをやっていて勉強の為に、マイコンピュターと同じようなファイラーを作っています。
IContextMenu インターフェースは既に実装済です。
ですが、新規作成メニューは表示されないので、自分でメニューに追加して実装する必要があると思ったのです。
「名前の変更」はIContextMenu.QueryContextMenuメソッドのフラグにCANRENAMEを設定すればメニューには出ますが
「新規作成」もフラグに何か設定すれば表示されるようになるのでしょうか?



引用返信 編集キー/
■74627 / inTopicNo.4)  Re[3]: Shellコンテキストメニューの新規作成
□投稿者/ とっちゃん (293回)-(2015/01/15(Thu) 11:33:43)
とっちゃん さんの Web サイト
No74626 (mayopees さん) に返信
>>もしそうなら、IContextMenu インターフェースを使ってシェルのコンテキストメニューを表示する
>>ことを検討してみてください。
> >
> ご推察の通りです。
> 趣味でプログラミングをやっていて勉強の為に、マイコンピュターと同じようなファイラーを作っています。
> IContextMenu インターフェースは既に実装済です。
> ですが、新規作成メニューは表示されないので、自分でメニューに追加して実装する必要があると思ったのです。
> 「名前の変更」はIContextMenu.QueryContextMenuメソッドのフラグにCANRENAMEを設定すればメニューには出ますが
> 「新規作成」もフラグに何か設定すれば表示されるようになるのでしょうか?
>
仕事のコードにコンテキストメニューを出しているところがあるのでちょっと動かしてみました。
えーっと。。。新規作成は出てきませんね。
ちなみに、フラグで使ってたのは、CMF_NORMAL と、CMF_CANRENAME の2つ。
それ以外のフラグを組み合わせれば出るかもしれませんが、実験コードがないので、試せません。

この辺りの初期実装は96年あたりのはずなので。。。
SDKからのコピーそのままですが、IContextMenu::QueryContextMenu に渡せるフラグは以下の組み合わせ(|)です。

#define CMF_NORMAL 0x00000000
#define CMF_DEFAULTONLY 0x00000001
#define CMF_VERBSONLY 0x00000002
#define CMF_EXPLORE 0x00000004
#define CMF_NOVERBS 0x00000008
#define CMF_CANRENAME 0x00000010
#define CMF_NODEFAULT 0x00000020
#if (NTDDI_VERSION < NTDDI_VISTA)
#define CMF_INCLUDESTATIC 0x00000040
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
#define CMF_ITEMMENU 0x00000080
#endif
#define CMF_EXTENDEDVERBS 0x00000100
#if (NTDDI_VERSION >= NTDDI_VISTA)
#define CMF_DISABLEDVERBS 0x00000200
#endif
#define CMF_ASYNCVERBSTATE 0x00000400
#define CMF_OPTIMIZEFORINVOKE 0x00000800
#define CMF_SYNCCASCADEMENU 0x00001000
#define CMF_DONOTPICKDEFAULT 0x00002000

どれがどういうものかについては、リファレンスを(QueryContextMenuのリファレンス)見てください。
かなりざっくりとしか書かれてませんが、一応書いてあります。

あとは、いろいろ試して違いをチェックするというところですかね。
なんか、お役に立てず。。。で申し訳ないですけど、頑張ってみてください。


引用返信 編集キー/
■74628 / inTopicNo.5)  Re[4]: Shellコンテキストメニューの新規作成
□投稿者/ mayopees (3回)-(2015/01/15(Thu) 13:24:37)
とっちゃん様、返信ありがとうございます。
お付き合いくださって、感謝いたします。

レジストリからの実装は、ほぼ目処が付きました。
インターフェイスから実装できれば、シェルにお任せで楽チンなのですが....
どなたか情報があれば、教えてください。

当初の質問は一応解決しましたので、数日待って解決にしたいと思います。



引用返信 編集キー/
■74671 / inTopicNo.6)  Re[5]: Shellコンテキストメニューの新規作成
□投稿者/ mayopees (4回)-(2015/01/22(Thu) 10:55:14)
レジストリからの実装は許容範囲のものが出来ました。
とっちゃん様、お付き合いくださってありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -