3

私は自分のシステムのデスクトップを列挙しました(私は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する大きなものはどこにあり、はです)EnumDesktopHandleSafeHandle

それらはすべてNULLNothing)をGetLastWin32Error返し、。を返します2 "The system cannot find the file specified."。なんで?

代替宣言OpenDesktopと異なるAccessMask値をチェックしましたが、効果はありませんでした(宣言が実際に間違っていた場合を除く)。DesktopName特に、に「パス」を追加すると、別のエラーが発生する可能性があることに注意してください。161 "The specified path is invalid."

4

1 に答える 1

4

のドキュメントEnumDesktopsは、間違っていないとしても、少なくとも誤解を招くものです。NULL最初のパラメータとして( )を渡すNothingと、「セッション0」ウィンドウステーションのデスクトップが返されます。からの結果を使用する必要がありますGetProcessWindowStation()。つまり、上記の最初の行を次のように変更します。

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

EnumDesktops(GetProcessWindowStation(), AddressOf EnumDesktopsProc, Nothing)

EnumDesktops(ドキュメントにユーザーコメントが追加されていますが、見逃したので、他の人もそうかもしれないと思いました。)

のドキュメントには、閉じる必要がないGetProcessWindowStation と明示的に記載されているため、でラップする必要はありませんSafeHandle

于 2012-11-10T15:05:39.533 に答える