跨进程发送NM_CLICK消息到另一个进程的ListCtrl,我是用读写远程内存的方式进行的,可以得到远程ListCtrl的内容,但就是发消息,没见有响应,当然如果是同一个进程的话,是会有响应的!
代码地址:http://www.cfxy.net/vc/listview.zip 用setwinodwshookex的方式是可以达到要求的,不过我嫌太麻烦了,不知道大家能否帮助调试出来!
调试出来后,发到我邮箱:[email protected]
谢谢!
代码地址:http://www.cfxy.net/vc/listview.zip 用setwinodwshookex的方式是可以达到要求的,不过我嫌太麻烦了,不知道大家能否帮助调试出来!
调试出来后,发到我邮箱:[email protected]
谢谢!
{
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吧
}
要想在进程间传递数据,就要打破进程的边界,方法很多。参考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.
我知道这是鼠标点击时发送的通知,可是不可以用消息模拟吗???
在同一个窗口里面,是可以用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调试一下,看我其他地方是不是出错了!
我只看到两个这个消息: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到了远程进程呢! 唉,谁有空帮助调试一下啊!
这个 data 指针能不能跨越进程啊 ?
//不能得搂主能不能考虑开辟一个共享内存,把这个地址发过去呢?
::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 ); 谁有空帮我调试一下啊!理论知识,我已经收集蛮多了,不知道具体操作是哪里出问题了!