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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3910閲覧

ListView_GetItemRect()の使い方についてご指摘お願いします

katayaam

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/11/10 09:04

編集2016/11/10 11:10

###前提・実現したいこと
デスクトップウィンドウ上のアイコンを全てカウントし、その全ての座標を取得することを目的としています。
現在、ListView_GetItemPosition()でアイコンの左隅の座標を取得しているのですが、ListView_GetItemRect()を使用して四隅の座標を取得したいと考えています。

###発生している問題・エラーメッセージ

ListView_GetItemCount()でアイコンのカウントはできるのですが、 ListView_GetItemRect()による座標取得ができません。

###該当のソースコード

C/C++

1 2 3/***************************************************************************** 4 * Name: 全体の初期化用関数 5 *****************************************************************************/ 6//全体の初期化 7BOOL AppInit(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw){ 8 9 //アイコンの領域を格納する 10 RECT iconRec; 11 POINT iconPos; 12 13 //デスクトップウィンドウのハンドル取得 14 HWND hWnd; 15 hWnd = FindWindow("ProgMan", NULL); 16 hWnd = GetWindow(hWnd, GW_CHILD); 17 hWnd = GetWindow(hWnd, GW_CHILD); 18 if (!hWnd) return false; 19 20 //アイコンの数の取得 21 int iCount = ListView_GetItemCount(hWnd); 22 if(!iCount) 23 { 24 //エラー処理(ここは通りません) 25 } 26 27 //アイコンの位置情報の取得(今回のインデックスは1とした) 28 if((!ListView_GetItemRect(hWnd,1,&iconRec,LVIR_BOUNDS))) 29 { 30 //エラー処理(ここを通ってしまう) 31 } 32 33 34---------------------------ここからは正常に動作します------------------------------------------------------ 35 //プロセスのハンドルを得る 36 DWORD dwProcessId; 37 GetWindowThreadProcessId(hWnd, &dwProcessId); 38 HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,FALSE, dwProcessId); 39 40 if (!hProcess) return false; 41 //プロセスへメモリ空間をコミット 42 POINT* pnt = (POINT*)VirtualAllocEx(hProcess,NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 43 44 //アイコンの位置情報の格納先 45 int Icon_Location[256][2]; 46 //アイコンの四隅の領域格納 47 long top,bottom,left,right; 48 49 50 for(int i = 0;i < iCount;i++) 51 { 52 if (ListView_GetItemPosition(hWnd, i, pnt) == false) 53 { 54 //エラー処理(問題ありません) 55 } 56 //メモリをコピー 57 if (ReadProcessMemory(hProcess, pnt, &iconPos, sizeof(POINT), NULL) == false) 58 { 59 //エラー処理(問題ありません) 60 } 61 62 Icon_Location[i][0] = iconPos.x; 63 Icon_Location[i][1] = iconPos.y; 64 } 65 66 //メモリ空間の解放 67 if((!VirtualFreeEx(hProcess, pnt, 0, MEM_RELEASE))) 68 { 69 //エラー処理 70 } 71 72

###試したこと
・ListView_GetItemRectに関する情報を一通り検索いたしました。

・RECT rc;
rc.left = LVIR_BOUNDS;
SendMessage(hWnd,LVM_GETITEMRECT,1,(LPARAM)&rc);
で座標を取得すると、
rc.top = -858999340 となります。

###補足情報(言語/FW/ツール等のバージョンなど)
・ListView_GetItemRect()のリファレンスです
https://msdn.microsoft.com/en-us/library/windows/desktop/bb774963(v=vs.85).aspx

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

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

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

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

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

PineMatsu

2016/11/10 09:23

アイコンの数は1以上あるんですよね?
katayaam

2016/11/10 09:33 編集

アイコンは37個です。iCountには37が格納されているのを確認しました。
PineMatsu

2016/11/10 09:49

インデックスを ListView_GetTopIndex で取得した先頭のインデックス番号を使用してもだめですか?
katayaam

2016/11/10 09:51

ご教授ありがとうございます。すぐに試させていただきます。
katayaam

2016/11/10 10:21 編集

int topIndex = ListView_GetTopIndex(hWnd)としてtopIndexをListView_GetItemRect()の第二引数にしましたが、topIndexの値が0であったようでうまくいきませんでした。
guest

回答1

0

ベストアンサー

別プロセスのウィンドウにメッセージを送るのでポインタは渡せないです。
下のほうになっているように相手プロセス

投稿2016/11/10 11:16

toki_td

総合スコア2850

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

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

toki_td

2016/11/10 11:23

(なぜか書きかけのものが投稿されて編集がうまくいかないのでコメントで。) 別プロセスのウィンドウにメッセージを送るのでポインタは渡せないです。 下のほうでやっているように相手プロセス内にメモリを確保してそのポインタを渡す必要があります。
katayaam

2016/11/10 11:24

すみません、「相手プロセス」の後の文章を書いていただけるとありがたいです。何卒、お願いいたします。
katayaam

2016/11/10 11:25

すみません。確認不足でした。上記のコメントは無視してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問