我在一个进程中,利用
hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
if( hwDispatch != NULL )
SendMessage( hwDispatch,
WM_COPYDATA,
NULL,
(LPARAM) (LPVOID) &MyCDS );
发送一个消息到另外一个进程。
另外一个进程是这样的(不是基本Dialog的):
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
g_hwnd = NULL; // 执行应用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
} HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MAILCLIENT)); PushmailMsgpacket msgPacket;
memset(&msgPacket, 0, sizeof(PushmailMsgpacket)); // 主消息循环:
//while (GetMessage(&msg, NULL, 0, 0))
while (1)
{
//获取短信解析模块传递的消息
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); if (msg.message == NULL)
{
continue;
}
if (msg.message == WM_COPYDATA)
{
pMyCDS = (PCOPYDATASTRUCT)msg.lParam;
PushmailMsgpacket * ppm = (PushmailMsgpacket*)pMyCDS->lpData;
memcpy((void *)&msgPacket, (void *)ppm, sizeof(PushmailMsgpacket));
break;
}
/*if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}*/
}
}
在这个里面,我用getmessage的时候,无法获取消息,利用peekmessage还是无法获取,请问在这种情况下,我如何才能另外的进程获取消息呢?谢谢
hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
if( hwDispatch != NULL )
SendMessage( hwDispatch,
WM_COPYDATA,
NULL,
(LPARAM) (LPVOID) &MyCDS );
发送一个消息到另外一个进程。
另外一个进程是这样的(不是基本Dialog的):
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
g_hwnd = NULL; // 执行应用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
} HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MAILCLIENT)); PushmailMsgpacket msgPacket;
memset(&msgPacket, 0, sizeof(PushmailMsgpacket)); // 主消息循环:
//while (GetMessage(&msg, NULL, 0, 0))
while (1)
{
//获取短信解析模块传递的消息
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); if (msg.message == NULL)
{
continue;
}
if (msg.message == WM_COPYDATA)
{
pMyCDS = (PCOPYDATASTRUCT)msg.lParam;
PushmailMsgpacket * ppm = (PushmailMsgpacket*)pMyCDS->lpData;
memcpy((void *)&msgPacket, (void *)ppm, sizeof(PushmailMsgpacket));
break;
}
/*if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}*/
}
}
在这个里面,我用getmessage的时候,无法获取消息,利用peekmessage还是无法获取,请问在这种情况下,我如何才能另外的进程获取消息呢?谢谢
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
改为
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
应该就可以了,这是典型的无窗口的消息列产生方法。
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
while (GetMessage(&msg, NULL, 0, 0))
//while (1)
{
//获取短信解析模块传递的消息
//PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); //if (msg.message == NULL)
//{
// continue;
//}
if (msg.message == WM_COPYDATA)
{
pMyCDS = (PCOPYDATASTRUCT)msg.lParam;
PushmailMsgpacket * ppm = (PushmailMsgpacket*)pMyCDS->lpData;
memcpy((void *)&msgPacket, (void *)ppm, sizeof(PushmailMsgpacket));
break;
}
/*if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}*/
}
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
PushmailMsgpacket msgPacket;
memset(&msgPacket, 0, sizeof(PushmailMsgpacket));
// 产生消息队列
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (msg.message == WM_COPYDATA)
{
pMyCDS = (PCOPYDATASTRUCT)msg.lParam;
PushmailMsgpacket * ppm = (PushmailMsgpacket*)pMyCDS->lpData;
memcpy((void *)&msgPacket, (void *)ppm, sizeof(PushmailMsgpacket));
break;
}
}
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
g_hwnd = NULL; // 执行应用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
} HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MAILCLIENT)); PushmailMsgpacket msgPacket;
memset(&msgPacket, 0, sizeof(PushmailMsgpacket)); // 产生消息队列
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); // 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (msg.message == NULL)
{
continue;
}
if (msg.message == WM_COPYDATA)
{
pMyCDS = (PCOPYDATASTRUCT)msg.lParam;
PushmailMsgpacket * ppm = (PushmailMsgpacket*)pMyCDS->lpData;
memcpy((void *)&msgPacket, (void *)ppm, sizeof(PushmailMsgpacket));
break;
}
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
我建议你还是建一个隐藏窗口或者消息窗口来完成吧。
接收方改成这样应该没有问题了:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
g_hwnd = NULL; // 执行应用程序初始化:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
} HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MAILCLIENT)); PushmailMsgpacket msgPacket;
memset(&msgPacket, 0, sizeof(PushmailMsgpacket)); // 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
//获取短信解析模块传递的消息
if (msg.message == WM_COPYDATA)
{
pMyCDS = (PCOPYDATASTRUCT)msg.lParam;
PushmailMsgpacket * ppm = (PushmailMsgpacket*)pMyCDS->lpData;
memcpy((void *)&msgPacket, (void *)ppm, sizeof(PushmailMsgpacket));
break;
}
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
原因:
Sendmessage发送的消息,不会进入消息队列,所以用getmessage是无法获取这个消息的。
直接在winproc处理函数中,可以获取这个消息并将进行相应的处理。