LVM_GETITEMPOSITION を使用して、デスクトップ アイコンの位置を設定/取得しようとしています。位置の設定は期待どおりに機能しますが、それらを取得することはできません。
メッセージを送ったとき(DeskHandle, LVM_GETITEMPOSITION, 1, ppt); エクスプローラーがクラッシュします。これは明らかに、ppt が私のプロセスで有効なアドレスにすぎないためです。そのため、エクスプローラーのメモリ アドレス空間に dll を挿入する必要があります。
問題は返される位置が常に 0,0 であることです
dll :
library Project2_dll;
uses
SysUtils,Classes,windows,messages,dialogs,commctrl;
{$R *.res}
procedure hookit; stdcall;
var ppt:tpoint;
Desktop,DeskHandle : hwnd;
DeskThread : cardinal;
begin
Desktop := FindWindow('ProgMan', nil);
Desktop := FindWindowEx(Desktop, 0, 'SHELLDLL_DefView', nil);
DeskThread := GetWindowThreadProcessID(Desktop, nil);
DeskHandle := FindWindowEx(Desktop, 0, 'SysListView32', nil);
sendmessage(DeskHandle, LVM_GETITEMPOSITION, 1, Longint(@ppt) );
showmessage(inttostr(ppt.X)+' '+inttostr(ppt.Y));
end;
exports hookit;
begin
end.
EXE :
var
lib : hwnd;
prc: procedure; stdcall;
procedure TForm2.Button1Click(Sender: TObject);
var hListView : HWND;
DeskThread : cardinal;
begin
hListView := FindWindow('ProgMan', nil);
hListView := FindWindowEx(hListView, 0, 'SHELLDLL_DefView', nil);
DeskThread := GetWindowThreadProcessID(hListView, nil);
lib:= LoadLibrary('Project2_dll.dll');
prc := GetProcAddress(lib, 'hookit');
HH := SetWindowsHookEx(WH_MOUSE,GetProcAddress(lib, 'getit'),lib,DeskThread);
prc;
end;
ここSOで同様の質問をいくつか見ましたが、どれも役に立ちませんでした。
ps : これを Delphi XE、Windows 7 x64 で実行し、SysListView32 が常に progman (WorkerW ではない) の子であると仮定します。
どんな助けでも大歓迎です^_^