windows - EnumDesktops 命名的所有桌面都无法打开桌面,错误为 2 "File not found"

标签 windows winapi desktop

我枚举了我系统上的桌面(我正在使用 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 复制数据 herehere ,而 DesktopHandle 是一个 SafeHandle )

它们都返回 NULL(Nothing)并且 GetLastWin32Error 返回 2“系统找不到指定的文件。”。为什么?

我检查了 OpenDesktop 的备用声明和不同的 AccessMask 值,但没有任何效果(除非声明实际上是错误的)。我注意到,在向 DesktopName 添加“路径”时,我可能会遇到不同的错误,特别是 161“The specified path is invalid.”

最佳答案

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

Private Declare Auto Function GetProcessWindowStation Lib "User32" () As IntPtr

EnumDesktops(GetProcessWindowStation(), AddressOf EnumDesktopsProc, Nothing)

(在 EnumDesktops documentation 中添加了一条用户评论,但我错过了,所以我认为其他人也可能。)

注意 GetProcessWindowStation 的文档 explicitly says它不需要关闭,因此不需要包装在 SafeHandle 中。

关于windows - EnumDesktops 命名的所有桌面都无法打开桌面,错误为 2 "File not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323174/

相关文章:

c++ - 摄像头视频显示闪烁,为什么?

c++ - 如何向文件添加新行?

基于 .NET 或 Java 的小型桌面应用程序

html - 如何打开弹出窗口/新标签(目标 ="_blank")并尊重移动设备(以及桌面)?

c++ - 为什么我的程序不能正确地注入(inject)我的 .dll?

windows - 无法连接到 URL 'svn://localhost' 的存储库

java - Windows 中 Epson POS 打印机的 JPOS 配置问题

r - 我应该如何正确升级 R 以保持旧版本运行 [Windows]?

c++ - 我们可以使用 Qt(64) 生成一个可以在 32 位窗口和 64 位窗口上运行的应用程序吗?

java - JFXButton 看起来在启动后立即被单击