ShellExecuteEx / Eigenschaften-Fenster wieder schliessen?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    ShellExecuteEx / Eigenschaften-Fenster wieder schliessen?

    Hallo!

    Ich öffne mit dieser Funktion ein Windows-Eigenschaften-Fenster das mir die Dateieigenschaften einer Datei anzeigt:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)>
    2. Public Structure SHELLEXECUTEINFO
    3. Public cbSize As Integer
    4. Public fMask As UInteger
    5. Public hwnd As IntPtr
    6. Public lpVerb As String
    7. Public lpFile As String
    8. Public lpParameters As String
    9. Public lpDirectory As String
    10. Public nShow As Integer
    11. Public hInstApp As Integer
    12. Public lpIDList As Integer
    13. Public lpClass As String
    14. Public hkeyClass As Integer
    15. Public dwHotKey As UInteger
    16. Public hIcon As Integer
    17. Public hProcess As Integer
    18. End Structure
    19. Private Const SW_SHOW As Integer = 5
    20. Private Const SEE_MASK_INVOKEIDLIST As UInteger = 12
    21. <Runtime.InteropServices.DllImport("shell32.dll")>
    22. Private Shared Function ShellExecuteEx(ByRef lpExecInfo As SHELLEXECUTEINFO) As Boolean
    23. End Function
    24. Public Shared Sub ShowProperties(ByVal path As String)
    25. Dim fi As FileInfo = New FileInfo(path)
    26. Dim info As SHELLEXECUTEINFO = New SHELLEXECUTEINFO()
    27. info.cbSize = Runtime.InteropServices.Marshal.SizeOf(info)
    28. info.lpVerb = "properties"
    29. info.lpFile = fi.Name
    30. info.lpDirectory = fi.DirectoryName
    31. info.nShow = SW_SHOW
    32. info.fMask = SEE_MASK_INVOKEIDLIST
    33. ShellExecuteEx(info)
    34. End Sub


    Das Öffnen und die Funktion funktioniert, aber wie bekomme ich das Fenster programmatisch wieder geschlossen..also so als würde man auf "Abbrechen" klicken?!?
    @Morrison Zunächst läuft das ganze nur wohl unter 32 Bit, bei 64 Bit tut sich bei mir nix.
    Am Besten startest Du einen Timer und schließt das Fenster, wenn Du es identifiziert hast, per SendMessage() mit WM_CLOSE.
    Andere Programme fernsteuern
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Geht bei mir auf x64.
    Als Gegenwerbung für externe .Net-Programme auslesen und manipulieren:

    VB.NET-Quellcode

    1. Dim PossibleTargetWindows = AutomationElement.RootElement.FindAll(TreeScope.Children, Condition.TrueCondition)
    2. Dim TargetWindow = PossibleTargetWindows.Cast(Of AutomationElement).FirstOrDefault(Function(x) x.Current.Name.Contains("Eigenschaften von "))
    3. Dim CancelButton = TargetWindow?.FindFirst(TreeScope.Descendants, New PropertyCondition(AutomationElement.NameProperty, "Abbrechen"))
    4. DirectCast(CancelButton?.GetCurrentPattern(InvokePattern.Pattern), InvokePattern).Invoke()

    Der Compiler hilft Dir beim Import der UIAutomation-Verweise.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Explizit als x64 compiliert passiert bei mir nichts.
    AnyCPU ohne 32-Bit-Bevorzugung passiert bei mir ebenfalls nichts.
    Nur als 32-Bit-Prozess arbeiet der Code so, wie er soll.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. If Environment.Is64BitProcess Then
    3. Label1.Text = "x64"
    4. Else
    5. Label1.Text = "x32"
    6. End If
    7. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Shame on me! Das kommt davon, wenn man an 3 Projekten gleichzeitig arbeitet. Du hast recht. AnyCPU + 32Bit bevorzugen ist damit nur kompatibel/lauffähig.
    Damit klappt's in allen Varianten (bei mir):

    VB.NET-Quellcode

    1. <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)>
    2. Public Structure SHELLEXECUTEINFO
    3. Public cbSize As Integer
    4. Public fMask As UInteger
    5. Public hwnd As IntPtr
    6. Public lpVerb As String
    7. Public lpFile As String
    8. Public lpParameters As String
    9. Public lpDirectory As String
    10. Public nShow As Integer
    11. Public hInstApp As IntPtr
    12. Public lpIDList As IntPtr
    13. Public lpClass As String
    14. Public hkeyClass As IntPtr
    15. Public dwHotKey As UIntPtr
    16. Public hIcon As IntPtr
    17. Public hProcess As IntPtr
    18. End Structure

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Die Nachbarin spricht wieder mit mir.
    In Deinem Code aus Post #3 knallt es in der letzten Zeile, wenn CancelButton Nothing ist, das lässt sich nicht invoken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Stimmt, da kann man am schnellsten mit einem weiteren ? nachhelfen:

    VB.NET-Quellcode

    1. DirectCast(CancelButton?.GetCurrentPattern(InvokePattern.Pattern), InvokePattern)?.Invoke()
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.