rt

解决方案 »

  1.   

    以前在VCBASE上看到的。在服务程序中开启一个对话框
    BOOL CServiceModule::ShowMsgDlg()
    {
        HDESK   hdeskCurrent;
        HDESK   hdesk;
        HWINSTA hwinstaCurrent;
        HWINSTA hwinsta;    hwinstaCurrent = GetProcessWindowStation();
        if (hwinstaCurrent == NULL){
    LogEvent(_T("get window station err"));
           return FALSE;
    }    hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
        if (hdeskCurrent == NULL){
    LogEvent(_T("get window desktop err"));
           return FALSE;
    }    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"));       return FALSE;
    }    if (!SetProcessWindowStation(hwinsta)){
    LogEvent(_T("Set window station err"));       return 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"));           return FALSE;
    } SetThreadDesktop(hdesk); CMsgDlg dlgMsg;
    dlgMsg.DoModal(); if (!SetProcessWindowStation(hwinstaCurrent))
               return FALSE; if (!SetThreadDesktop(hdeskCurrent))
          return FALSE; if (!CloseWindowStation(hwinsta))
    return FALSE; if (!CloseDesktop(hdesk))
               return FALSE; return TRUE;
    }