我在一个进程中,利用
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还是无法获取,请问在这种情况下,我如何才能另外的进程获取消息呢?谢谢

解决方案 »

  1.   


    PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
    改为
    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
    应该就可以了,这是典型的无窗口的消息列产生方法。
      

  2.   

    具体改法:
    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);
    }*/
    }
      

  3.   

    int WINAPI WinMain(HINSTANCE hInstance,
                       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;
    }
    }
    }
      

  4.   

    还是不行呀,我这个进程,应该是存在消息队列的,我再把代码贴以下,
    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);
    }
    }
    }
      

  5.   

    你得用PostThreadMessage来发送消息,才能使接收方正常工作。
    我建议你还是建一个隐藏窗口或者消息窗口来完成吧。
      

  6.   

    发送方不动,
    接收方改成这样应该没有问题了:
    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);
    }
    }
    }
      

  7.   

    谢谢你的帮助,我现在已经搞定了。
    原因:
     Sendmessage发送的消息,不会进入消息队列,所以用getmessage是无法获取这个消息的。
    直接在winproc处理函数中,可以获取这个消息并将进行相应的处理。