簡體   English   中英

如何發送進程間消息?

[英]How to send inter-process message?

PostMessageSendNotifyMessage失敗,並顯示ERROR_MESSAGE_SYNC_ONLY 所以我剩下的唯一選擇是SendMessage但它似乎沒有做任何事情-它返回零,而GetLastErrorERROR_ENVVAR_NOT_FOUND

這是我的發件人代碼(過程1):

SendMessage(FindWindowEx(HWND_MESSAGE,NULL,"Message","serverwindow"),WM_COPYDATA,HWND_MESSAGE,
        &(COPYDATASTRUCT){0, sizeof "localhost", "localhost"})

和接收方(進程0):

HWND hWnd=CreateWindowExA(0,"Message","serverwindow",0,0,0,0,0,HWND_MESSAGE,NULL,GetModuleHandle(NULL),NULL);
MSG msg;
while (Sleep(500), true)
while (PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
    printf("message recieved\n");

正如David在評論中所說, WM_COPYDATA是已發送的消息,它不是排隊的消息,因此像您所示的消息循環永遠不會看到(Get|Peek)Message()輸出的(Get|Peek)Message() 消息直接傳遞到接收窗口的WindowProc ,因此需要在此處進行處理。 但是,當跨線程/進程邊界發送消息時,接收線程仍需要運行消息循環,以便在(Get|Peek)Message()等待排隊的消息時將發送的消息分派到該線程的窗口中。

根據SendMessage()文檔:

將指定的消息發送到一個或多個窗口。 SendMessage函數調用指定窗口的窗口過程,直到該窗口過程處理完該消息后才返回。

...

如果指定的窗口是由調用線程創建的,則該窗口過程將作為子例程立即被調用。 如果指定的窗口是由其他線程創建的,則系統切換到該線程並調用適當的窗口過程。 僅當接收線程執行消息檢索代碼時,才處理線程之間發送的消息。 發送線程被阻塞,直到接收線程處理該消息為止。 但是,發送線程將在等待其消息處理的同時處理傳入的非排隊消息。 為防止這種情況,請使用已設置SMTO_BLOCK的SendMessageTimeout 有關非排隊消息的更多信息,請參閱非排隊消息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM