C++ 如何在另一个进程中通过其句柄设置窗口文本?
出于我的目的,我需要使用C++ 如何在另一个进程中通过其句柄设置窗口文本?,c++,windows,winapi,ipc,messaging,C++,Windows,Winapi,Ipc,Messaging,出于我的目的,我需要使用HWND句柄为属于另一个进程的窗口设置文本。我提出了以下代码,但似乎不起作用: BOOL SetWindowTextInAnotherProcess(HWND hWnd, LPCTSTR pStrText) { //Set text of the 'hWnd' (assuming that 'hWnd' is in another process) //'pStrText' = ASCIIZ string to set //RETURN:
HWND
句柄为属于另一个进程的窗口设置文本。我提出了以下代码,但似乎不起作用:
BOOL SetWindowTextInAnotherProcess(HWND hWnd, LPCTSTR pStrText)
{
//Set text of the 'hWnd' (assuming that 'hWnd' is in another process)
//'pStrText' = ASCIIZ string to set
//RETURN:
// = TRUE if done
BOOL bRes = FALSE;
if(hWnd &&
pStrText)
{
DWORD dwProcID = 0;
::GetWindowThreadProcessId(hWnd, &dwProcID);
if(dwProcID)
{
HANDLE hProc = ::OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, dwProcID);
if(hProc)
{
int nLn = lstrlen(pStrText);
int ncbSzStr = (nLn + 1) * sizeof(TCHAR);
VOID* pVMem = ::VirtualAllocEx(hProc, NULL, ncbSzStr, MEM_COMMIT, PAGE_READWRITE);
if(pVMem)
{
SIZE_T sztWrtn = 0;
if(::WriteProcessMemory(hProc, pVMem, pStrText, ncbSzStr, &sztWrtn))
{
if(sztWrtn == ncbSzStr)
{
DWORD_PTR dwMsgRes = 0xCCCCABAB;
if(::SendMessageTimeout(hWnd, WM_SETTEXT, NULL, (LPARAM)pVMem,
SMTO_NORMAL | SMTO_ABORTIFHUNG | SMTO_ERRORONEXIT,
1000 * 2,
&dwMsgRes))
{
//Check result
if(dwMsgRes != 0xCCCCABAB &&
dwMsgRes == TRUE)
{
//Done
bRes = TRUE;
}
}
}
}
//Free mem
::VirtualFreeEx(hProc, pVMem, ncbSzStr, MEM_DECOMMIT);
}
::CloseHandle(hProc);
}
}
}
return bRes;
}
SendMessageTimeout
返回FALSE
和GetLastError
返回0
知道我做错了什么吗
另外,两个进程在同一桌面上非提升运行。标准窗口消息跨进程边界封送其参数。在尝试手动封送参数时,您传递了一个无效指针。@IInspectable:那么您的意思是我可以只执行
SendMessage(hWnd,WM_SETTEXT,NULL,(LPARAM)pstrext)代码>?这就是文档所说的:“系统只对系统消息(范围为0到(WM_用户-1))进行编组。要将其他消息(那些>=WM_用户)发送到另一个进程,必须进行自定义编组。”WM_SETTEXT
具有数值0xC,并且属于系统封送的消息范围。@IInspectable:OK。这太过分了:)您的实现是执行自定义封送处理的一种方法。另一个选项是在目标进程中使用远程线程的文件映射对象。您还可以将DLL与共享数据段一起使用。