###前提・実現したいこと
デスクトップウィンドウ上のアイコンを全てカウントし、その全ての座標を取得することを目的としています。
現在、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
回答1件
あなたの回答
tips
プレビュー