デスクトップ上のアイコンを移動させるにはどうすればいいのでしょうか

タグの編集
投稿者 オニオンライス  (社会人) 投稿日時 2011/3/30 14:48:42
初めまして。
座標指定などで特定のアイコンを移動させたいのですがどのようにやればいいのでしょうか。
投稿者 しるふぃん  (社会人) 投稿日時 2011/3/30 16:08:10
開発環境等が詳しく書かれていませんが、参考になれば。
※Windows XP + Excel 200 VBAの環境で確認されてます。

http://muni2muni.blog26.fc2.com/blog-entry-45.html
投稿者 オニオンライス   (社会人) 投稿日時 2011/3/30 21:35:40
開発環境を書くのを忘れていました。

OS : Windows Vista
IDE : VisualBasic 2010
投稿者 るきお  (社会人) 投稿日時 2011/3/30 21:57:54
回答ではないです。

オニオンライスさんはデスクトップのアイコンの情報がどこに保存されているかご存知ですか?

その保存されている場所の情報をVBで書き換えればアイコンの位置を移動できると思うのですが、
私はアイコンの情報がどこに保存されているかわからないため具体的なプログラムを紹介することができません。

また、アイコン情報が保存されている場所が分かっても、その場所がVBからアクセスできないか、しにくいような仕組みになっている場合にはVBでのプログラムはあきらめた方が良い場合もあります。

いずれにせよ、デスクトップのアイコンの情報がどこに保存されているかわからないと話がはじまらないです。
レジストリかなと思って覗いてみましたが、ちょっと見た限りではそれっぽい情報はありませんでした。
投稿者 るきお  (社会人) 投稿日時 2011/3/30 21:59:50
しるふぃんさんが紹介されているサイトは、
デスクトップの背景を、マイクロソフトが想定していなかった手段で変更しようとする話のようですね。
(すいません。長かったのでななめ読みしてしまいました。)

アイコンを移動させる話ではないように思いました。
投稿者 オニオンライス  (社会人) 投稿日時 2011/3/30 22:27:08
>るきおさん
すみません。私も知りません。
もう少し調べてから再度質問したいと思います。

とりあえずこの質問は解決ということにさせていただきます。
投稿者 しるふぃん  (社会人) 投稿日時 2011/3/31 10:12:41
考え方の参考にと思っただけなので^^;

本文中の
「デスクトップの背景とはすなわち"デスクトップアイコンより下"になる。」
という考え方を調べていけば・・・・あるいは?です。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/3/31 13:25:59
> デスクトップのアイコンの情報がどこに保存されているか
デスクトップ、およびフォルダーウィンドウ関連の情報は、
 HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\{数字}
だったかと思います。Vista や 7 でも同じかどうかは分かりませんが。


> アイコンを移動させる話ではないように思いました。 
というよりも、デスクトップの実態が ListView である、という話かと思います。
ListView であることさえ分かれば、アイコン位置の取得/設定は
LVM_GETITEMPOSITION / LVM_SETITEMPOSITION32 あたりで行えますね。

Vista や 7 では試していませんが、少なくとも 2000 や XP では
Private Declare Auto Function FindWindowEx Lib "USER32" (ByVal parent As IntPtr, ByVal child As IntPtr, ByVal className As StringByVal windowName As StringAs IntPtr
  Dim hwnd = FindWindowEx(FindWindowEx(FindWindowEx( _
      IntPtr.Zero, IntPtr.Zero, "Progman"Nothing), _
      IntPtr.Zero, "SHELLDLL_defVIEW"Nothing), _
      IntPtr.Zero, "SysListView32"Nothing)
という感じで、ListView のハンドルを得られます。
しるふぃんさんが紹介されたサイトでも、同様の事が記載されていますね。


# アイコン位置の“取得”だけなら、MSAAv2 で行えるのですけれどね…。

Imports Accessibility
Public Class Form1
    Private Declare Function AccessibleObjectFromWindow Lib "oleacc" ( _
            ByVal hwnd As IntPtr, ByVal objectID As Integer, _
            ByRef riid As Guid, ByRef ppvObject As IAccessible) As Integer

    Private Sub Button1_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button1.Click
        ListBox1.BeginUpdate()
        ListBox1.Items.Clear()

        Dim hwnd As IntPtr = デスクトップのListViewハンドル

        Dim accDesktop As Accessibility.IAccessible = Nothing
        Dim IID_IAccessible As New Guid("618736E0-3C3D-11CF-810C-00AA00389B71")
        AccessibleObjectFromWindow(hwnd, &HFFFFFFFCI, IID_IAccessible, accDesktop)

        Dim child = accDesktop.accNavigate(AccessibleNavigation.FirstChild, 0)
        Do Until child Is Nothing
            Dim L, T, W, H As Integer
            accDesktop.accLocation(L, T, W, H, child)
            ListBox1.Items.Add(String.Format("({0}, {1}), {2}x{3} => {4}", _
                        L, T, W, H, accDesktop.accName(child)))
            child = accDesktop.accNavigate(AccessibleNavigation.Next, child)
        Loop
        ListBox1.EndUpdate()
    End Sub
End Class