NM_DBLCLK消息

来源:互联网 发布:淘宝代购是真的吗 编辑:程序博客网 时间:2024/06/06 15:40

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