2016-12-10 16 views
0

ユーザーが異なるWindows 10デスクトップ上で異なるアイコンを持つことができるアプリケーションを作成したいと考えています。私はWindow Station and Desktop functionsVirtual Desktop Shell Interfaceを使って仮想デスクトップの切り替えに対処できます。だから私は、デスクトップが切り替わったことを検出する方法を知っているので、できるだけ早くDesktop User Folderの場所を変更する必要があります。背景を右クリックしプログラムによるデスクトップフォルダの場所を変更する最速の方法

A)ユーザーフォルダのプロパティ

    エクスプローラで
  1. オープン%HomePath%/Desktop
  2. を介して、開いたプロパティ
  3. は、私はユーザーインターフェイスでこれを行う2つの方法があります知っています

  4. タブで新しいパスの場所の種類
  5. OKをクリックしてから、いいえ(ファイルを移動したくないため)
  6. 必要に応じて:デスクトップをクリックし、F2を押すと、

が表示されます。

B)を介してレジストリ

  1. 新しいアドレス
  2. 再度ログイン

からHKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Foldersの変更Desktop

Bオプションは、再配置部品でない場合には、プログラマチックソリューションにとって理想的です。あなたが確かに理解できるように、これはいくらかのデングブレイカーです。

+1

色私気難しいが、あなたの目のオプション付き**リアル**契約ブレーカは、予告なしに、いつでも破ることができる文書化されていない実装の詳細に依存していること、です。 [シェルフォルダキーの長くて悲しい話](https://blogs.msdn.microsoft.com/oldnewthing/20031103-00/?p=41973)を必ずお読みください。 – IInspectable

+2

[SHSetKnownFolderPath](https://msdn.microsoft.com/en-us/library/windows/desktop/bb762249.aspx)は、既知のフォルダ(デスクトップなど)を新しい場所にリダイレクトする公式のインターフェイスです。 @CodyGray:[The Old New Thing](https://blogs.msdn.microsoft.com/oldnewthing/)の10年以上が、契約と実装の詳細の違いを説明できなかった後者は危険です)、私はおそらく何ができるのか分かりません。 – IInspectable

答えて

0

以下のVB.Netコードは、開いているデスクトップフォルダの場所とサイズをすべてWindowsレジストリに保存し、必要に応じて復元します。コマンドラインまたはバッチファイルから実行します。フォルダの属性を保存するには、パラメータを追加するために、 'Set'(引用符なし)のパラメータを追加します。

Option Explicit On 
Imports System.Text 
Public Class FixFolders 
    Structure RECT 
     Dim Left As Integer 
     Dim Top As Integer 
     Dim Right As Integer 
     Dim Bottom As Integer 
    End Structure 
    Structure POINTAPI 
     Dim x As Integer 
     Dim y As Integer 
    End Structure 
    Structure WINDOWPLACEMENT 
     Dim length As Integer 
     Dim flags As Integer 
     Dim showCmd As Integer 
     Dim ptMinPosition As POINTAPI 
     Dim ptMaxPosition As POINTAPI 
     Dim rcNormalPosition As RECT 
    End Structure 
    Private Structure TDeskTopWindow 
     Dim lhwnd As Integer 
     Dim WinTitle As String 
     Dim WinRect As RECT 
    End Structure 

    Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As Integer, ByRef lpRect As RECT) As Integer 
    Declare Function MoveWindow Lib "user32" (ByVal hwnd As Int32, ByVal x As Int32, ByVal y As Int32, ByVal nWidth As Int32, ByVal nHeight As Int32, ByVal bRepaint As Int32) As Int32 
    Declare Function GetDesktopWindow Lib "user32"() As Int32 
    Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Int32, ByVal lpClassName As String, ByVal nMaxCount As Int32) As Int32 
    Private Delegate Function EnumChildWindowsCallback(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean 
    Private Declare Function EnumChildWindows Lib "user32" (ByVal hWnd As IntPtr, ByVal lpEnumFunc As EnumChildWindowsCallback, ByVal lParam As IntPtr) As Boolean 
    Private Delegate Function EnumWindowsProcDelegate(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean 
    Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As EnumWindowsProcDelegate, ByVal lParam As IntPtr) As Boolean 
    Private Declare Auto Function GetWindowText Lib "user32" (ByVal hWnd As IntPtr, ByVal lpString As StringBuilder, ByVal nMaxCount As Integer) As Integer 
    Private Declare Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hwnd As Int32) As Int32 
    Private Declare Function SetWindowPlacement Lib "user32" (ByVal hwnd As Integer, ByRef lpwndpl As WINDOWPLACEMENT) As Integer 
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwbd As Int32) As Int32 
    'Private Declare Function FlashWindow Lib "User32" (ByVal hWnd As Int32, ByVal Invert As Int32) As Int32 
    Private Declare Function SetActiveWindow Lib "User32" (ByVal hWnd As Int32) As Int32 

    Private Shared lpwndplNew As WINDOWPLACEMENT 
    Private Const SW_SHOWMINIMIZED As Short = 2 
    Private Const SW_SHOWMAXIMIZED As Short = 3 
    Private Const SW_SHOWNORMAL As Short = 1 

    Private Shared Mode As String 

    Private WindowArray() As String 
    Private Shared DeskTopWindows() As TDeskTopWindow, DTWinIndex As Integer 

    Public Shared Sub Main() 
     Dim left, Right, Top, Bottom As Integer 
     Dim DTWinIndex As Integer 
     Dim RetVal1, RetVal2, RetVal3, TimeOut As Integer 

     Mode = Command() 
     GetDeskTopFolderWindows() 

     For DTWinIndex = 0 To DeskTopWindows.GetUpperBound(0) 
     Select Case Mode 
      Case "" 
       With DeskTopWindows(DTWinIndex) 
        'If it' s not there, put it in 
        If GetSetting("FixFolders", .WinTitle, "Left") = "" Then 
        SaveSetting("FixFolders", .WinTitle, "Left", .WinRect.Left.ToString) 
        SaveSetting("FixFolders", .WinTitle, "Right", .WinRect.Right.ToString) 
        SaveSetting("FixFolders", .WinTitle, "Top", .WinRect.Top.ToString) 
        SaveSetting("FixFolders", .WinTitle, "Bottom", .WinRect.Bottom.ToString) 
        End If 

        left = Val(GetSetting("FixFolders", .WinTitle, "Left")) 
        Right = Val(GetSetting("FixFolders", .WinTitle, "Right")) 
        Top = Val(GetSetting("FixFolders", .WinTitle, "Top")) 
        Bottom = Val(GetSetting("FixFolders", .WinTitle, "Bottom")) 
        While .WinRect.Bottom <> Bottom Or .WinRect.Left <> left Or .WinRect.Right <> Right Or .WinRect.Top <> Top 
        'RetVal1 = SetForegroundWindow(lhWnd) 
        RetVal2 = SetWindowPlacement(.lhwnd, lpwndplNew)   'This 'restores' the window if minimized 
        RetVal3 = MoveWindow(.lhwnd, left, Top, Right - left, Bottom - Top, True) 
        ' Log.WriteLine(Now.TimeOfDay.ToString.Substring(0, 8) & " Set " & .WinTitle) 
        RetVal1 = GetWindowRect(.lhwnd, .WinRect) ' get current size 
        TimeOut += 1 
        If TimeOut > 1 And TimeOut < 10 Then Threading.Thread.Sleep(1000) 
        End While 
       End With 
      Case "Set" 
       With DeskTopWindows(DTWinIndex) 
        SaveSetting("FixFolders", .WinTitle, "Left", .WinRect.Left.ToString) 
        SaveSetting("FixFolders", .WinTitle, "Right", .WinRect.Right.ToString) 
        SaveSetting("FixFolders", .WinTitle, "Top", .WinRect.Top.ToString) 
        SaveSetting("FixFolders", .WinTitle, "Bottom", .WinRect.Bottom.ToString) 
       End With 
     End Select 
     Next 
    End Sub 

    Private Shared Sub GetDeskTopFolderWindows() 
     Dim lhwnd As Integer, lParam As IntPtr 
     DTWinIndex = -1 
     lhwnd = GetDesktopWindow() ' Find the Desktop's Child Windows 
     EnumChildWindows(lhwnd, AddressOf EnumChildProc, lParam) 
    End Sub 
    Shared Function EnumChildProc(ByVal lhWnd As IntPtr, ByVal lParam As IntPtr) As Boolean 
     Dim RetVal1 As Int32 
     Dim WinClassBuf As String 
     Dim WinTitleBuf As New StringBuilder(256) 
     Dim WinClass As String 
     Dim WinRect As RECT 

     WinClassBuf = New String(Chr(0), 256) 
     WinTitleBuf.Append(Chr(0), 256) 
     RetVal1 = GetClassName(lhWnd, WinClassBuf, WinClassBuf.Length) 
     WinClass = WinClassBuf.ToString 
     WinClass = StripNulls(WinClassBuf) ' remove extra Nulls & spaces 
     If WinClass = "CabinetWClass" Or WinClass = "ExploreWClass" Then ' TextBox Window 
     DTWinIndex += 1 
     ReDim Preserve DeskTopWindows(DTWinIndex) 
     DeskTopWindows(DTWinIndex).lhwnd = lhWnd 
     GetWindowText(lhWnd, WinTitleBuf, WinTitleBuf.Capacity) 
     DeskTopWindows(DTWinIndex).WinTitle = WinTitleBuf.ToString 
     RetVal1 = GetWindowRect(lhWnd, WinRect) ' get current size 
     DeskTopWindows(DTWinIndex).WinRect = WinRect 
     End If 
     EnumChildProc = True 
    End Function 

    Public Shared Function StripNulls(ByVal OriginalStr As String) As String 
     ' This removes the extra Nulls so String comparisons will work 
     If (InStr(OriginalStr, Chr(0)) > 0) Then 
     'OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1) 
     OriginalStr = OriginalStr.Substring(0, OriginalStr.IndexOf(Chr(0))) 
     End If 
     StripNulls = OriginalStr 
    End Function 
End Class 
+0

** StackOverflowへようこそ!**コードは何をより詳細に説明できますか? *開かれたウィンドウ*についての情報を保存しますか?これは間違いなく涼しいですが、それは私が必要とするものではありません - 私は "デスクトップフォルダ"(あなたのデスクトップのアイコンが生きているもの)とその宛先を変更することについての質問で(異なるアイコンがデスクトップに現れるように) 。 – m93a

関連する問題