質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

1687閲覧

WINAPI32でデスクトップ上の任意のアイコンの座標値取得と移動するコードの不具合対処方法の相談

popy

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/11/18 12:54

編集2020/11/19 23:38

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/11/18 13:09

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
dodox86

2020/11/18 17:56

参考にされたOKWAVEの質問回答の記事は2009年12月のもので、更に、回答は「Windows XP + Excel2000 VBA」でのものとのことです。私の方では確認していないので不確かですが、今のWindows 10 + Excel2016ではもう通用しないコードであったとしてもおかしくないです。
popy

2020/11/19 23:35

Y_waiwai様 情報ありがとうございます。 ソースコードの記述場所を変更いたしました。 次の投稿からcodeに記載するように心がけます。
popy

2020/11/19 23:42

dodox86様 情報ありがとうございます。デバッグをしているのですが、下記コードで 返値が0になってしまいます。コードは良さそうに見えるのですがおっしゃる通り、 win10 64bit +Excel2016では通用しないコードの可能性もありそうですね。 ListView_GetItemRect lngSysListView32, LVM_GETITEMRECT, 0, rc
popy

2020/11/19 23:52

y_waiwai様 マニュアルの情報情報いただきありがとうございました。 マニュアルの情報からやりたいことが出来そうな感触をつかむことができました。 ただ、下記コードを実行すると返値が0となってしまい、情報取得に失敗してしまいます。 何がいけなかったのかが分からず苦戦しております。 ListView_GetItemRect lngSysListView32, LVM_GETITEMRECT, 0, rc
guest

回答1

0

LVM_GETITEMRECT message (Commctrl.h) - Win32 apps | Microsoft Docs

英語になってますが、翻訳でも掛けて読んでください
あなたの疑問の解答が書いてあります

投稿2020/11/18 14:41

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問