[英]How to send inter-process message?
PostMessage
和SendNotifyMessage
失敗,並顯示ERROR_MESSAGE_SYNC_ONLY
。 所以我剩下的唯一選擇是SendMessage
但它似乎沒有做任何事情-它返回零,而GetLastError
為ERROR_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.