能给个例子吗

解决方案 »

  1.   

    进程之间的通信要么用内存映射文件,要么用管道,当然也可以用DDE、OLE等的。
      

  2.   

    windows消息单元中没有listitem的消息,我写的如下,方法应该类似如下
    procedure TForm1.Button1Click(Sender: TObject);
     var
      Hand:hwnd;
      otherHand:hwnd;
      Count,index:integer;
      lvConstructor:LV_ITEM ;
      strText:TstringList;
    begin
     strText:=TstringList.Create;
    Hand:=FindWindow(nil,'Form1');
    otherHand:=FindWindowex(Hand,0,nil,'listview');
    Count:=Sendmessage(otherHand,LVM_GETITEMTEXT,0,0);
    if Count >0 then
     for index:=0 to Count-1 do
         begin
            SendMessage(otherHand,LVM_GETITEMTEXT,index,lvConstructor );
            strText.Add(lvConstructor.pszText);
         end;
    strText.free;
    end;
      

  3.   

    strText在释放之前保存着item的text;
      

  4.   

    前面加上 uses Commctrl,该消息在该单元中
      

  5.   

    //Win2000+Delphi6uses CommCtrl;function VirtualAllocEx(hProcess: Cardinal; lpAddress: Pointer;
      dwSize, flAllocationType, flProtect: Cardinal): Pointer; stdcall;
      external kernel32 name 'VirtualAllocEx';
    function VirtualFreeEx(hProcess: Cardinal; lpAddress: Pointer;
      dwSize, dwFreeType: Cardinal): Boolean; stdcall;
      external kernel32 name 'VirtualFreeEx';
        
    const cHotKeyWinF2 = 1;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.Title := '获取ListView内容 1.0';
      Caption := Application.Title;
      RegisterHotKey(Handle, cHotKeyWinF2, MOD_WIN, VK_F2);
    end;procedure TForm1.WMHOTKEY(var Msg: TWMHOTKEY);
    var
      I, J: Integer;
      S: string;
      vItem: TLVItem;
      vCount: Integer;
      vHandle: THandle;
      vBuffer: array[0..255] of Char;
      pBuffer: PChar;
      vProcess: THandle;
      vProcessId: DWORD;
      vPointer: Pointer;
      vNumberOfBytesRead: Cardinal;
    begin
      case Msg.HotKey of
        cHotKeyWinF2: begin
          MemoText.Clear;
          FillChar(vBuffer, 256, 0);
          vHandle := WindowFromPoint(Point(Mouse.CursorPos.X, Mouse.CursorPos.Y));
          vCount := ListView_GetItemCount(vHandle);
          if vCount = 0 then Exit;
          GetWindowThreadProcessId(vHandle, @vProcessId);
          vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
            PROCESS_VM_WRITE, False, vProcessId);
          vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
            PAGE_READWRITE);
          try
            for I := 0 to vCount - 1 do begin
              S := '';
              for J := 0 to StrToIntDef(EditCount.Text, 0) - 1 do begin
                with vItem do begin
                  mask := LVIF_TEXT;
                  iItem := I;
                  iSubItem := J;
                  cchTextMax := 255;
                  pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
                end;
                WriteProcessMemory(vProcess, vPointer, @vItem,
                  SizeOf(TLVItem), vNumberOfBytesRead);
                SendMessage(vHandle, LVM_GETITEM, I, lparam(vPointer));
                pBuffer := vBuffer;
                ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
                  pBuffer, DWORD(256), vNumberOfBytesRead);
                S := S + #9 + vBuffer;
              end;
              Delete(S, 1, 1);
              MemoText.Lines.Add(S);
            end;
          finally
            VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
            CloseHandle(vProcess);
          end;
        end;
      end;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      UnRegisterHotKey(Handle, cHotKeyWinF2);
    end;