- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 LVM_GETITEMPOSITION 设置/获取桌面图标位置。设置位置可以按预期工作,但获取位置却不能。
当我发送消息(DeskHandle, LVM_GETITEMPOSITION, 1, ppt);资源管理器崩溃了,这显然是因为 ppt 是我的进程中唯一有效的地址,所以我需要将 dll 注入(inject)资源管理器的内存地址空间..这就是我再次陷入困境的地方
问题是返回位置总是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)
感谢任何帮助^_^
最佳答案
您无法将 32 位 DLL 注入(inject) 64 位进程。为了将 DLL 注入(inject) 64 位资源管理器,您需要获取 XE2 或 XE3 并构建 64 位 DLL。或者,如果您无法访问 64 位 Delphi,则用 C++ 编写这部分代码。
事实上,您的代码无论如何都不会注入(inject)。它只是从您的进程中调用 SendMessage。注入(inject)通常涉及对 CreateRemoteThread 的调用。
事实上你不需要注入(inject)。您可以使用VirtualAllocEx
在资源管理器进程中分配内存。然后,您可以在 SendMessage
中传递该地址。由于该内存位于其他进程中,因此您必须使用 ReadProcessMemory 和 WriteProcessMemory 来访问它。不过,您仍然需要在 64 位进程中执行此操作。
我本以为 shell 为您提供了获取此信息的工具,而无需破解资源管理器进程的内存。
关于delphi - LVM_GETITEMPOSITION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12374011/
我尝试使用 LVM_GETITEMPOSITION 设置/获取桌面图标位置。设置位置可以按预期工作,但获取位置却不能。 当我发送消息(DeskHandle, LVM_GETITEMPOSITION,
我是一名优秀的程序员,十分优秀!