Benutzer mit den meisten Antworten
Wie feststellen ob mit Strg+X o. Strg+C Dateien in Clipboard eingefügt wurden

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
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
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Montag, 6. Januar 2014 19:16
- Als Antwort markiert Ahmed Martens Donnerstag, 9. Januar 2014 12:50
Alle Antworten
-
Hallo,
Oder willst eine Art Drag and Drop implementieren?
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.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. -
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
-
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
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Montag, 6. Januar 2014 19:16
- Als Antwort markiert Ahmed Martens Donnerstag, 9. Januar 2014 12:50