Я пытаюсь «удалить» файл изображения в текущем местоположении мыши, FileType PNG (всегда).
Под «перетаскиванием» я подразумеваю тот же тип функциональности, что и при нажатии и удерживании изображения, а затем перетаскивание его в другое место при нажатии горячей клавиши.
Таким образом, я могу вставьте изображение, которое я только что «обрезал», и вставьте его, как если бы это был файл с соответствующим именем файла. (это в первую очередь предназначено для вставки в WordPress и не имеет плагина для этого)
Я написал код, чтобы получить изображение из буфера обмена и сохранить его. Но теперь я хочу захватить это изображение и бросить его при помощи мыши, когда нажата горячая клавиша.
Горячая клавиша работает «Асинхронно», при этом мое приложение не имеет фокуса (как и предполагалось), но теперь я застрял на самом деле удаление этого файла при нажатии горячей клавиши.
Моя форма (обновлено 27, январь 2020 г.):
Option Explicit
Private Sub Command1_Click()
'Placeholder: a button so i can control when the file is grabbed from
' the clipboard.
'The inputbox is required to enter a filename for this image. This is important
'since we only want to drop a file that has an appropriate filename.
Dim ImageName$
Picture1.Picture = Clipboard.GetData 'Grab image from the clipboard
''Clipboard.Clear
ImageName$ = InputBox("Provide filename") 'Enter filename for the image
FileName$ = ImageName$
Text1.Text = FileName$
End Sub
Sub On_Event_Keypress(FileName$)
'When the F9 key is pressed
Dim FilePath$, MouseX&, MouseY&
FilePath$ = App.Path + "\" 'Save the image to the current App.Path root
SavePicture Picture1.Image, FilePath$ & FileName$ & ".png" 'Save picture to Disk
FileName$ = FilePath$ & FileName$ & ".png"
Call PasteIt(FileName$) 'Load image from Imagelocation and DragAndDrop it where mouse currently is.
End Sub
Public Sub PasteIt(ByVal FileName As String)
'When F9 is pressed, the previous saved file is loaded to the OLE object.
'Then a drag action is started, but because this action will make the mouse
'jump back to the OLE control, i record the mouse position and move it back
'to where the drop action should take place.
'Not sure wheter to use OLE but this seems to reflect an actual drag action while i
'was testing. It's very much possible that this can be done using a filehandle or somesort
'im just not sure where to start to achieve the Drop action like a DragAndDrop sequence.
'Load the saved file to a control
OLE1.SourceDoc = FileName
'Get current mouse position. So the program knows where to 'drop' the dragged picture
Call GetCursorPos(Mpos)
OLE1.Drag vbBeginDrag 'Start the DragAndDrop action
SetCursorPos Mpos.X, Mpos.Y 'Mouse the mousecursor back to where the F9 key was pressed
Stop 'This is where i'm stuck and know im close. The mousecursor is holding an item, but i can't drop
'it like i was dragging it myself
End Sub
Private Sub OLE1_DragDrop(Source As Control, X As Single, Y As Single)
Stop
End Sub
Private Sub Timer1_Timer()
'Checks if the picturebox is loaded with an image
'Then listens to the F9 keypress
If Picture1.Picture Then
If GetAsyncKeyState(vbKeyF9) Then
'Hotkey pressed,do dragdrop at mousepos
Call On_Event_Keypress(Text1.Text)
End If
End If
End Sub
Мой модуль (обновлено 27, январь 2020 г.):
Option Explicit
Public Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Type POINTAPI
X As Long
Y As Long
End Type
Public Mpos As POINTAPI
Public FileName$
Я пытался смоделировать это с помощью следующего, но это не сработало ..:
Public ssfDESKTOP As Variant
Public FILE As Variant
Public Sub PasteIt(ByVal FileName As String)
ssfDESKTOP = 0
FILE = FileName
With CreateObject("Shell.Application").NameSpace(ssfDESKTOP)
With .ParseName(FILE)
.InvokeVerb "copy" 'This is a canonical verb and should work for any
'regional and language settings.
End With
End With
End Sub
Но copy
не происходит. Когда я вручную нажимаю кнопку «Вставить», он вставляет файл в проводнике, но это не та функция, которая мне нужна.
Я просто изменил название, чтобы лучше отразить последнюю проблему, которую я пытаюсь выполнить. чтобы решить.
После того, как я придумал разные фразы для одной и той же проблемы, я снова оказался в тупике, просто потому, что пока не понимаю, как OLEdrag
работает для объекта image
. Этот объект на самом деле имеет OLEdragdrop, но я не уверен, что требуется, чтобы назвать его startdrag
и завершить sh его с помощью моей мыши, щелкнув там, где я хотел его отбросить.