ちょっとした実験レベルでサムネイルを取り出すコードを書いてみた。Windows 7 API Code Pack を使うとかなりお手軽にできます。
最初に、Windows 7 API Code Pack を入手して参照する。NuGet なり、MSDN なりにて。
必須ではないので、自分で IShellFolder などの定義を用意できるのであれば、それでも代用可です。
KnownFolders クラスの static メンバーで Computer とか、Desktop とかがいるのでそこから列挙してみる。
foreach (ShellFolder item in KnownFolders.Computer) {
// とりあえず、ファイルシステムオブジェクトではなかったのでこの条件にした
// デバイス以外も列挙される恐れがあるかも?
if (!item.IsFileSystemObject)
{
_devicesList.Add(item);
listBoxDevices.Items.Add(item.Name);
}}
この例では、ポータブルデバイスを列挙する方法が判然としていなかったので、ファイルシステムではないものだけをピックアップしている。
列挙したフォルダーをさらにたどるとか、ShellFileSystemFolder.FromFolderPath からお目当ての ShellFolder を得て、さらにそこから列挙するか、ShellFile.FromFilePath で一気にファイルをとるかしましょう。
ファイルに対応する ShellObject がとれればこっちのもの。以下のようなコードでサムネイルがとれる。
pictureBoxThumbnail.Image = shellFile.Thumbnail.Bitmap;
shellFile は対象の ShellObject だ。
iPhone を Windows 7 環境で USB 接続している状態で後述するサンプルを動かすとこんな感じでとれる。
実装したコードも 100 行ほどで済むので楽ちん。(ただ、Dispose とかきちんとしきれてないかも)
操作的には最初に左上のデバイスの列挙をクリックして右のリストボックスに表示されるフォルダーを選択して真ん中上のボタンを押してを繰り返して、JPEG が出てきたら選んで右のボタンを押すという形。
ここからファイル操作な話は未確認。Code Pack ベースではできないかもしれないなぁと思っていますが、さて…。
ShellObject(ShellFolder / ShellFile)が現物じゃなく、あくまでサムネイル処理されたもの(Win7のエクスプローラーにおける各サイズのアイコン)でしかないとすれば、ファイル操作はできそうにないですね…(=ム=;)
名前空間と CopyHere を使えばできました…(^^;
shellFile.Thumbnail.Bitmapを返さないiphoneやスマホがあるみたいです
copyhereで現物コピーしてサムネイル取り出してます