Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在另一个进程中通过其句柄设置窗口文本?_C++_Windows_Winapi_Ipc_Messaging - Fatal编程技术网

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与共享数据段一起使用。