DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォルダー内でのファイルの位置

環境/言語:[Windows 7、VB.NET]
分類:[.NET]

こんにちは、いつもお世話になっています。

Mac OS Xだとファイルごとにそれが属するフォルダー内での位置(pathではなくcoordinates)を指定することができます。言葉で表現すると、「どこどこにあるファルダーの中のこのファイルを(50,100)に位置づける」と指定できます。つまり「左から50 pixel、上から100 pixelに」という具合です。WindowsでもVisual Basicを使ってファイルやフォルダーの位置を指定することができるでしょうか?例えば、デスクトップにある何々というショートカットを左から50 pixel、上から100 pixelの位置に移動させることはできるでしょうか?

以上、何かあれば助言をお願いします。
> 以上、何かあれば助言をお願いします。

  何がしたいのか見えないのですが・・・

  FATやNTFSの構造を理解すれば、あなたがやりたいことが
  どの程度の知識・技術が必要か解るかと・・・

  因みに、OSが、プロテクトモードOSになった為、普通には
  ディスクにダイレクトにアクセスすることができなくなり
  ましたが、可能ではあります。

  デフラグソフトがそういうことやってますので。

以上。参考まで
■No31057に返信(洗剤野郎さんの記事)
> WindowsでもVisual Basicを使ってファイルやフォルダーの位置を指定することが> できるでしょうか?
> 例えば、デスクトップにある何々というショートカットを左から50 pixel、
> 上から100 pixelの位置に移動させることはできるでしょうか?

デスクトップに置かれているアイコンの位置は、ファイルシステムとは全く関係なく、エクスプローラーが独自に管理しているものです。
これを自由に操作できるかは、すみません、わかりません。

ただ、デスクトップは自動整列設定にもできるので、実現可能だとしても万人向けのアプリでは採用しない方がよいとは思いますが。。。
オショウさん、Azuleanさん、ご意見ありがとうございます。
■No31057に返信(洗剤野郎さんの記事)
> つまり「左から50 pixel、上から100 pixelに」という具合です。

OS 依存かつ API だらけのコードになるとは思いますが、一応可能ですよ。


エクスプローラーのビューやソート順設定などに関しては、
 HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\BagMRU\
 HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Bags\
 HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\
 HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\
 HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Windows\Shell\BagMRU\
 HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Windows\Shell\Bags\
等で管理されています(OS によってエントリが異なります)。


> デスクトップにある何々というショートカットを左から50 pixel、上から100 pixelの位置に移動させることはできるでしょうか?

LVM_SETITEMPOSITION32 メッセージを呼び出せば可能です。


(1) FindWindowEx API を用いて、デスクトップあるいはエクスプローラーの HWND から
 その配下にある ListView すなわち "SysListView32" のハンドルを取得します(※)。

(2) LVM_GETITEMCOUNT メッセージを SendMessage してアイテム数を調します。
 そのアイテムの数だけ、下記の手順をループ処理させます。

(3) 各アイテムに対して、LVM_GETITEMPOSITION メッセージおよび
 LVM_GETITEMTEXT メッセージを SendMessage して、位置情報を取得します。
 ただし、別プロセスに対するやりとりとなるので、受信する構造体メモリは
 VirtualAllocEx/VirtualFreeEx/WriteProcessMemory/ReadProcessMemory 等を
 併用しないとアクセスできないはずです(Win98 + .NET 1.x なら別 API)。

(4) これで、各アイテムの位置情報が取得できます。アイテムの位置を
 復元したい場合には、LVM_SETITEMPOSITION32 メッセージを
 SendMessage してあげてください。


※ Windows 7 では、Explorer のリストビューは「DirectUIHWND」という物に
 覆われており、SysListView32 にはアクセスできないようです。
 (デスクトップは SysListView32 のままだったかも)
 Vista 同様のビューにするため、IFolderViewOptions インターフェイスで
 FVO_VISTALAYOUT を SetFolderViewOptions することもできるようですが…。
をを〜アイコン等の位置ネ!・・・
そういう解釈もありましたネ〜

それなら特に問題はありませんが、その位置にすでにアイコンが
あるのか否かを判別する手段は無いので、すべてのアイコン等の
位置情報を取得して、該当領域に『ない』と言うことを検出する
機能が必要です。

多分、それはMACも同じではないかと思いますが。

以上。
■No31062に返信(オショウさんの記事)
> をを〜アイコン等の位置ネ!・・・
> そういう解釈もありましたネ〜
>
> それなら特に問題はありませんが、その位置にすでにアイコンが
> あるのか否かを判別する手段は無いので、すべてのアイコン等の
> 位置情報を取得して、該当領域に『ない』と言うことを検出する
> 機能が必要です。
>
> 多分、それはMACも同じではないかと思いますが。
>
> 以上。



さすが魔界の仮面弁士さんは何でも詳しいですね。

魔界の仮面弁士さん、オショウさん、ありがとうございました。
VB.NETでは今回やろうと思っていたことがそうは簡単にはできないということがわかりました。

皆さんお知恵をありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板