[Windows程序間通訊]拷貝資料 WM_COPYDATA
阿新 • • 發佈:2022-05-24
使用WM_COPYDATA進行程序間通訊必須依賴Windows的訊息機制,不過此方法可以傳輸大量資料,而且實現簡單。
以下示例修改自Windows官方文件。
首先建立2個Windows桌面程式,為了示例的簡單,將字元型別修改為多位元組(預設為unicode)。
傳送端:
#define MYDISPLAY 1 typedef struct tagMyRec { char s1[64]; char s2[64]; DWORD n; } MYREC; VOID CopyData(HWND hWnd) { COPYDATASTRUCT myCDS = {0}; MYREC myRec= {0}; // Put data into data structure auto hResult = StringCbCopy(myRec.s1, sizeof(myRec.s1), "Claude"); if (hResult != S_OK) { return ; } hResult = StringCbCopy(myRec.s2, sizeof(myRec.s2), "Bell"); if (hResult != S_OK) { return ; } myRec.n = 99;// Fill COPYDATA structure myCDS.dwData = MYDISPLAY; myCDS.cbData = sizeof(myRec); myCDS.lpData = &myRec; auto hwDispatch = FindWindow("RECEIVER", "r"); if (hwDispatch != NULL) { SendMessage(hwDispatch, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)(LPVOID)&myCDS); } else { MessageBox(hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK); } } //////////////////////// LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: //DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); CopyData(hWnd);
出於示例的簡化目的,直接使用IDM_ABOUT觸發拷貝資料訊息.
接收端:
#define MYDISPLAY 1 typedef struct tagMyRec { char s1[64]; char s2[64]; DWORD n; } MYREC; VOID HandleCopyData(HWND hWnd, WPARAM wparam, LPARAM lparam) { auto pCDS = (PCOPYDATASTRUCT)lparam; switch (pCDS->dwData) { case MYDISPLAY: { auto myRec = (MYREC*)pCDS->lpData; MessageBox(hWnd, myRec->s1, myRec->s2, MB_OK); break; } } } /////////////////////////////// LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COPYDATA: HandleCopyData(hWnd, wParam, lParam); break;
接收端只要在訊息處理函式中直接收一下資料就行了。