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

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

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

エクスプローラ クイックアクセス ピン留め C#

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

■88813 / inTopicNo.1)  エクスプローラ クイックアクセス ピン留め C#
  
□投稿者/ Ante (14回)-(2018/10/01(Mon) 20:51:44)

分類:[C#] 

2018/10/01(Mon) 20:52:00 編集(投稿者)

いつもお世話になります。

ご存知でしたら教えてください。

C#を利用して(標準ユーザーによるコマンド発行でも良い)、エクスプローラのクイックアクセスへ以下のフォルダをピン留めしたいです。
・ピクチャ
・ビデオ
・ミュージック

■OS
Windows10

■言語
C#

■IDE
VisualStudio2017

よろしくお願いします。
引用返信 編集キー/
■88815 / inTopicNo.2)  Re[1]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ 魔界の仮面弁士 (1868回)-(2018/10/02(Tue) 03:10:25)
No88813 (Ante さん) に返信
> C#を利用して(標準ユーザーによるコマンド発行でも良い)、エクスプローラのクイックアクセスへ以下のフォルダをピン留めしたいです。
> ・ピクチャ
> ・ビデオ
> ・ミュージック

using System;
using System.Runtime.InteropServices;

class Program
{
  static void Main(string[] args)
  {
    void Release(ref dynamic arg)
    {
      if (arg != null && Marshal.IsComObject(arg)) Marshal.IsComObject(arg);
      arg = null;
    };

    var csidlList = new[] { 13, 14, 39, /* 53, 54, 55, */ };
    var verbName = "pintohome";
    dynamic shell = Activator.CreateInstance(Type.GetTypeFromCLSID(
      new Guid("13709620-C279-11CE-A49E-444553540000")));
    foreach (object csidl in csidlList)
    {
      var folder = shell.NameSpace(csidl);
      var item = folder.Self;
      item.InvokeVerb(verbName);
      Release(item);
      Release(folder);
    }
    Release(shell);
  }
}
引用返信 編集キー/
■88817 / inTopicNo.3)  Re[2]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ Ante (16回)-(2018/10/02(Tue) 16:56:21)
2018/10/02(Tue) 16:57:21 編集(投稿者)

魔界の仮面弁士 さん

いつもご回答ありがとうございます。

var csidlList = new[] { 13, 14, 39, /* 53, 54, 55, */ };
で定義しているものが、下記に一致しているように思えますが
・ピクチャ
・ビデオ
・ミュージック

ちなみに、コメントアウトされている、53, 54, 55
については、それぞれのパブリックなのですね。

以下の3つについて、
・ダウンロード
・デスクトップ
・ドキュメント

上記定数のように指定できそうですが、
定数値の一覧等が掲載されたサイトがあれば教示いただけたら嬉しいです。。。

直近困っているので、なければ、直接値を教えていただけると幸いです。

引用返信 編集キー/
■88819 / inTopicNo.4)  Re[3]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ Ante (17回)-(2018/10/02(Tue) 19:21:23)
1から700まで確認し、以下は見つけました!
・デスクトップ
・ドキュメント

■対応定数値
デスクトップ
→16
ドキュメント
→5
ピクチャ
→39
ビデオ
→14
ミュージック
→13


ダウンロードだけ見つからないです…。。。
引用返信 編集キー/
■88820 / inTopicNo.5)  Re[4]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ とっちゃん (537回)-(2018/10/02(Tue) 21:34:19)
No88819 (Ante さん) に返信
公式ページでは値は記載されていないみたいですね。

ということで、「正式な」値のリストですが、
Windows SDKの、shlobj.h というファイルに定義されています。

Windows SDK をインストールしていない場合は、
「C++によるデスクトップ開発」のワークロードをインストールするか
「個別のコンポーネント」の「SDK、ライブラリ、およびフレームワーク」から
Windows 10 SDK でサポート対象としたいバージョン以上向けの3種(UWP用、デスクトップC++用、無印)を入れておくことをお勧めします。

今だと、基本的には15063以上をインストールしておけばよいと思いますが、C# から参照するだけであれば
一番大きな数値のものを選んでインストールしておけばいいと思います(それが一番新しい定義なので)。

SDKは、COM/Native API を呼び出す際に正式な定義を検索するなどでも利用します。
今後も Native APIを使うつもりがあるのであればインストールしておくと、よいと思いますよ。

C# の文法がわかっていれば、C/C++のヘッダーは読めると思います。


おまけ。

今回は直接関係ないですが、Vista 以降は、CSIDLではなく、KNOWNFOLDERID というGUIDで再定義されています。
一応正式には今後はこちらを使ってくれということになっています(もちろんCSIDLも当分は使える)。

ちょっと見るのは大変ですが、KNOWNFOLDERID は以下のURLに定義があります。
https://docs.microsoft.com/en-us/windows/desktop/shell/knownfolderid

ただし、ドキュメントのほうが更新が遅い場合があるので、最新については
WindowsSDKの Knownfolders.h を参照する必要があります。

特に Windows 10 では、バージョンが上がるごとにこれらの値も増えており、こちらを使わないと
取り出せないなどが実際に出てきています。

引用返信 編集キー/
■88821 / inTopicNo.6)  Re[3]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ 魔界の仮面弁士 (1869回)-(2018/10/03(Wed) 00:33:46)
2018/10/03(Wed) 00:47:41 編集(投稿者)

No88817 (Ante さん) に返信
> var csidlList = new[] { 13, 14, 39, /* 53, 54, 55, */ };
> で定義しているものが、下記に一致しているように思えますが

一つ上の回答と被りますが、これらの値については『CSIDL 値』で検索してみてください。

VS2017 と共に Windows SDK もインストールしている場合には、
 C:\Program Files (x86)\Windows Kits\10\Include\バージョン
の下位フォルダにある、ShlObj_core.h もしくは ShlObj.h の
どちらかを見ることで、CSIDL の定数値を確認できるかと思います。


> 定数値の一覧等が掲載されたサイトがあれば教示いただけたら嬉しいです。。。
幾つかの CSIDL 値は、Shell32 の ShellSpecialFolderConstants 列挙型として定義されています。

参照設定に Microsoft Shell Controls And Automation を加えていれば、
 デスクトップ フォルダーなら Shell32.ShellSpecialFolderConstants.ssfDESKTOP // 0
 デスクトップ ディレクトリは Shell32.ShellSpecialFolderConstants.ssfDESKTOPDIRECTORY // 16
 パブリック デスクトップなら Shell32.ShellSpecialFolderConstants.ssfCOMMONDESKTOPDIR // 25
という具合に。
http://msdn.microsoft.com/en-us/library/bb774096.aspx

しかしこの ShellSpecialFolderConstants にはバグがありまして、
ssfPROGRAMFILESx86 という列挙値の数値が
本来は 42 で無ければならないのにも関わらず、
誤って 48 (Windows 管理ツール を意味する)と誤定義されていたりします。

ちなみに Windows SDK 上での定義はこんな感じ。

#define CSIDL_PROGRAM_FILESX86 0x002a
#define CSIDL_ADMINTOOLS 0x0030


> 以下の3つについて、
> ・ダウンロード
> ・デスクトップ
> ・ドキュメント
デスクトップ や ドキュメント など、Windows XP 以前からあるものは
CSIDL が使えますが、ダウンロードのように Vista 以降で追加されたものは
KNOWNFOLDERID として定義されています。
https://docs.microsoft.com/ja-jp/windows/desktop/shell/knownfolderid


var targets = new object[]
{
  // 17, // PC
  // "shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", // PC
  // "shell:thisdevicefolder", // このデバイス

  // 0, // デスクトップ(仮想フォルダー)
  // "shell:::{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}" // デスクトップ(仮想フォルダー)
  "shell:desktop", // デスクトップ(ディレクトリ)
  // 16, // デスクトップ(ディレクトリ)
  //// 25, // パブリック デスクトップ(ディレクトリ)
  //// "shell:common desktop", // パブリック デスクトップ(ディレクトリ)

  "shell:documentslibrary", // ドキュメント(ライブラリ)
  // 5, // ドキュメント
  // "shell:::{A8CDFF1C-4878-43be-B5FD-F8091C1C60D0}", // ドキュメント
  // "shell:::{D3162B92-9365-467A-956B-92703ACA08AF}", // ドキュメント
  "shell:personal", // ドキュメント
  // "shell:local documents", // ローカル ドキュメント
  // "shell:common documents", // パブリック ドキュメント

  // "shell:::{374DE290-123F-4565-9164-39C4925E467B}", // ダウンロード
  // "shell:::{088E3905-0323-4B02-9826-5D99428E115F}", // ダウンロード
  "shell:downloads", // ダウンロード
  // "shell:local downloads", // ローカル ダウンロード
  "shell:commondownloads", // パブリック ダウンロード

  // "shell:::{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}", // 3D オブジェクト
  "shell:3d objects", // 3D オブジェクト

  // "shell:libraries", // ライブラリ
  // "shell:userslibrariesfolder", // ライブラリ
  // "shell:quick launch", // Quick Launch
  //// "shell:user pinned", // ジャンプリスト 固定メニュー
  // "shell:public", // パブリック

  "shell:musiclibrary", // ミュージック(ライブラリ)
  // 13, // ミュージック
  // "shell:::{1CF1260C-4DD0-4EBB-811F-33C572699FDE}", // ミュージック
  // "shell:::{3DFDF296-DBEC-4FB4-81D1-6A3438BCF4DE}", // ミュージック
  "shell:my music", // ミュージック
  // "shell:local music", // ローカル ミュージック
  // 53, // パブリック ミュージック
  "shell:commonmusic", // パブリック ミュージック
  // "shell:samplemusic", // サンプル ミュージック

  "shell:videoslibrary", // ビデオ(ライブラリ)
  // 14, // ビデオ
  // "shell:::{A0953C92-50DC-43BF-BE83-3742FED03C9C}", // ビデオ
  // "shell:::{F86FA3AB-70D2-4FC7-9C99-FCBF05467F3A}", // ビデオ
  "shell:my video", // ビデオ
  // 55, // パブリック ビデオ
  "shell:commonvideo", // パブリック ビデオ
  // "shell:samplevideos", // サンプル ビデオ

  "shell:pictureslibrary", // ピクチャ(ライブラリ)
  // 39, // ピクチャ
  // "shell:::{3ADD1653-EB32-4CB0-BBD7-DFA0ABB5ACCA}", // ピクチャ
  // "shell:::{24AD3AD4-A569-4530-98E1-AB02F9417AA8}", // ピクチャ
  "shell:my pictures", // ピクチャ
  // "shell:local pictures", // ローカル ピクチャ
  // 54, // パブリック ピクチャ
  "shell:commonpictures", // パブリック ピクチャ
  // "shell:samplepictures", // パブリック\サンプル ピクチャ

  "shell:accountpictures", // アカウントの画像
  //// "shell:publicaccountpictures", // パブリック アカウントの画像

  "shell:camerarolllibrary", // カメラロール(ライブラリ)
  // "shell:::{3ADD1653-EB32-4CB0-BBD7-DFA0ABB5ACCA}\\camera roll", // ピクチャ\カメラ ロール
  // "shell:::{24AD3AD4-A569-4530-98E1-AB02F9417AA8}\\camera roll", // ピクチャ\カメラ ロール
  "shell:camera roll", // ピクチャ\カメラ ロール

  "shell:savedpictureslibrary", // 保存済みの写真(ライブラリ)
  "shell:savedpictures", // ピクチャ\保存済みの写真

  // "shell:::{018D5C66-4533-4307-9B53-224DE2ED1FE6}", // OneDrive
  "shell:onedrive", // OneDrive
  "shell:onedrivepictures", // OneDrive の画像
  "shell:onedrivedocuments", // OneDrive のドキュメント
  // "shell:onedrivecameraroll", // OneDrive の画像\カメラ ロール
  // "shell:onedrivemusic", // OneDrive のミュージック
};

dynamic shell = Activator.CreateInstance(Type.GetTypeFromCLSID(
  new Guid("13709620-C279-11CE-A49E-444553540000")));

var verbName = "pintohome";

foreach (var vDir in targets)
{
  var folder = shell.NameSpace(vDir);
  if (folder != null)
  {
   var item = folder.Self;
   item?.InvokeVerb(verbName);
   Release(item);
  }
  Release(folder);
}
Release(shell);


https://docs.microsoft.com/en-us/windows/desktop/shell/shell-namespace
http://www10.plala.or.jp/palm84/archives/wsh/Windows_CreateShellCommandsShortCut.vbs.txt
引用返信 編集キー/
■88827 / inTopicNo.7)  Re[5]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ Ante (18回)-(2018/10/03(Wed) 15:07:44)
とっちゃんさん、魔界の仮面弁士さん

なるほど。非公開なのですね。。。

OSの変更に依存するのはこの際仕方ないと割り切ってます。。。
共有いただいたサンプルで組み込んでいきます。

ありがとうございます。
解決済み
引用返信 編集キー/
■88834 / inTopicNo.8)  Re[6]: エクスプローラ クイックアクセス ピン留め C#
□投稿者/ とっちゃん (538回)-(2018/10/03(Wed) 18:14:44)
No88827 (Ante さん) に返信
> とっちゃんさん、魔界の仮面弁士さん
>
> なるほど。非公開なのですね。。。
>
非公開ではありません。
公開されていますが、情報の重複を避けるため、値を記載するのではなく、正確な定義はSDKを参照しろ!という形になっています。

OSの側から言わせれば、OSの機能を使うのにその情報を定義、公開しているSDKを持っていないなんてありえないことなので
そういう割り切りなんだと思います。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ