none
Wie feststellen ob mit Strg+X o. Strg+C Dateien in Clipboard eingefügt wurden RRS feed

  • Frage

  • Hallo Leute,

    mit nachfolgenden Prozeduren (nicht von mir) kann ich Dateien in den Zwischenspeicher einfügen und auslesen.

    Nun möchte ich aber feststellen, ob z. B. Dateien im Explorer mit Strg+X o. Strg+C in den Zwischenspeicher einfügt wurden. In meinem DokMa-Programm führe ich hierfür ein Flag (blnMove). Das ist also kein Problem. Aber wie mache ich das mit einem externen Programm?

    Hier einmal der von mir verwendete Code, der einwandfrei funktioniert:

    '// --------------------------------------------------------------------------------
    '// Modul:      modSetClipboardFiles (23.02.2002)
    '//             Dateien in die Zwischenablage kopieren
    '// Artikel:    n.a.
    '//
    '// Copyright:  ©2002 Thorsten Dörfler (doerfler.t@vb-hellfire.de)
    '//             http://www.vb-hellfire.de/
    '// --------------------------------------------------------------------------------
    
    ' Dieser Source stammt von http://www.activevb.de
    ' und kann frei verwendet werden. Für eventuelle Schäden
    ' wird nicht gehaftet.
    '
    ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
    ' Ansonsten viel Spaß und Erfolg mit diesem Source !
    '
    ' Autor: Achim Neubauer (entrox@freak-style.de)
    
    '// --------------------------------------------------------------------------------
    
    Option Explicit
    
    Private Type POINTAPI
      x As Long
      y As Long
    End Type
    
    Private Type DROPFILES
      pFiles As Long
      pt     As POINTAPI
      fNC    As Long
      fWide  As Long
    End Type
    
    
    
    Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
    Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "user32" () As Long
    Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hmem As Long) As Long
    Private Declare Function CloseClipboard Lib "user32" () As Long
    
    Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
    Private Declare Function GlobalLock Lib "kernel32" (ByVal hmem As Long) As Long
    Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hmem As Long) As Long
    
    Private Const GMEM_MOVEABLE = &H2
    
    Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    
    Private Const CF_HDROP = 15
    Private Const MAX_PATH As Long = 260
    
    
    Public Function ClipboardSetFiles(ByRef Files As Collection) As Boolean
      Dim lFiles    As String
      Dim lFile     As Variant
      Dim lDrop     As DROPFILES
      Dim lSize     As Long
      Dim lMemCopy  As Long
      Dim lpMemCopy As Long
      
      If Not CBool(Files.Count) Then Exit Function
      
      For Each lFile In Files
        lFiles = lFiles & CStr(lFile) & vbNullChar
      Next
      
      lFiles = lFiles & vbNullChar
      
      lDrop.pFiles = Len(lDrop)
      
      If CBool(OpenClipboard(0)) Then
        lSize = Len(lDrop) + Len(lFiles)
        lMemCopy = GlobalAlloc(GMEM_MOVEABLE, lSize)
    
        If CBool(lMemCopy) Then
          lpMemCopy = GlobalLock(lMemCopy)
          
          If CBool(lpMemCopy) Then
            MoveMemory ByVal lpMemCopy, lDrop, Len(lDrop)
            lSize = lpMemCopy + Len(lDrop)
            MoveMemory ByVal lSize, ByVal lFiles, Len(lFiles)
            
            GlobalUnlock lMemCopy
            
            EmptyClipboard
            ClipboardSetFiles = CBool(SetClipboardData(CF_HDROP, lMemCopy))
          End If
        End If
        CloseClipboard
      End If
    End Function
    
    Public Function GetDragFilelist(Handle As Long, Files As Collection) As Long
        
        Dim hDrop As Long 'Handle auf die Clipboard-Daten
        Dim nFiles As Long 'Anzahl der Dateien in den Daten
        Dim Filename As String 'temporäre Variable
        Dim T As Long 'temporäre Variable
        Dim Result As Long 'temporäre Variable
        
        If IsClipboardFormatAvailable(CF_HDROP) Then 'Wenn Daten vom Typ CF_HDROP vorhanden sind
            Call OpenClipboard(0&) 'Clipboard öffnen
            hDrop = GetClipboardData(CF_HDROP) 'Handle auf Daten holen
            
            nFiles = DragQueryFile(hDrop, -1&, "", 0) 'Anzahl der Dateien abfragen
            
            For T = 0 To nFiles - 1
                Filename = Space(MAX_PATH)
                Result = DragQueryFile(hDrop, T, Filename, Len(Filename)) 'Dateiname(T) holen
                Files.Add Left(Filename, Result)
            Next T
        End If
        
        GetDragFilelist = nFiles 'Anzahl der geholten Dateien als Funktionswert  zurückliefern
        
        CloseClipboard 'Clipboard schließen
        
    End Function
    

    Die API-Funktion 'GetAsyncKeyState' verwende ich schon für die Strg+Taste. Aber insgesamt ist mir das einfach zu unsicher. Ich bräuchte einen eindeutigen allgemeingültigen Flag für Strg+X u. Strg+C.

    Vielen Dank im voraus.

    Gruß Ahmed

    Montag, 6. Januar 2014 13:38

Antworten

  • Oh Mann ich bin doch echt ein Schaf.

    Thorsten Dörfler hat ja auf seiner Webseite selbst schon die Lösung und ein Beispiel gebracht.

    http://classic.vb-faq.de/knowlib/getclipboardfiles

    Ich muss lediglich nur noch die Konstante 'FileDropEffectConstants' abfragen und schon habe ich alles was ich benötige.

    Mein Problem sollte also damit erledigt sein.

    Gruß Ahmed

    Montag, 6. Januar 2014 18:49

Alle Antworten

  • Hallo,
    was genau hast du denn vor? Ich bin kein VB Classic Profi. Wenn du eine Datei im Explorer kopierst, dann ändert sich die Zwischenablage. Dein Programm könnte diese nun überwachen (Siehe Active VB) und ggf. reagieren. Die Tastenkombinationen zu überwachen bringt nicht viel, da es viele geibt die die Tastatur verwendne und sicherlich auch das eine oder andere Programm Daten in die Zwischenablage legt.

    Oder willst eine Art Drag and Drop implementieren?

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Montag, 6. Januar 2014 14:51
    Moderator
  • Hallo Tom,

    mein DokMa-Programm ist eine Art Dokumentenmanager. Bisher hatte ich Dateien in meinem Programm über ein Listview per Drag & Drop verschoben. Leider unterstützt das von mir jetzt verwendete S-Grid von Accelerator kein Ole-Drag&Drop, so dass ich ausschließlich mit Strg+C/Strg+X und Strg+V arbeite. Das funktioniert auch alles einwandfrei.

    Wird in meinem Programm die Strg+X-Tasten gedrückt, wird der Flag blnMove = True gesetzt, so dass ich weiß, dass alle Dateien mit Strg+V nicht kopiert, sondern verschoben werden sollen.

    Werden aber Dateien im Windows Explorer markiert und in meinem Programm mit Strg+V eingefügt, möchte ich jetzt ebenfalls ermitteln, ob im Explorer Strg+C o. Strg+X gedrückt wurde. Ansonsten werden alle Dateien immer nur kopiert und der Anwender muss anschließend die Dateien nachträglich manuell löschen.

    Daher meine Frage.

    Gruß Ahmed

    Montag, 6. Januar 2014 17:12
  • Oh Mann ich bin doch echt ein Schaf.

    Thorsten Dörfler hat ja auf seiner Webseite selbst schon die Lösung und ein Beispiel gebracht.

    http://classic.vb-faq.de/knowlib/getclipboardfiles

    Ich muss lediglich nur noch die Konstante 'FileDropEffectConstants' abfragen und schon habe ich alles was ich benötige.

    Mein Problem sollte also damit erledigt sein.

    Gruß Ahmed

    Montag, 6. Januar 2014 18:49