WINAPI32を用いてデスクトップ上の任意のアイコンの座標を取得し、移動するコードを作成したいと考えております。
インターネット上にやりたいことに近いサンプルコードを見つけたので自分でコードを読み取って動作の仕組みを勉強しているところです。
実際にコードを自分なりに読み取ってみたのですが、下記太字の部分のコードでアイコンの座標を取得するとコメント文があり、
おそらくこの箇所でrc(RECTの構造体)にアイコンの座標値を取得するのかなと思っておりました。
しかし、コードを実行すると(rc.top,rc.bottom,rc.right,rc.left)すべて0のままで変化はありません。
なので座標を取得できていないものと考えております。
また、サンプルコードで "rc.Left = LVIR_ICON"と記載しているのですが、この文の役割もよくわかりません。
そこで教えていただきたいことは、
1)ListView_GetItemRect lngSysListView32, LVM_GETITEMRECT, 0, rc ←を実行することでrcにアイコンの座標値を取得できる
という認識であっているのかどうか
2)rc.Left = LVIR_ICONをListView_GetItemRect lngSysListView32, LVM_GETITEMRECT, 0, rcの前に記述した意図と
rc.Left = LVIR_ICON がどのような意図で記述したのか?
3)アイコンの座標値を取得するためにどのようにコードを修正すればよいのか?
を教えていただきたいと思います。
WINAPI32に関しては初心者なので初歩的なミスがあるかもしれませんが、ご容赦いただければと思います。
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal uCmd As Long) As Long Private Declare Function ListView_GetItemRect Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal lngIndex As Long, ByRef rc As RECT) As Long Private Declare Function ListView_SetItemPosition Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal lngIndex As Long, ByVal lngPosition As Long) As Long Private Type LVITEM mask As Long iItem As Long iSubItem As Long state As Long stateMask As Long pszText As Long cchTextMax As Long iImage As Long lParam As Long iIndent As Long End Type Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Const LVM_GETITEMRECT As Long = &H100E Private Const LVM_SETITEMPOSITION As Long = &H100F Private Const GW_CHILD As Long = 5 Private Const LVIR_ICON As Long = 1 Private Sub CommandButton1_Click() Dim lngTopWindow As Long Dim lngChildWindow As Long Dim lngSysListView32 As Long Dim lvi As LVITEM Dim rc As RECT lngTopWindow = FindWindow("Progman", "Program Manager") If lngTopWindow Then lngChildWindow = GetWindow(lngTopWindow, GW_CHILD) If lngChildWindow Then lngSysListView32 = GetWindow(lngChildWindow, GW_CHILD) If lngSysListView32 Then ' インデックス= 0 のアイコンの位置を取得します。 rc.Left = LVIR_ICON ListView_GetItemRect lngSysListView32, LVM_GETITEMRECT, 0, rc ' X 方向に +100 移動させます ListView_SetItemPosition lngSysListView32, LVM_SETITEMPOSITION, 0, rc.Top * &H10000 + rc.Left + 100 End If End If End If End Sub
参考にしたサイト
https://okwave.jp/qa/q5525027.html
動作環境
windows10
excel2016