[英]How do I copy data from one windows app to another?
我需要將Win API中的數據從一個應用程序傳輸到另一個應用程序。 在一個應用程序中,我有:
msg_number=RegisterWindowMessage(MY_WINDOW_MSG);
cp_struct.lpData = &fig;
cp_struct.dwData = sizeof(Figure);
cp_struct.cbData = 6666;
SendMessage(HWND_BROADCAST, msg_number, 0, (LPARAM)&cp_struct);
在另一個:
case WM_CREATE:
{
msg_number=RegisterWindowMessage(TEXT(MY_WINDOW_MSG));
}
if(msg_number != 0 && msg == msg_number)
{
reciver_struct = (PCOPYDATASTRUCT)(lParam);
printf("get it %d\n", reciver_struct->cbData);
return 0;
}
但是在此接收器應用程序中,我看到該應用程序獲取了消息,但未獲取結構體中的值。
您有正確的想法,但使用的是錯誤的消息。 您需要將RegisterWindowMessage()
的值分配給cp_struct.dwData
,將數據的字節長度分配給cp_struct.cdData
,然后使用WM_COPYDATA
消息發送cp_struct
(您需要使用其他應用程序的實際HWND
,而不是HWND_BROADCAST
),例如:
msg_number = RegisterWindowMessage(MY_WINDOW_MSG);
if (msg_number != 0)
{
cp_struct.dwData = msg_number;
cp_struct.lpData = &fig;
cp_struct.cbData = sizeof(Figure);
SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cp_struct);
}
。
case WM_CREATE:
{
msg_number = RegisterWindowMessage(MY_WINDOW_MSG);
break;
}
case WM_COPYDATA:
{
reciver_struct = (PCOPYDATASTRUCT)(lParam);
if ((msg_number != 0) && (reciver_struct->dwData == msg_number))
{
Figure *figure = (Figure*) cp_struct.lpData;
... use figure as needed ...
return 0;
}
... pass the message to a default handler for processing ...
break;
}
正確,您不能從另一個應用程序的受保護內存空間中讀取。 從接收應用程序的上下文來看,您傳遞的任何指針或引用都將是無效且無用的。
您可以使用ReadProcessMemory
來完成這項工作,但這需要實際付出一些努力。
通過使用WM_COPYDATA
消息讓Windows為您處理WM_COPYDATA
工作要簡單得多。 這里有一個例子。
但是請小心: WM_COPYDATA
在Windows Vista及更高版本中被UIPI阻止。 您需要通過調用ChangeWindowMessageFilter
函數(在Vista上)或ChangeWindowMessageFilterEx
函數(在Win 7或更高版本上),將該特定消息列入白名單。
如果可以訪問Boost,請考慮Boost.Interprocess 。 如果您無權使用boost,則可以對IPC使用任何數量的Win API方法 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.