使用SendMessage 和PostMessage 出現的坑。。。
#include <iostream> #include <Windows.h> #include <string> #include <memory> using namespace std; typedef struct tagMYREC { char s1[80]; char s2[80]; DWORD n; } MYREC; MYREC MyRec; int main() { //COPYDATASTRUCT MyCDS; //MyCDS.dwData = 0; // function identifier //MyCDS.cbData = sizeof(MyRec); // size of data //MyCDS.lpData = &MyRec; // data structure //MyRec.n = 99; //strcpy(MyRec.s1, "111"); //strcpy(MyRec.s2, "222"); HWND handle = FindWindow(NULL, L"windows windows");//用戶可能有替換窗口名的操作行爲 int number = 11; const char a[100] = {"你好你好你好"}; if (handle != NULL) { SendMessage(handle, WM_COPYDATA, number, (LPARAM)a); } cout << 1; }
case WM_COPYDATA: { //pMyCDS = (PCOPYDATASTRUCT)lParam; //char str1[100]; //char str2[100]; //DWORD a; //strcpy(str1, (LPSTR)((MYREC*)(pMyCDS->lpData))->s1); //strcpy(str2, (LPSTR)((MYREC*)(pMyCDS->lpData))->s2); //a = (DWORD)((MYREC*)(pMyCDS->lpData))->n; char str1[100]; strcpy(str1, (LPSTR)lParam); break; }
在同一進程下, 使用自己定義的 是沒有問題的, 但是跨進程的時候, 消息要用
WM_COPYDATA 我是用自己定義的 WM_USER + 0x40 就傳遞不過去。。。。一直無訪問權限
WM_COPYDATA
消息是一種用於進程間通信(IPC)的機制,具有以下優點和一些限制:
優點:
-
簡單易用:使用
WM_COPYDATA
消息進行進程間通信相對簡單,無需引入複雜的IPC機制。 -
跨進程通信:
WM_COPYDATA
消息允許在不同進程之間傳遞數據。通過指定目標窗口的句柄,可以向其他進程發送消息並傳遞數據。 -
數據複製:
WM_COPYDATA
消息會在發送方和接收方之間自動進行數據複製。這樣,發送方可以安全地釋放或修改原始數據,而不會影響接收方對數據的訪問。 -
適用於任意數據:
WM_COPYDATA
消息可以傳遞任意類型的數據,只要數據大小適合COPYDATASTRUCT
結構的要求。
缺點:
-
數據大小限制:
COPYDATASTRUCT
結構中的cbData
字段有一個最大值限制,通常爲64KB。如果需要傳遞更大的數據,可能需要使用其他IPC機制。 -
同步通信:
WM_COPYDATA
消息是同步的,發送方會阻塞直到接收方處理完消息。如果需要實現異步通信,可能需要使用其他機制。 -
進程安全性:使用
WM_COPYDATA
消息時,發送方和接收方必須具有相應的安全權限來進行跨進程通信。
綜上所述,WM_COPYDATA
消息是一種簡單且適用於進程間傳遞消息的方式,但也需要根據具體的需求和限制進行權衡和選擇。對於更復雜的進程間通信需求,可能需要考慮其他IPC機制,如管道、共享內存或消息隊列等。