由EnumDesktops命名的所有桌面无法通过错误2“找不到文件”的OpenDesktop

我列举了我的系统上的桌面(我正在使用SysInternals Desktops ,所以我知道我有额外的)使用:

 EnumDesktops(Nothing, AddressOf EnumDesktopsProc, Nothing) 

与这些声明:

 Private Declare Auto Function EnumDesktops Lib "User32" (ByVal hWinSta As IntPtr, ByVal edp As EnumDesktopProc, ByVal lParam As IntPtr) As Boolean Private Declare Auto Function OpenDesktop Lib "User32" (<MarshalAs(UnmanagedType.LPTStr)> ByVal DesktopName As String, ByVal dwFlags As Integer, <MarshalAs(UnmanagedType.Bool)>ByVal fInherit As Boolean, ByVal dwDesiredAccess As AccessMask) As DesktopHandle Private desktopNames As New List(Of String) Private Delegate Function EnumDesktopProc(<MarshalAs(UnmanagedType.LPTStr)>ByVal DesktopName As String, ByVal lParam As IntPtr) As Boolean Private Function EnumDesktopsProc( ByVal DesktopName As String, ByVal lParam As IntPtr ) As Boolean desktopNames.Add(DesktopName) Return True End Function 

我检索:

 "WinSta0" "Service-0x0-3e7$" "Service-0x0-3e4$" "Service-0x0-3e5$" "SAWinSta" "__X78B95_89_IW" "Service-0x0-119d1e$" "Service-0x0-4e05f$" 

当我试图打开他们:

 OpenDesktop(DesktopName, 0, False, AccessMask.DESKTOP_ENUMERATE) 

(其中AccessMask是一个大的Enum复制数据在这里和这里 , DesktopHandle是一个SafeHandle

他们都返回NULLNothing )并且GetLastWin32Error返回2 "The system cannot find the file specified." 。 为什么?

我检查了OpenDesktop替代声明和不同的AccessMask值,没有任何效果(除非声明实际上是错误的)。 我注意到,向“ DesktopName ”添加“path”时可能会遇到不同的错误,具体为161 "The specified path is invalid."

EnumDesktops的文档至少是误导性的,如果没有错误的话。 传递NULLNothing )作为第一个参数是返回“Session 0”窗口站的桌面。 您需要使用GetProcessWindowStation()的结果。 即将上面的第一行更改为:

 Private Declare Auto Function GetProcessWindowStation Lib "User32" () As IntPtr EnumDesktops(GetProcessWindowStation(), AddressOf EnumDesktopsProc, Nothing) 

(有一个用户评论添加到EnumDesktops文档,但我错过了,所以我认为其他人也可能。)

请注意, GetProcessWindowStation的文档明确表示不需要关闭,因此不需要在SafeHandle包装。