能给点详细的代码最好

解决方案 »

  1.   

    不可能的,win服务可以在用户不登陆的情况下启动,本身就不允许有交互动作。
      

  2.   

    写过Windows 服务, 没有注意过这点,回家看一下
      

  3.   

    服务器第一次运行的时候把 服务所对应的注册表type键值加上256与桌面交互
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\你的服务名]
    "Type"=dword:00000120 
           120=256不与桌面交互[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\你的服务名]
    "Type"=dword:00000020
           20=321
      

  4.   

    大哥,不会让我在onStart()中写注册表把
      

  5.   

    Windows 服务应用程序在不同于登录用户的交互区域的窗口区域中运行。窗口区域是包含剪贴板、一组全局原子和一组桌面对象的安全对象。由于 Windows 服务的区域不是交互区域,因此 Windows 服务应用程序中引发的对话框将是不可见的,并且可能导致程序停止响应。同样,错误信息应记录在 Windows 事件日志中,而不是在用户界面中引发。 
    .NET Framework 支持的 Windows 服务类不支持与交互区域(即登录用户)进行交互。同时,.NET Framework 不包含表示区域和桌面的类。如果 Windows 服务必须与其他区域进行交互,则需要访问非托管的 Windows API。有关更多信息,请参见 Platform SDK 文档中的窗口区域和桌面。 设计 Windows 服务与用户或其他区域的交互时必须非常小心,应包含某些方案,例如没有登录的用户或用户具有一组意外的桌面对象的情况。在某些情况下,编写一个在用户控制下运行的 Windows 应用程序可能更为妥当。要和用户进行交互(如显示窗口),我们必须打开用户WinSta0和desktop(下面是vc代码)//打开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)
    {
           LogEvent(_T("open window station err"));
           return FALSE;
    }
        if (!SetProcessWindowStation(hwinsta))
    {
           LogEvent(_T("Set window station err"));
           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)
          { 
              LogEvent(_T("Open desktop err")); 
              return FALSE; 
          }
           SetThreadDesktop(hdesk);
      

  6.   


    前面的说明已经很清楚了(需要访问非托管的 Windows API),后面的C++代码仅供参考:)