Windows-Farbeinstellungen aufrufen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.
-
-
@Selter98
Rein theoretisch sollte das möglich sein. Theoretisch deswegen weil ich das für den Desktop noch nicht gebraucht habe. Sollte aber analog zu den ContextMenüs für eine Datei/Ordner bzw. mehrere Dateien/Ordner funktionieren.
1. vom virtuellen Pfad "::{00021400-0000-0000-C000-000000000046}" (sollte der Desktop sein) per API SHCreateItemFromParsingName ein Interface IShellItem erstellen -> docs.microsoft.com/en-us/windo…createitemfromparsingname
2. per IShellItem.BindToHandler mit BHID_SFUIObject und IID_IContextMenu ein Interface IContextMenu erstellen -> docs.microsoft.com/en-us/windo…-ishellitem-bindtohandler
3. per API CreatePopupMenu ein Handle für ein PopupMenu erstellen -> docs.microsoft.com/en-us/windo…f-winuser-createpopupmenu
4. per IContextMenu.QueryContextMenu und dem Handle vom PopupMenu wird das ContextMenü für den Desktop geladen -> docs.microsoft.com/en-us/windo…textmenu-querycontextmenu
5. per API TrackPopupMenuEx und dem Handle vom PopupMenu kann man sich nun das ContextMenü anzeigen lassen wo Du dann den entsprechenden Eintrag anklicken kannst. -> docs.microsoft.com/en-us/windo…-winuser-trackpopupmenuex
Ab hier könnte man auch folgendes machen: Wenn Du bei TrackPopupMenuEx den Flag TPM_RETURNCMD angibst, gibt Dir TrackPopupMenuEx ein MenüItem-Identifier zurück. Per IContextMenu.GetCommandString und dem MenüItem-Identifier + dem Flag GCS_VERBA oder GCS_VERBW kommst Du an das Verb für den angeklickten ContextMenü-Eintrag. -> docs.microsoft.com/en-us/windo…textmenu-getcommandstring
Wenn man dieses Verb hat, braucht man das ContextMenü nicht mehr anzeigen lassen, TrackPopupMenuEx kann dann entfallen, sondern füllt die Structure CMINVOKECOMMANDINFOEX entsprechend aus (.cbSize = SizeOf(Structure), .lpVerb = Verb <- GCS_VERBA bzw. lpVerbW = Verb <- GCS_VERBW) docs.microsoft.com/en-us/windo…ore-cminvokecommandinfoex
Nun kann man direkt nach IContextMenu.QueryContextMenu per IContextMenu.InvokeCommand(CMINVOKECOMMANDINFOEX) den entsprechenden Befehl (Verb) ausführen lassen anstatt diesen Im Contextmenü anzuklicken. -> docs.microsoft.com/en-us/windo…contextmenu-invokecommand
Grob gesagt, Du benötigst das Verb zum Aufrufen der Windows-Farbeinstellungen aus dem ContextMenü um über IContextMenu.InvokeCommand diesen Befehl direkt auszuführen. Die Frage wäre: Ändert sich das Verb auch mal? k.A. und bei MS weis man nie ob die da mal was ändern. Einige Verb sind bisher bei allen Windowsversionen immer konstant geblieben wie zB. "Print" um Dateien, wie über das ContextMenü, zu drucken. Wenn Du ganz sicher gehen möchtest, solltest Du doch das ContextMenü anzeigen lassen und dann den entsprechenden Eintrag anklicken. Du müsstest auch zu diesem Thema ContextMenüs (IContextMenu und das drumherum) einiges im Internet finden.
Evtl. gibt es auch andere Möglichkeiten die Windows-Farbeinstellungen direkt aufzurufen. Diese sind mir aber nicht bekannt.Mfg -Franky-Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()
-
@Selter98null
Kleine Korrektur: Per API SHGetDesktopFolder ein Interface IShellFolder erstellen. Per IShellFolder.CreateViewObject und IID_IContextMenu ein Interface IContextMenu erstellen. Der Rest bleibt gleich.
Edit: Weil ich gerade etwas Zeit hatte, hab ich das mal fix zusammen gebaut. Evtl. reicht Dir ja dieser Weg. Um dann an die Farben zu kommen, ist es ja nur noch ein Klick.
Spoiler anzeigen
VB.NET-Quellcode
-
- Option Strict On
- Option Explicit On
- Imports System.Text
- Imports System.Runtime.InteropServices
- Public Class Form1
- Private Const S_OK As Integer = 0
- Private Const GCS_VERBA As Integer = &H0
- Private Const GCS_UNICODE As Integer = &H4
- Private Const MIN_CONTEXTMENU_CMDID = &H1
- Private Const MAX_CONTEXTMENU_CMDID = &H7FFF
- Private Const TPM_RETURNCMD As Integer = &H100
- Private Const IID_IShellFolder As String = "000214E6-0000-0000-C000-000000000046"
- Private Const IID_IContextMenu As String = "000214e4-0000-0000-c000-000000000046"
- <StructLayout(LayoutKind.Sequential)>
- Private Structure CMINVOKECOMMANDINFOEX
- Dim cbSize As Integer
- Dim fMask As Integer
- Dim hwnd As IntPtr
- <MarshalAs(UnmanagedType.LPStr)> Dim lpVerb As String
- <MarshalAs(UnmanagedType.LPStr)> Dim lpParameters As String
- <MarshalAs(UnmanagedType.LPStr)> Dim lpDirectory As String
- Dim nShow As Integer
- Dim dwHotKey As Integer
- Dim hIcon As IntPtr
- <MarshalAs(UnmanagedType.LPStr)> Dim lpTitle As String
- <MarshalAs(UnmanagedType.LPWStr)> Dim lpVerbW As String
- <MarshalAs(UnmanagedType.LPWStr)> Dim lpParametersW As String
- <MarshalAs(UnmanagedType.LPWStr)> Dim lpDirectoryW As String
- <MarshalAs(UnmanagedType.LPWStr)> Dim lpTitleW As String
- Dim ptInvokeX As Integer
- Dim ptInvokeY As Integer
- End Structure
- <DllImport("Shell32.dll", EntryPoint:="SHGetDesktopFolder")>
- <PreserveSig> Private Shared Function SHGetDesktopFolder(<Out, MarshalAs(UnmanagedType.Interface)> ByRef ppshf As IShellFolder) As Integer
- End Function
- <DllImport("User32.dll", EntryPoint:="CreatePopupMenu")>
- Private Shared Function CreatePopupMenu() As IntPtr
- End Function
- <DllImport("User32.dll", EntryPoint:="TrackPopupMenuEx")>
- Private Shared Function TrackPopupMenuEx(<[In]> ByVal hMenu As IntPtr,
- <[In]> ByVal uFlags As UInt32,
- <[In]> ByVal x As Integer,
- <[In]> ByVal y As Integer,
- <[In]> ByVal hwnd As IntPtr,
- <[In]> ByVal lptpm As IntPtr) As Integer
- End Function
- <DllImport("User32.dll", EntryPoint:="DestroyMenu")>
- Private Shared Function DestroyMenu(<[In]> ByVal hMenu As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
- End Function
- <ComImport>
- <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
- <Guid(IID_IShellFolder)>
- Private Interface IShellFolder
- ' Die Dummyfunktionen sind nur dafür da, damit die VTable des Interfaces bis CreateViewObject passt!
- <PreserveSig> Function ParseDisplayName() As Integer ' nur eine Dummyfunktion
- <PreserveSig> Function EnumObjects() As Integer ' nur eine Dummyfunktion
- <PreserveSig> Function BindToHandler() As Integer ' nur eine Dummyfunktion
- <PreserveSig> Function BindToStorage() As Integer ' nur eine Dummyfunktion
- <PreserveSig> Function CompareIDs() As Integer ' nur eine Dummyfunktion
- <PreserveSig> Function CreateViewObject(<[In]> ByVal hwndOwner As IntPtr,
- <[In], MarshalAs(UnmanagedType.LPStruct)> ByVal riid As Guid,
- <Out, MarshalAs(UnmanagedType.IUnknown)> ByRef ppv As Object) As Integer
- ' Weitere nicht verwendete Funktionen des Interfaces.
- ' Diese brauchen wir aber nicht als Dummyfunktionen anlegen
- ' da wir nur die Funktion CreateViewObject nutzen wollen.
- ' Function GetAttributesOf() As Integer
- ' Function GetUIObjectOf() As Integer
- ' Function GetDisplayNameOf() As Integer
- ' Function SetNameOf() As Integer
- End Interface
- <ComImport>
- <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
- <Guid(IID_IContextMenu)>
- Private Interface IContextMenu
- <PreserveSig> Function QueryContextMenu(<[In]> ByVal hMenu As IntPtr,
- <[In]> ByVal indexMenu As Integer,
- <[In]> ByVal idCmdFirst As Integer,
- <[In]> ByVal idCmdLast As Integer,
- <[In]> ByVal uFlags As Integer) As Integer
- <PreserveSig> Function InvokeCommand(<[In], MarshalAs(UnmanagedType.Struct)> ByRef pici As CMINVOKECOMMANDINFOEX) As Integer
- <PreserveSig> Function GetCommandString(<[In]> ByVal idCmd As Integer,
- <[In]> ByVal uType As Integer,
- <[In]> ByVal pReserved As IntPtr,
- <Out, MarshalAs(UnmanagedType.LPWStr)> ByVal lpszShortPath As StringBuilder,
- <[In]> ByVal cchMax As Integer) As Integer
- End Interface
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim IIShellFolder As IShellFolder = Nothing
- ' IShellFolder erstellen
- If SHGetDesktopFolder(IIShellFolder) = S_OK Then
- Dim oIContextMenu As Object = Nothing
- ' IContextMenu erstellen
- If IIShellFolder.CreateViewObject(IntPtr.Zero, New Guid(IID_IContextMenu),
- oIContextMenu) = S_OK Then
- Dim IIContextMenu As IContextMenu = DirectCast(oIContextMenu, IContextMenu)
- ' PopupMenu erstellen
- Dim hMenu As IntPtr = CreatePopupMenu()
- If hMenu <> IntPtr.Zero Then
- ' ContextMenü laden
- If IIContextMenu.QueryContextMenu(hMenu, 0, MIN_CONTEXTMENU_CMDID,
- MAX_CONTEXTMENU_CMDID, 0) > 0 Then
- ' ********************************************************************
- ' Ohne das Contextmenü anzuzeigen. Dann direkt das Verb, falls dieses
- ' immer konstant in unterschiedlichen Windowsversionen ist und man
- ' das Verb kennt!, verwenden ohne TrackPopupMenuEx auszuführen.
- 'Dim tCMICI As New CMINVOKECOMMANDINFOEX
- '' Structure CMINVOKECOMMANDINFOEX füllen
- 'With tCMICI
- ' .cbSize = Marshal.SizeOf(tCMICI)
- ' .lpVerb = "Personalize" ' <- Verb
- 'End With
- '' Befehl (Verb) ausführen
- 'If IIContextMenu.InvokeCommand(tCMICI) = S_OK Then
- ' ' Befehl erfolgreich ausgeführt
- ' Debug.Print("OK")
- 'End If
- ' ********************************************************************
- ' ContextMenü anzeigen, hier an Position 0,0 des Bildschirmes
- Dim intCommandID As Integer = TrackPopupMenuEx(hMenu, TPM_RETURNCMD,
- 0, 0, Me.Handle, IntPtr.Zero)
- ' intCommandID > 0, 0 = irgendwo anders hingeklickt -> ContextMenü verschwindet
- If intCommandID >= MIN_CONTEXTMENU_CMDID And intCommandID <= MAX_CONTEXTMENU_CMDID Then
- ' MIN_CONTEXTMENU_CMDID wieder abziehen!
- intCommandID -= MIN_CONTEXTMENU_CMDID
- Dim sbVerb As New StringBuilder(255)
- ' Verb für den angeklickten MenüItem ermitteln
- If IIContextMenu.GetCommandString(intCommandID, GCS_VERBA Or GCS_UNICODE,
- IntPtr.Zero, sbVerb, sbVerb.Capacity) = S_OK Then
- Dim strVerb As String = sbVerb.ToString
- ' Verb vom angeklickten MenüItem ausgeben
- Debug.Print("Verb des MenüItems = " & strVerb)
- Dim tCMICI As New CMINVOKECOMMANDINFOEX
- ' Structure CMINVOKECOMMANDINFOEX füllen
- With tCMICI
- .cbSize = Marshal.SizeOf(tCMICI)
- .lpVerb = strVerb
- End With
- ' Befehl (Verb) ausführen
- If IIContextMenu.InvokeCommand(tCMICI) = S_OK Then
- ' Befehl erfolgreich ausgeführt
- Debug.Print("OK")
- End If
- End If
- End If
- End If
- ' PopupMenu löschen
- DestroyMenu(hMenu)
- End If
- ' IContextMenu löschen
- Marshal.FinalReleaseComObject(IIContextMenu)
- End If
- ' IShellFolder löschen
- Marshal.FinalReleaseComObject(IIShellFolder)
- End If
- End Sub
- End Class
Mfg -Franky-Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()
-
-
@Selter98
So wie es ausschaut, gibt es noch eine anderen Weg. Google ist Dein Freund. Schaust Du hier: tenforums.com/tutorials/78214-…ortcuts-windows-10-a.html Im Prinzip musst Du folgenden Befehl ausführen: explorer.exe ms-settings:dateandtime Und mit der Liste aus dem Link, solltest Du auch an die anderen Einstellungen kommen.Mfg -Franky- -
Hie führen viele Wege nach Rom, wenn ich dich richtig verstanden habe suchst du danach:
Weiter Parameter: open-control-panel-items-windows-10 -
Das Beispiel mit den Farbeinstellungen funktioniert schonmal. Aber wenn ich versuche andere Einstellungen zu öffnen, wird immer der Explorer mit der Seite "Dokumente" geöffnet. Was ist hier falsch?
Drucker-Einstellungen:
Bildschirm-Einstellungen:
Tastatur-Einstellungen:
Und mit diesem Befehl kommt Visual Basic garnicht klar. Meldung: "Komma, ")" oder eine gültige Ausdrucksfortsetzung erwartet.
-
Naja das funktioniert nicht weil du den armen Explorer dazu bringen willst das dieser die Control.exe mit Startparameter öffnet. Das
control
bedeuted das dieses Argument dieControl.exe
entgegen nimmt. Diese befindet sich im windows/system32 Ordner.
Das dein letztes Beispiel nicht funktioiniert ist klar. Wenn du in einem String"
verwenden willst musst diese entweder Escapen oder du nutzt String Interpolation bzw. String Format.
-
bit.ly/DotNetSearch
Code Konverter:
Online: @ developerfusion.com, @ telerik.com
Offline stand alone: Convert .NET, C# to VB Converter
VS Extensions: Convert .NET (Based on .NET 4.5), Language Convert -
FormFollowsFunction schrieb:
Process.Start("ms-settings:colors")
Ohne getestet zu haben, würde ich sagen
--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Sicher !
Wenn kein Programm explizit angegeben wird, verwendet das System standardmäßig den Explorer.bit.ly/DotNetSearch
Code Konverter:
Online: @ developerfusion.com, @ telerik.com
Offline stand alone: Convert .NET, C# to VB Converter
VS Extensions: Convert .NET (Based on .NET 4.5), Language Convert -
Das habe ich jetzt doch mal probiert.
Zumindest mit .Net Core gibt's da einen Fehler.
Ich hab's jetzt nicht mir .Net Framework versucht.--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
--Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()
-
Gut zu wissen !
Meine Aussage bezog sich aber auf .Net Framework.bit.ly/DotNetSearch
Code Konverter:
Online: @ developerfusion.com, @ telerik.com
Offline stand alone: Convert .NET, C# to VB Converter
VS Extensions: Convert .NET (Based on .NET 4.5), Language Convert -
-
Ähnliche Themen
-
5 Benutzer haben hier geschrieben
- Selter98 (3)
- petaod (3)
- FormFollowsFunction (3)
- -Franky- (3)
- Fakiz (2)