你知道,服务是系统用户下的程序,属于控制台程序,一般是没有GUI的,这也就意味着它没有消息循环,不能接受消息。解决的办法一如 xstring(麻雀) 所说,但是并不根本。还有一种办法,就是把当前的桌面绑定到这个服务上,用SetThreadDesktop,然后启动一个消息线程,可以重载CCmdTarget来创建,这样就可以接受消息映射了。

解决方案 »

  1.   

    我的服务开启了一个隐藏窗口用于解手消息并分发到消息处理线程,同时还开启了两个线程,其中一个用来开启一个套接字接收数据包,另一个则处理接收的数据包,服务总共开启一个窗口、三个用户界面线程。 我在服务的ServiceMain中加了如如下语句:
    void WINAPI ServiceMain(DWORD argc, LPTSTR argv[])
    {
        HDESK   hdesk;
        HWINSTA hwinsta;
            hwinsta = OpenWindowStation("winsta0", FALSE,
                                      WINSTA_ACCESSCLIPBOARD   |
                                      WINSTA_ACCESSGLOBALATOMS |
                                      WINSTA_CREATEDESKTOP     |
                                      WINSTA_ENUMDESKTOPS      |
                                      WINSTA_ENUMERATE         |
                                      WINSTA_EXITWINDOWS       |
                                      WINSTA_READATTRIBUTES    |
                                      WINSTA_READSCREEN        |
                                      WINSTA_WRITEATTRIBUTES);
        if (hwinsta == NULL)
    {
    LogEvent(_T("open window station err"),0,FALSE);
            
    }    if (!SetProcessWindowStation(hwinsta))
    {
    LogEvent(_T("Set window station err"),0,FALSE);
         }    hdesk = OpenDesktop("default", 0, FALSE,
                                DESKTOP_CREATEMENU |
    DESKTOP_CREATEWINDOW |
                                DESKTOP_ENUMERATE    |
                                DESKTOP_HOOKCONTROL  |
                                DESKTOP_JOURNALPLAYBACK |
                                DESKTOP_JOURNALRECORD |
                                DESKTOP_READOBJECTS |
                                DESKTOP_SWITCHDESKTOP |
                                DESKTOP_WRITEOBJECTS);
    if (hdesk == NULL)
    {
    LogEvent(_T("Open desktop err"),0,FALSE);
            
    } SetThreadDesktop(hdesk);
             
              hSStat = RegisterServiceCtrlHandler( ServiceName, ServerCtrlHandler); if (hSStat == 0) 
    LogEvent (_T("Cannot register control handler"), 100, TRUE); LogEvent (_T("Control handler registered successfully"), 0, FALSE);
     
             SetStatus(hSStat, SERVICE_START_PENDING);
              OpenThread();
      
    while(m_ServicWndPtr->ee)
    {
      Sleep(1000);
    }
    SetStatus(hSStat, SERVICE_STOPPED);
    LogEvent (_T("服务状态1转为:SERVICE_STOP"), 0, FALSE);
    }void  OpenThread()
    {   
    //与警情服务器通信线程  
    m_ServicWndPtr=(CServiceWnd *)AfxBeginThread(RUNTIME_CLASS(CServiceWnd));

    //处理警情服务器命令包线程
        m_threadPtr =(CThread *)AfxBeginThread(RUNTIME_CLASS(CThread)); //处理TSAPI消息线程
        m_messthreadptr =(CMessThread *)AfxBeginThread(RUNTIME_CLASS(CMessThread));  
     .....................
    }
        但还是无法收到消息,但奇怪的是当我卸载这个服务时却收到了以前应该收到的所有消息,这说明消息已经发到了我的消息分发窗口。但为什么在服务运行期间,该窗口却无法收到消息了?