跨进程发送NM_CLICK消息到另一个进程的ListCtrl,我是用读写远程内存的方式进行的,可以得到远程ListCtrl的内容,但就是发消息,没见有响应,当然如果是同一个进程的话,是会有响应的!
代码地址:http://www.cfxy.net/vc/listview.zip 用setwinodwshookex的方式是可以达到要求的,不过我嫌太麻烦了,不知道大家能否帮助调试出来!
 调试出来后,发到我邮箱:[email protected]
谢谢!

解决方案 »

  1.   

    void CListviewDlg::OnButton1() 
    {
    HWND hwnd1=::FindWindow(NULL,"远程窗口");
    NMITEMACTIVATE data;
    ZeroMemory(&data, sizeof(data));
    data.hdr.code = NM_CLICK;
    data.hdr.hwndFrom = ::GetDlgItem(hwnd1,IDC_LIST1);
    data.hdr.idFrom = IDC_LIST1;
    data.iItem = 0;//::SetForegroundWindow(hwnd1);
    //::ShowWindow(hwnd1,SW_SHOWNORMAL);
    ::SendMessage(GetSafeHwnd(),WM_NOTIFY,  (WPARAM)IDC_LIST1, (LPARAM) &data  );//GetSafeHwnd()?是 hwnd1吧
    }
      

  2.   

    哦,呵呵,这是同一个进程发送啊,两个都可以了! 同一个进程是可以发送NM_CLICK消息的,可是不同的进程,却总发不了! 我实现了跨进程读取listctrl内容的功能,但一直没完成发送NM_CLICK消息的功能!
      

  3.   

    发送给自定义的消息,在自定义接受函数中在发送你的NM_CLICK消息或是调用点击函数
      

  4.   

    单纯消息的话应该可以发出,对方也能收到,但消息所带的句柄为本进程内的地址,对方进程在此地址上很可能是无效值,而且容易造成对方内存违规访问。
    要想在进程间传递数据,就要打破进程的边界,方法很多。参考Jeffery Ricther的<<Windows核心编程>>
    MSDN上说明NM_CLICK的lparam参数传递的是一个指针,这个指针指。NM_CLICK    lpnmitem = (LPNMITEMACTIVATE) lParam;
    Parameterslpnmitem
    Version 4.71. Pointer to an NMITEMACTIVATE structure that contains additional information about this notification message. The iItem, iSubItem, and ptAction members of this structure contain information about the item.
      

  5.   

    大哥们,摆脱看下我的代码啊! 我都说了,用setwindowshookex的方法,注入到远程进程,可以实现,可是我想用远程内存读写的方式完成这个功能!      我不知道,是不是还有那个地址或者什么东西,需要在远程开辟的,我只是开辟了一个sizeof(NMITEMACTIVATE)大小的空间!
      

  6.   

    NM_CLICK是列表控件在鼠标点击时发送给父窗口的通知。你应该发送WM_开头的鼠标消息。
      

  7.   

    谢谢蒋晟回答啊!
     我知道这是鼠标点击时发送的通知,可是不可以用消息模拟吗???
    在同一个窗口里面,是可以用HWND hwnd1=::FindWindow(NULL,"远程窗口");
    NMITEMACTIVATE data;
    ZeroMemory(&data, sizeof(data));
    data.hdr.code = NM_CLICK;
    data.hdr.hwndFrom = ::GetDlgItem(hwnd1,IDC_LIST1);
    data.hdr.idFrom = IDC_LIST1;
    data.iItem = 0;//::SetForegroundWindow(hwnd1);
    //::ShowWindow(hwnd1,SW_SHOWNORMAL);
    ::SendMessage(hwnd1,WM_NOTIFY,  (WPARAM)IDC_LIST1, (LPARAM) &data  ); 
     来模拟发送通知的!
    所以我想用远程的来模拟,我想消息队列处理方式都一样吧,就是要远程内存读写方面花下手脚!
    如果有鼠标消息,那就失去了意义了,因为无法包含丰富的项目和子项目信息,还要根据坐标来定位某一列,比较麻烦!  有空可以帮我下载http://www.cfxy.net/vc/listview.zip调试一下,看我其他地方是不是出错了!
      

  8.   

    你可以用Spy++看看点击的时候窗口接收到什么消息,然后发送同样的消息
      

  9.   

    在同一个进程里,单击那个发送消息的按钮,
    我只看到两个这个消息:WM_GETDLGCODE,前面一个带参数,后面一个就是单纯的WM_GETDLGCODE 本来我就是采取模拟发送同样的消息来完成啊,我在同一个进程里面发送
    HWND hwnd1=::FindWindow(NULL,"远程窗口");
    NMITEMACTIVATE data;
    ZeroMemory(&data, sizeof(data));
    data.hdr.code = NM_CLICK;
    data.hdr.hwndFrom = ::GetDlgItem(hwnd1,IDC_LIST1);
    data.hdr.idFrom = IDC_LIST1;
    data.iItem = 0;//::SetForegroundWindow(hwnd1);
    //::ShowWindow(hwnd1,SW_SHOWNORMAL);
    ::SendMessage(hwnd1,WM_NOTIFY,  (WPARAM)IDC_LIST1, (LPARAM) &data  ); 
    不是有反应吗? 为什么用其他进程发送,就没作用了呢??? 应该不是进程边界问题吧,我不是采用了远程内存读写方式吗?而且可以读回来,发现我写入的消息值,确实已经copy到了远程进程呢!     唉,谁有空帮助调试一下啊!
      

  10.   

    ::SendMessage(hwnd1,WM_NOTIFY,  (WPARAM)IDC_LIST1, (LPARAM) &data  ); 
    这个 data  指针能不能跨越进程啊 ?
      

  11.   

    这个 data  指针能不能跨越进程
    //不能得搂主能不能考虑开辟一个共享内存,把这个地址发过去呢?
      

  12.   

    楼上两位有兴趣看下我的代码啊!
    ::SendMessage(hwnd1,WM_NOTIFY,  (WPARAM)IDC_LIST1, (LPARAM) &data  ); 
    这是本进程内发送方式!  跨进程的是pdata=(NMITEMACTIVATE*)VirtualAllocEx(process, NULL, sizeof(NMITEMACTIVATE), MEM_COMMIT, PAGE_READWRITE);
     ::SendMessage(hwnd1,WM_NOTIFY,  (WPARAM)IDC_LIST1, (LPARAM) &pdata  );        谁有空帮我调试一下啊!理论知识,我已经收集蛮多了,不知道具体操作是哪里出问题了!