-->

how to send a message from one windows console app

2019-03-29 07:11发布

问题:

I have a windows console application which starts child process. How can I send a message to child process? I found functions like PostMessage()/PeekMessage() - that's what I need, but as I understand, it is used inside one application, and uses HWND to identify the target window (I have no windows in application). Also I've read materials about ipc, for example named pipes demand HWND too. I want something like that:

[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;
        }
    }
}

Child process needs to get message that it should finish its work, not terminate immediately, but finish current iteration. That's why I don't use signals and blocking 'receive message' is not appropriate too.

回答1:

[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;
        }
    }
}


回答2:

Try creating a Message-Only Window.

This is a window which is only used for sending and receiving messages. You can create it by specifying HWND_MESSAGE as the window parent.



回答3:

In program 1 you should use the FindWindow function to get handle of program 2

and then use SendMessage function

[program 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);
        }
    }