none
ListView_GetItemRectの使用法についてご指摘いただけると幸いです RRS feed

  • 質問

  • デスクトップウィンドウ上のアイコンの数を数え、それらの位置情報の取得を行いたいと考えています。

    今回、ListViewメソッドを使用してコードを作成しました。LilstView_GetItemCount()でアイコンの総数を取得することはできたのですが、ListView_GetItemRect()でそれらの領域(四隅の座標)を取得することができずにいます。

    当方のコードを以下に提示いたします。ご指摘頂けると幸いです。

    -------------------------------------------(以下コード)--------------------------------------------------------

          

    //「猫でもわかる」とほぼ同じ
    int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw){

            //メッセージの定義
            MSG msg;
            hAppInst = hInst;     /* save for later */



            //デスクトップのハンドルを取得
            HWND hWnd;
            hWnd = FindWindow("ProgMan", NULL);
            hWnd = GetWindow(hWnd, GW_CHILD);
            hWnd = GetWindow(hWnd, GW_CHILD);
            if (!hWnd)  return false;

             //プロセスのハンドルを得る
             DWORD dwProcessId;
             GetWindowThreadProcessId(hWnd, &dwProcessId);
             HANDLE hProcess = OpenProcess(
     PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId);
             if (!hProcess) return false;

             

             //プロセスへメモリ空間をコミット
             POINT* pnt = (POINT*)VirtualAllocEx(hProcess,NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

             POINT iconPos;
             RECT r = { 0, 0, 0, 0 };

       

            //アイコンの数を取得
            int iCount = ListView_GetItemCount(hWnd);     /*ここは動作しています*/

      if((!ListView_GetItemRect(hWnd,0,&r,LVIR_BOUNDS))){ /

                     //エラー処理      

          }


       //アイコンの位置を取得
     if (!(ListView_GetItemPosition(hWnd, iCount, pnt))) /*アイコンのインデックスを指定可能。iCountに格納済み*/
     {
     AppExit();  /*終了処理の関数*/
     }
     //メモリをコピー
     if (!(ReadProcessMemory(hProcess, pnt, &iconPos, sizeof(POINT), NULL))) /*アイコンのインデックスを指定可能。iCountに格納済み*/
     {
     AppExit(); /*終了処理の関数*/
     }

       VirtualFreeEx(hProcess, pnt, iCount, MEM_RELEASE); /*メモリ空間の解放*/

    --------------------------------------------------------------------------------------------------------------

    何卒、宜しくお願い致します。

    以上です。



    2016年11月10日 0:48

すべての返信

  • ListView_GetItemPositionと同様に、ListView_GetItemRectも、VirtualAllocExで対象プロセスのアドレス空間に確保したメモリを渡してそこに書き込ませ、ReadProcessMemoryで読み取る必要があります。

    // ポインタを渡す関数は基本的に全部そうする必要があります。

    2016年11月10日 10:05