如何从一个Windows控制台应用程序发送消息到另一个?

时间:2013-11-17 09:52:23

标签: c++ winapi ipc windows-messages

我有一个启动子进程的Windows控制台应用程序。 如何向子进程发送消息? 我找到了像PostMessage()/PeekMessage()这样的函数 - 这就是我所需要的,但据我所知,它在一个应用程序中使用,并使用HWND来识别目标窗口(我在应用程序中没有窗口)。 此外,我还阅读了有关ipc的资料,例如命名管道也需要HWND。 我想要这样的东西:

[program 1]

int main()
{
    CreateProcess(.., processInfo);
    SendMessage(processId, message);
}

[program 2]

int main()
{
    while(1)
    {
//      do thw work
        Sleep(5 * 1000);
//      check message
        if(PeekMessage(message,..))
        {
        break;
        }
    }
}

子进程需要获得它应该完成其工作的消息,而不是立即终止,而是完成当前迭代。这就是为什么我不使用信号和阻止'接收消息'也不合适。

3 个答案:

答案 0 :(得分:3)

[program 1]
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    std::string path = "c:\\program2.exe";
    CreateProcess(path.c_str(), .. , &si, &pi ) ) 
    Sleep(12 * 1000); // let program2 do some work
    PostThreadMessage(pi.dwThreadId, 100, 0, 0);
}

[program 2]
int main(int argc, char * argv[])
{
    MSG message;
    for(int i = 0; i < 1000; i++)
    {
        std::cout << "working" << std::endl;
        Sleep(2 * 1000);
        if(PeekMessage(&message, NULL, 0, 0, PM_NOREMOVE))
        {
            break;
        }
    }
}

答案 1 :(得分:1)

尝试创建Message-Only Window

这是一个仅用于发送和接收消息的窗口。您可以通过将HWND_MESSAGE指定为窗口父级来创建它。

答案 2 :(得分:0)

在程序1中,您应该使用FindWindow函数来处理程序2

然后使用SendMessage函数

[计划1]

    int main()
    {
     HWND hwnd=FindWindow(NULL,formText);//formText name of program 2
        if(hwnd!=0)
        {
            COPYDATASTRUCT cd;
        cd.dwData = 100;
        cd.cbData = 100;
        cd.lpData = msg;                //msg additional data
        SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)(&cd));
        }
    }

[program 2]

    void handlemessage(MSG *msg)
    {
        //handle
    }


    int main()
   {

        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
           handlemessage(&msg);
        }
    }