DevTrain

Autor: Till Groos

Pfad einer Datei in Zwischenablage kopieren

Entwickler ticken anders. Mein Tick sind Tools für jeden Zweck. Der letzte Anlass war mal wieder das Referenzieren einer Datei als Hintergrundbild für ein Label. Um den absoluten Pfad für eine Datei in der Zwischenablage zu haben, sind einige Schritte (rechtsklick, umbenennen, kopieren, einfügen, backslash hinzufügen, wieder kopieren) nötig und das nervt auf dauer. Das muss einfacher gehen...

Im Kontextmenü im Explorer gibt es Programme, die Funktionen mit aktuell ausgewählten Dateien anstellen. Das wäre doch ganz nett. Wie bekommt man einen Eintrag ins Kontextmenü? Registry! Unter HKEY_CLASSES_ROOT\*\shell kann man Einträge hinzufügen. Dazu einfach einen neuen Schlüssel hinzufügen, als Wert für (Standard) den Eintrag für das Kontextmenü und als Unterschlüssel "command" den Pfad zum auszuführenden Programm. Da als Typ für die Werte "Reg_Expand_SZ" benutzt werden muss, bietet sich eine .reg-Datei zum Einfügen der Daten in die Registry an:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\clipboard]
@="Copy path to clipboard"

[HKEY_CLASSES_ROOT\*\shell\clipboard\command]
@=hex(2):22,00,43,00,3a,00,5c,00,44,00,6f,00,6b,00,75,00,6d,00,65,00,6e,00,74,\
  00,65,00,20,00,75,00,6e,00,64,00,20,00,45,00,69,00,6e,00,73,00,74,00,65,00,\
  6c,00,6c,00,75,00,6e,00,67,00,65,00,6e,00,5c,00,74,00,67,00,31,00,5c,00,45,\
  00,69,00,67,00,65,00,6e,00,65,00,20,00,44,00,61,00,74,00,65,00,69,00,65,00,\
  6e,00,5c,00,56,00,69,00,73,00,75,00,61,00,6c,00,20,00,53,00,74,00,75,00,64,\
  00,69,00,6f,00,20,00,50,00,72,00,6f,00,6a,00,65,00,63,00,74,00,73,00,5c,00,\
  43,00,6c,00,69,00,70,00,62,00,6f,00,61,00,72,00,64,00,43,00,6f,00,70,00,79,\
  00,5c,00,62,00,69,00,6e,00,5c,00,63,00,6c,00,69,00,70,00,62,00,6f,00,61,00,\
  72,00,64,00,63,00,6f,00,70,00,79,00,22,00,20,00,22,00,25,00,31,00,22,00,00,\
  00

Ein kleiner Kniff ist noch nötig. Die Funktion Environment.GetCommandLineArgs() gibt Pfade im 8.3 Format zurück. Da .NET keine Funktion zum Umwandeln bietet ist die API gefragt:

Private Declare Function GetLongPathName Lib "kernel32" Alias _
    "GetLongPathNameA" (ByVal lpszShortPath As String, _
    ByVal lpszLongPath As String, ByVal cchBuffer As Long) _
    As Long

Dann fehlt nur noch der Code für das kopieren in die Zwischenablage:
Public Shared Sub Main(ByVal args() As String)
    Dim s() As String
    Dim _longfilename As String
    s = Environment.GetCommandLineArgs()
    If s.Length > 1 Then
        Try
            _longfilename = GetLongFileName(s(1))
            Clipboard.SetDataObject(_longfilename, True)
            Dim info() As String = {"copied to clipboard:", _longfilename}
            Application.Run(New frmInfo(info))
        Catch ex As Exception
            Dim info() As String = {"Error:", ex.ToString}
            Application.Run(New frmInfo(info))
        End Try
    End If
    Application.Exit()
End Sub
Public Shared Function GetLongFileName(ByVal FullPath As String) As String
    Dim lLen As Long
    Dim sBuffer As New String("", MAX_PATH)
    lLen = GetLongPathName(FullPath, sBuffer, Len(sBuffer))
    If lLen > 0 And Err.Number = 0 Then
        Return sBuffer.Trim()
    End If
End Function

Ein MSI-Paket steht unter http://www.ppedv.de/dwnld/clipboard_setup.msi zur Verfügung.


Erfasst am: 20.08.2004 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=934
© Copyright 2003 ppedv AG - http://www.ppedv.de