一个服务程序打开/创建了一个WindowStation
并在该WindowStation上创建自己的Desktop
现在需要实现从登录到该计算机的用户进程向该服务发送消息
所以希望能SendMessage
可是仅服务程序自己的消息能收到
其他进程检查IsWindow()就失败
所以不能SendMessage,发了消息服务程序也收不到
应该是由于跨WindowStation或Desktop
哪位大侠有类似经验,请不吝赐教

解决方案 »

  1.   

    试着用SINGLETON的COM对象完成类似工作
    尝试ing................
      

  2.   

    服务程序必须要有消息循环处理消息(一般Service没有),否则收不到SendMessage消息的。
      

  3.   

    当然是有消息循环的
    做了十年的开发,还没有忘了需要消息循环,呵呵
    准备用SINGLETON的COM Service解决问题,抛弃用SendMessage的方案
    不过这个问题还是请继续讨论,毕竟应该是没有遇到过的问题,不弄明白不甘心
      

  4.   

    我以前是在桌面上BroadcastMessage的……倒还真没用过SendMessage……
      

  5.   

    关键是需要跨WinStation和Desktop
    这样一来hWnd都无效了
      

  6.   

    HDESK   hdeskCurrent;
        HDESK   hdesk;
        HWINSTA hwinstaCurrent;
        HWINSTA hwinsta;    hwinstaCurrent = GetProcessWindowStation();
        if (hwinstaCurrent == NULL)
    {   
            return FALSE;
        }    hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
        if (hdeskCurrent == NULL)
    {
           return FALSE;
         }//打开winsta0
        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)
    {
           return FALSE;
        }    if (!SetProcessWindowStation(hwinsta))
    {
           return FALSE;
        }//打开desktop
        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)
       {
               return FALSE;
           }       SetThreadDesktop(hdesk);
           
          //到此你获得了访问用户桌面的权限,可以发消息了!          if (!SetProcessWindowStation(hwinstaCurrent))
               return FALSE;       if (!SetThreadDesktop(hdeskCurrent))
          return FALSE;       if (!CloseWindowStation(hwinsta))
                  return FALSE;       if (!CloseDesktop(hdesk))
               return FALSE;
      

  7.   

    服务桌面、用户桌面、winlogon 都有自己的桌面,要想发问别人的桌面要获得权限的,如上面的代码
      

  8.   

    但是切换WinStation和Desktop会不会导致进程所创建的窗口混乱呢?
    而且访问System的WinStation,普通用户进程没有权限,该如何处理?
      

  9.   

    http://cvs.sourceforge.net/viewcvs.py/vnc-tight/vnc_winsrc/winvnc/vncService.cpp?rev=1.21void * SimulateCtrlAltDelThreadFn(void *context)
    {
    HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId()); // Switch into the Winlogon desktop
    if (!vncService::SelectDesktop("Winlogon"))
    {
    vnclog.Print(LL_INTERR, VNCLOG("failed to select logon desktop\n"));
    return FALSE;
    } vnclog.Print(LL_ALL, VNCLOG("generating ctrl-alt-del\n")); // Fake a hotkey event to any windows we find there.... :(
    // Winlogon uses hotkeys to trap Ctrl-Alt-Del...
    PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE)); // Switch back to our original desktop
    if (old_desktop != NULL)
    vncService::SelectHDESK(old_desktop); return NULL;
    }