如题,网上有c++取Listview内容的代码,也能取到,但是想对外部程序发送消息,使Listview自己选中第一条记录

解决方案 »

  1.   

    uses CommCtrl;var
      Item: TLVItem;
    begin
      p := VirtualAllocEx...//在目标进程分配内存
      Item.stateMask := LVIS_SELECTED;
      Item.state := LVIS_SELECTED;
      WriteProcessMemory...//将本进程Item数据拷贝到目标进程的p位置
      SendMessage(hwndLV{目标ListView句柄}, LVM_SETITEMSTATE, 0{第1条记录}, Integer(p))
    end;
      

  2.   

    参考这个
    http://blog.csdn.net/xuplus/article/details/2294362
      

  3.   

    http://blog.csdn.net/xuplus/article/details/2294362综合修改了下,
    用任务管理器测试通过
    uses Commctrl;// 查找窗口 SysListView32function MyFindWindow: THandle;
    const
      // 父窗口类名数组
      A_szClassName: array[0..2] of PChar = (
        '#32770',
        '#32770',
        'SysListView32'
        );
      // 父窗口标题数组
      A_szWinName: array[0..2] of PChar = (
        'Windows 任务管理器',
        '',
        '任务'
        );
    var
      i: Integer;
      hLastWin: THandle;
    begin
      // 首先求得顶级父窗口
      hLastWin := FindWindow(A_szClassName[0], A_szWinName[0]);
      // 逐次用FindWindowEx函数求出各级子窗口
      for i := 1 to 2 do
      begin
        hLastWin := FindWindowEx(hLastWin, THandle(nil),
          A_szClassName[i], A_szWinName[i]);
      end;
      result := hLastWin;
    end;procedure TForm1.SetItemSelected(nItemIndex: Integer);
    var
      LVI_1: TLVItemA;
      pLVI_2: PLVItemA;
      nRet: LongBool;
      tagPId: DWORD;
      tagPHandle: THandle;
      tagHwnd: THandle;
      lpNumOfBytesW: Cardinal;
    begin
      tagPId := 0;
      tagPHandle := 0;
      tagHwnd := 0;
      lpNumOfBytesW := 0;  tagHwnd := FindWindow('#32770', 'Windows 任务管理器');
      if tagHwnd < 1 then
        Exit;  try
        GetWindowThreadProcessId(tagHwnd, @tagPId); // 取进程ID
        tagPHandle := OpenProcess(
          PROCESS_ALL_ACCESS, False, tagPId); // 获取进程句柄
      except
        CloseHandle(tagPHandle);
      end;  try
        // 向目标远程目标进程申请内存空间
        pLVI_2 := VirtualAllocEx(
          tagPHandle, nil, SizeOf(TLVItemA), MEM_COMMIT, PAGE_READWRITE);
        Assert((pLVI_2 <> nil), '远程内存申请失败');    LVI_1.mask := LVIF_STATE;
        LVI_1.iSubItem := 0;
        LVI_1.state := LVIS_SELECTED or LVIS_FOCUSED;
        LVI_1.stateMask := LVIS_SELECTED or LVIS_FOCUSED;    nRet := WriteProcessMemory(// 将本地进程中的结构写入到目标进程
          tagPHandle, pLVI_2, @LVI_1, SizeOf(TLVItemA), lpNumOfBytesW);
        Assert((nRet), '目标进程写入失败');    tagHwnd := MyFindWindow;
        if tagHwnd < 1 then
          Exit;
        SendMessage(tagHwnd, LVM_SETITEMSTATE, Integer(nItemIndex),
          Integer(pLVI_2));
      except
        VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);
      end;  CloseHandle(tagPHandle);
      VirtualFreeEx(tagPHandle, nil, SizeOf(PLVItem), MEM_FREE);
    end;//用XP的任务管理器做测试
    procedure TForm1.btn1Click(Sender: TObject);
    begin
      // 选中任务管理器->应用程序 下的第2项,
      SetItemSelected(1);
    end;
      

  4.   

    你说的我能实现 现在是灰色的选中。而不是正常我们自己写的那种蓝色的选中 我不是想加高亮。当点击的时候会有一个edit框显示它的值,但是我用Sendmessage发送选中只是灰色的调而且Edit没有反应。
      

  5.   

    你说的我能实现 现在是灰色的选中。而不是正常我们自己写的那种蓝色的选中 我不是想加高亮。当点击的时候会有一个edit框显示它的值,但是我用Sendmessage发送选中只是灰色的调而且Edit没有反应。LVM_EDITLABEL