procedure TForm1.ButtonClick(Sender: TObject);
var
H,R,Hproc:HWND;
pnmhdr:TNMItemActivate;
plvitem:Pointer;
pid,temp:DWORD;
begin
H:=FindWindow(nil,'配置发送服务器');
R:=FindWindowEx(H,0,'SysListView32','');
GetWindowThreadProcessId(H,pid);
Hproc:=OpenProcess(PROCESS_ALL_ACCESS,False,pid);
plvitem:=VirtualAllocEx(Hproc,nil,512,MEM_COMMIT,PAGE_READWRITE); //向目标进程分配内存空间;
pnmhdr.iItem:=0;
pnmhdr.iSubItem:=1;
pnmhdr.hdr.hwndFrom:=R;
pnmhdr.hdr.idFrom:=GetDlgCtrlID(R);
pnmhdr.hdr.code:=NM_DBLCLK; //填充结构;
WriteProcessMemory(Hproc,plvitem,@pnmhdr,SizeOf(pnmhdr),temp); //将结构写入目标进程分配内存空间;
PostMessage(H,WM_NOTIFY,pnmhdr.hdr.idFrom,LongInt(plvitem)); //这里要用PostMessage,否则无效;不知道为什么?
Delay(3000); //发送失效,可以尝试迟时几秒钟;
//以下这两句是关键,很多朋友说像这样的发送什么数据结构,跨进程读写内存,到目标进程总是失败的。其实就在这里了。书写顺序不能倒转,否则不成功。
VirtualFreeEx(Hproc,plvitem,0,MEM_RELEASE);
CloseHandle(Hproc);
双击SysListView32 节点:http://bbs.pediy.com/showthread.php?p=765598