Pfad vom Explorer übernehmen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Pfad vom Explorer übernehmen

    Hi Leute!

    Mit folgendem Code fange ich die Tasten systemweit ab:

    VB.NET-Quellcode

    1. Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Integer
    2. Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer)
    3. Private Const Key_NONE As Integer = &H0
    4. Private Const WM_HOTKEY As Integer = &H312
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. RegisterHotKey(Me.Handle, 1, Key_NONE, Keys.X)
    7. End Sub
    8. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    9. UnregisterHotKey(Me.Handle, 1)
    10. End Sub
    11. Protected Overrides Sub WndProc(ByRef op As Message)
    12. If op.Msg = WM_HOTKEY Then
    13. Select Case op.WParam
    14. Case 1
    15. MessageBox.Show("X gedrückt!")
    16. End Select
    17. End If
    18. MyBase.WndProc(op)
    19. End Sub


    Wie krieg ich das hin, dass wenn z.B. X gedrückt wird und gerade der Explorer verwendet wird, der Pfad der markierten Datei/des markierten Ordners übergeben wird?

    Großes Danke schonmal! :)
    Danach habe ich auch schon gefragt, aber es wurde mir leider nicht geantwortet. Versuch mal die Datei in das clipboard zu kopieren und dann den Ursprung der Datei herauszulesen. Was anderes Fällt mir dazu nicht ein.

    mfg MAANtech
    Hi.

    Zuerst ein wenig Kritik: Du solltest niemals (!!) die Nachrichtenschleife blockieren. Das macht dein Programm unbedienbar und ist nicht empfehlenswert.

    Nun zum Problem: Die Dateiliste im Explorer ist ein ListView, wie du es aus .NET kennst. Da es in einem anderen Prozess läuft, musst du das Windows API bemühen. Hier die Vorgehensweise:
    - Finde das Controlhandle (FindWindow und FindWindowEx)
    - Du suchst ein ausgewähltes Item des ListViews - dafür brauchst du erst die Anzahl der Elemente, die ausgewählt sind.
    - Per SendMessage sendest du also diese Nachricht - Du bekommst die Anzahl markierter Elemente zurück.
    - In einer Schleife (von 0 1 bis count) musst du dir nun die Indizes der markierten Elemente suchen - dafür gibts die Nachricht LVM_GETNEXTITEM mit lParam = LVNI_SELECTED
    - Mit dem Indizes kommst du mit Hilfe von LVM_GETITEM an die Items selbst (Schleife)
    - Du brauchst eine LVITEM-Struktur, die du in jedem Schleifendurchlauf mit einem gefundenen Index fütterst
    - Die Struktur liefert den Namen des Elements - du brauchst noch den Pfad. Diesen findest du in der Adressleiste:
    (Pfad):
    - Finde wieder das Controlhandle (die Adressleiste ist eine ComboBox, wie unschwer zu erkennen ist)
    - Lies den aktuellen Text aus (WM_GETTEXTLENGTH und WM_GETTEXT sollten dafür ausreichen).

    Nach dieser Vorarbeit kannst du dir aus dem Elementnamen und dem Text der Adressleiste den Pfad zusammenbasteln (Text & \ & Itemname)

    PS: Die Werte der Konstanten findest du bei pinvoke.net, winehq.org oder im MS Platform SDK in den Headerdateien.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ () aus folgendem Grund: Korrektur

    Leute, ich hab gegoogelt und folgendes gefunden:

    VB.NET-Quellcode

    1. Dim SHAp, Wins, SFV, IE, SI, FI
    2. Dim s = ""
    3. SHAp = CreateObject("Shell.Application")
    4. Wins = SHAp.Windows ' Shell.Windows
    5. For Each IE In Wins
    6. SFV = IE.Document ' ShellFolderView
    7. SI = SFV.SelectedItems ' SelectedItems collection
    8. For Each FI In SI ' FolderItem
    9. s = s & FI.path & vbCrLf
    10. Next
    11. SI = Nothing
    12. SFV = Nothing
    13. Next
    14. Wins = Nothing
    15. MsgBox(s)


    Es funktioniert!!! Es listet sogar ALLE ausgewählten Dateien im Explorer auf.

    Whatever, danke für die Hilfe! :P