情况是:外部程序有一个目录选择对话框,我想在后台通过sendmessage选择指定的目录,已经在SPY++中找到“浏览文件夹"的句柄”,在接下去就找不到其它窗口了,只找到一个“SHBrowseForFolder ShellNameSpace Control”窗口,例如我想选择:"
e:\\vc"这样的路径,只找到“浏览文件夹“句柄,接下去就不知道怎么办了?另外,想知道WM_COPYDATA能不能发送消息给另外一个进程中的static edit框?WM_SETTEXT可以发送,但只是表面上改变了static edit框的内容,实际上是没有改变的,用WM_COPYDATA消息写入COPYDATASTRUCT结构到外部进程的内存中可行不?
下面是发送WM_COPYDATA的代码,麻烦各位帮帮忙,主要看看第一个问题谢谢!
BOOL SetOutPut(HWND Lv,CString str)
{
bool result = false;
DWORD processId = NULL;
GetWindowThreadProcessId(Lv, &processId);
if (processId == NULL) return false;
HANDLE process = ::OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,processId);
if (process == NULL) return false;
PVOID buffer = VirtualAllocEx(process,NULL,sizeof(COPYDATASTRUCT),MEM_COMMIT,PAGE_READWRITE);
if(buffer != NULL)
{
COPYDATASTRUCT CopyData;
CopyData.cbData = sizeof(str);
CopyData.dwData = 0;
CopyData.lpData = str.GetBuffer(CopyData.cbData);
WriteProcessMemory(process, buffer, &CopyData, sizeof(COPYDATASTRUCT),NULL);
if (::SendMessage(Lv, WM_COPYDATA, 0, (LPARAM)buffer) != 0) result = true;
VirtualFreeEx(process,buffer,sizeof(CopyData),MEM_DECOMMIT);
}
CloseHandle(process);
return result;
}
return true;
}
e:\\vc"这样的路径,只找到“浏览文件夹“句柄,接下去就不知道怎么办了?另外,想知道WM_COPYDATA能不能发送消息给另外一个进程中的static edit框?WM_SETTEXT可以发送,但只是表面上改变了static edit框的内容,实际上是没有改变的,用WM_COPYDATA消息写入COPYDATASTRUCT结构到外部进程的内存中可行不?
下面是发送WM_COPYDATA的代码,麻烦各位帮帮忙,主要看看第一个问题谢谢!
BOOL SetOutPut(HWND Lv,CString str)
{
bool result = false;
DWORD processId = NULL;
GetWindowThreadProcessId(Lv, &processId);
if (processId == NULL) return false;
HANDLE process = ::OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,processId);
if (process == NULL) return false;
PVOID buffer = VirtualAllocEx(process,NULL,sizeof(COPYDATASTRUCT),MEM_COMMIT,PAGE_READWRITE);
if(buffer != NULL)
{
COPYDATASTRUCT CopyData;
CopyData.cbData = sizeof(str);
CopyData.dwData = 0;
CopyData.lpData = str.GetBuffer(CopyData.cbData);
WriteProcessMemory(process, buffer, &CopyData, sizeof(COPYDATASTRUCT),NULL);
if (::SendMessage(Lv, WM_COPYDATA, 0, (LPARAM)buffer) != 0) result = true;
VirtualFreeEx(process,buffer,sizeof(CopyData),MEM_DECOMMIT);
}
CloseHandle(process);
return result;
}
return true;
}
http://www.vckbase.com/document/viewdoc/?id=1556
http://www.vckbase.com/document/viewdoc/?id=1712
要实现控制树控件是很费劲的,需要循环发TVM_GETNEXTITEM、TVM_GETITEM和TVM_EXPAND消息,逐层查找目标,最终找到后发TVM_SELECTITEM选中目标,再发BN_CLICKED命令消息。
WM_COPYDATA是进程间利用消息传递数据用的,没有其它作用。static edit是什么意思?是static还是edit?为什么说WM_SETTEXT只改了表面而实际上没有改?
获得的路径,我直接用WM_SETTEXT改变它,当实际运行时用的还是之前的路径,这个问题应该是外部程
序的设计跟我想的不一样。在网上看到WM_COPYDATA可以实现改变外部程序static控件的效果,所以问问,如果不行就慢慢控制树
控件算了谢谢两位啊!