使用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机制,如管道、共享内存或消息队列等。