デスクトップのアイコン位置の取得

[戻る]
JAPAN 2001/11/28(水) 22:48:04
デスクトップのアイコンの位置を取得したいのですが、

    POINT point;
    CListCtrl ListCtrl;
    CRect rect(0,0,500,500);
    CWnd wnd;
    wnd.Attach(hWndProgman);
    int n;
    n = ListCtrl.Create(LVS_ICON,rect,&wnd,0);
    TRACE("%d",n);
    ListCtrl.GetItemPosition(0, &point );
    TRACE("%p",point);

  以上のようなソースコードですが、動きません。
  どこが違うのでしょうか?おねがいします

クラフトマン 2001/11/29(木) 17:44:14
hWndProgmanが何なのか書かれていませんが、これがデスクトップの
ウィンドウハンドルであるとして話を進めます。
デスクトップはリストビューコントロールなので、ウィンドウハンドル
が取得できれば、リストビューコントロールの機能を呼び出すことは
出来ます。
ListView_GetItemCount()とか、ListView_GetItemPosition()など
ですね。最も、ListView_GetItemPosition()は別の理由からうまく
いきませんが。(後述します)

クラフトマン 2001/11/29(木) 18:10:48
失礼。途中で送信してしまいました。続きです。

では、ListView_GetItemCount()はうまく出来るのに、
ListView_GetItemPosition()はできない理由を説明
します。二つの違いは何でしょう。
ListView_GetItemCount()は値を返してくる仕様です
が、ListView_GetItemPosition()はアドレスを渡して
値を入れてもらう仕様です。ところが、Win32では、
プロセス毎にメモリが独立しているので、アドレスを
渡しても意味がないのです。(というかこの場合は危険)
何らかの方法でプロセス間でメモリの受け渡しをする
必要があります。
たぶん、VirtualAllocEx()でデスクトップ側のプロ
セスにメモリを割り付けて、そこに結果を書き込ませ、
ReadProcessMemory()で読めば出来ると思います。
おっと、VirtualAllocEx()って9x系にはないなあ。
ご存知の方、フォローお願いします。

追伸
どうしてもCListCtrl使いたければ、
    CListCtrl list;
    list.Attach(hWndDeskTop);
    やりたい処理
    list.Detach();
とかすれば出来るかもしれません。
(プロセス間のメモリ問題はいっしょだが)

古いスレッドには追加発言できません。