Как получить путь к файлу из буфера обмена в проводнике Windows?
Я попытался получить путь к файлу из буфера обмена (скопированный файл) в проводнике Windows.
Я написал:
Set Ws = CreateObject("WScript.Shell")
MsgBox Ws.ClipBoard
Но в нем говорится об ошибке:
Ошибка: объект не поддерживает это свойство или метод: 'Ws.ClipBoard'
У меня есть несколько способов получения данных из буфера обмена, но они относятся только к Internet Explorer, а не к пути к файлу Windows Explorer.
1 ответ
Решение
Это показывает, как работать с HDrop. VBScript легко переносится на VB.NET (заключите все параметры в скобки и затемните все As Object
).
REM PrintClip.bat #2 Also does filenames on the clipboard
REM This file compiles PrintClip.vb to PrintClip.exe
REM PrintClip.exe prints any text or filenames on the clipboard to a console
REM To use
REM PrintClip
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:exe /out:"%~dp0\PrintClip.exe" "%~dp0\PrintClip.vb" /verbose
pause
'PrintClip.vb #2
Imports System
Imports System.IO
Imports System.Runtime.InteropServices
Imports Microsoft.Win32
Public Module PrintClip
Public Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Integer
Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) As IntPtr
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As IntPtr) As Integer
Public Declare Function CloseClipboard Lib "user32" () As Integer
Public Declare UNICODE Function DragQueryFileW Lib "shell32.dll" (ByVal HDROP As Integer, ByVal UINT As Integer, ByVal lpStr As String, ByVal ch As Integer) As Integer
Public Const CF_TEXT = 1
Public Const CF_BITMAP = 2
Public Const CF_METAFILEPICT = 3
Public Const CF_SYLK = 4
Public Const CF_DIF = 5
Public Const CF_TIFF = 6
Public Const CF_OEMTEXT = 7
Public Const CF_DIB = 8
Public Const CF_PALETTE = 9
Public Const CF_PENDATA = 10
Public Const CF_RIFF = 11
Public Const CF_WAVE = 12
Public Const CF_UNICODETEXT = 13
Public Const CF_ENHMETAFILE = 14
Public Const CF_HDROP = 15
Public Const CF_OWNERDISPLAY = &H80
Public Const CF_DSPTEXT = &H81
Public Const CF_DSPBITMAP = &H82
Public Const CF_DSPMETAFILEPICT = &H83
Public Const CF_DSPENHMETAFILE = &H8E
Sub Main()
' On Error Resume Next
Dim Ret as IntPtr
If OpenClipboard(0) <> 0 then
If IsClipboardFormatAvailable(CF_UNICODETEXT) <> 0 then
Ret = GetClipboardData( CF_UNICODETEXT)
Console.writeline(Marshal.PtrToStringUni(Ret))
Environment.ExitCode = 0
ElseIf IsClipboardFormatAvailable(CF_hDrop) <> 0 then
Dim TotalCount as Integer
Dim FName as String
Dim hDrop as IntPtr
hDrop = GetClipboardData( CF_hDrop)
FName = Space(33000)
TotalCount = DragQueryFileW(hDrop, &hFFFFFFFF, FName, 33000)
For x = 0 to TotalCount - 1
FName = Space(33000)
If DragQueryFileW(hDrop, x, FName, 33000) <> 0 then
Console.writeline(Trim(FName))
End If
Next
Environment.ExitCode = 0
Else
Environment.ExitCode = 1
Console.writeline("No text or filenames on clipboard")
End If
CloseClipboard()
Else
Environment.ExitCode = err.lastdllerror
Console.Writeline("Clipboard is locked by another application")
End If
End Sub
End Module