我的服务以System权限运行,在没有用户登录到系统之前,是捕捉不到桌面的。好像登录时的桌面,请教如何在用户登录之前,也能捕捉到当前显示的桌面?是不是在用户断开连接,或没有登录到系统上时,Winlogon.exe进程锁定了默认桌面所致?那么,此时我的服务切换到Winlogon桌面,能不能行呢?需要不需要什么特别的权限?谢谢!

解决方案 »

  1.   

    准确的说,是“用户桌面”并不存在,而你所期望的是“用户桌面”,即登录用户的桌面。其实相关Windows的书当中都有介绍关于Windows程序当中用户桌面程序和服务程序的默认桌面的不同。“允许服务与桌面交互”仅仅只是做了一个强行的桌面绑定。
      

  2.   

    1. 在服务程序中, 可以通过挂接 ISensLogon 接口接收到用户桌面登陆的通知。2. 如果是使用远程桌卖弄访问的话, 加一个 /console参数才能使用默认桌面参考:http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx
      

  3.   

    首先服务程序需设置与桌面交互式,在用户登录前系统处于Winlogon桌面,你需要切换到该桌面才能捕捉到桌面,用户登录后切换到用户桌面,此时你需重新切换到用户桌面才能捕捉.
      

  4.   

    回复五楼:在登录之前,切换到Winlogon桌面并成功捕获到了登录前的窗口。
    还有一个问题:我的服务程序如何能知道当前的活动桌面是不是已经切换了?如果获取当前的活动桌面的相关信息?
      

  5.   


    BOOL  IsDefaultDesktop()
    {
    HDESK   hdeskCurrent;
    hdeskCurrent = OpenInputDesktop(0, FALSE,
    DESKTOP_CREATEMENU | 
    DESKTOP_CREATEWINDOW |
    DESKTOP_ENUMERATE | 
    DESKTOP_HOOKCONTROL |
    DESKTOP_WRITEOBJECTS | 
    DESKTOP_READOBJECTS |
    DESKTOP_SWITCHDESKTOP | 
    GENERIC_WRITE); TCHAR name[100];
    DWORD cbNeed;
    GetUserObjectInformation(hdeskCurrent,UOI_NAME,(PBYTE)name,sizeof(name),&cbNeed);
    CString str=name;
    str.TrimLeft();str.TrimRight();str.MakeLower();
    if(str.Compare("winlogon") == 0)
    {
    CloseDesktop(hdeskCurrent);
    return FALSE;
    }
    else
    {
    CloseDesktop(hdeskCurrent);
    return TRUE;
    }
    return TRUE;
    }