デスクトップのアイコンの位置を取得したいのですが、
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);
以上のようなソースコードですが、動きません。
どこが違うのでしょうか?おねがいします
hWndProgmanが何なのか書かれていませんが、これがデスクトップの
ウィンドウハンドルであるとして話を進めます。
デスクトップはリストビューコントロールなので、ウィンドウハンドル
が取得できれば、リストビューコントロールの機能を呼び出すことは
出来ます。
ListView_GetItemCount()とか、ListView_GetItemPosition()など
ですね。最も、ListView_GetItemPosition()は別の理由からうまく
いきませんが。(後述します)
失礼。途中で送信してしまいました。続きです。
では、ListView_GetItemCount()はうまく出来るのに、
ListView_GetItemPosition()はできない理由を説明
します。二つの違いは何でしょう。
ListView_GetItemCount()は値を返してくる仕様です
が、ListView_GetItemPosition()はアドレスを渡して
値を入れてもらう仕様です。ところが、Win32では、
プロセス毎にメモリが独立しているので、アドレスを
渡しても意味がないのです。(というかこの場合は危険)
何らかの方法でプロセス間でメモリの受け渡しをする
必要があります。
たぶん、VirtualAllocEx()でデスクトップ側のプロ
セスにメモリを割り付けて、そこに結果を書き込ませ、
ReadProcessMemory()で読めば出来ると思います。
おっと、VirtualAllocEx()って9x系にはないなあ。
ご存知の方、フォローお願いします。
追伸
どうしてもCListCtrl使いたければ、
CListCtrl list;
list.Attach(hWndDeskTop);
やりたい処理
list.Detach();
とかすれば出来るかもしれません。
(プロセス間のメモリ問題はいっしょだが)