我想在服务里面处理一个系统消息应该怎么做,新生成的服务程序在下面代码:
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
        DispatchMessage(&msg);
时就挂在while里面不执行了,我尝试了一下是GateMessage好像挂起了一样

解决方案 »

  1.   

    GateMessage block住就是因为没收到任何的消息。
      

  2.   

    我在系统外面执行了
    ::PostMessage(HWND_BROADCAST, msgExit, NULL, NULL);
    应该是个全局的消息,别的进程都能收到,为什么服务里面还是挂着的呢
      

  3.   

    HWND_BROADCAST : The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.
      

  4.   

    HWND hWnd = CreateWindow("static", 0, WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_POPUP,
          0, 0, 1, 1, NULL, NULL, NULL, NULL);
    while (GetMessage(&msg, 0, 0, 0))
            DispatchMessage(&msg);
    就可以了.
    (人家要窗口嘛,给个窗口人家咯.)
    (我试过OK的)
      

  5.   

    把GetMessage改成PeekMessage,GetMessage是同步的会被block住,一直到有消息返回。消息循环不用窗口也可以,因为GetMessage/PeekMessage是GUI API,一旦调用系统会为你创建消息队列的
      

  6.   

    第二个参数传INVALID_HANDLE_VALUE,才能取到线程消息
      

  7.   

    CrowReturns() 消息循环不用窗口也可以
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    单看这句确实没问题,但楼主是用::PostMessage(HWND_BROADCAST, msgExit, NULL, NULL);这句发全局消息给服务程序的,对于HWND_BROADCAST的情况,我上面已经列出SDK的说明,显然没有窗口是不行的。
    当然,如果不加窗口,不能用HWND_BROADCAST这种方式发消息给服务程序,但可以用PostThreadMessage(有的放矢是可以的),那个线程ID可以有好多方法传给客户端,这里我建议使用file_mapping。