1 (изменено: alpap, 2021-10-28 19:15:44)

Тема: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

День добрый!
При использовании такого скрипта:


XButton2:: send {LCtrl Down}C{LCtrl Up}
XButton1:: send {LCtrl Down}V{LCtrl Up}

Т.е. на горячие боковые клавиши (4 и 5) назначены стандартные клавиатурные Copy (Ctrl+C), Paste (Ctrl+V).
Это работает, но только с текстом.
А вот копировать-вставить файлы или папки - увы. Те же комбинации Copy (Ctrl+C), Paste (Ctrl+V), назначенные с помощью программы "Key Manager", работают везде и как с текстом так и объектами.
Есть какой-то выход при использовании AHK в данном случае?

2

Re: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

alpap пишет:

Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

То-есть, если назначать на другие горячие клавиши, то нет проблем?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: alpap, 2021-10-28 19:15:12)

Re: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

если назначать на другие горячие клавиши

Я как-то и не подумал попробовать ...
Попробовал - то же самое, копировать-вставить с помощью назначенных горячих клавиш получается только текст.

4

Re: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

alpap, ознакомьтесь, пожалуйста, с правилами, отредактируйте свой пост. Обратите внимание на заглавные буквы в начале предложений.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

Попробуйте так:

XButton2:: PutFilesIntoClipboard( Explorer_GetSelection() )

Explorer_GetSelection() {
   WinGetClass, winClass, % "ahk_id" . hWnd := WinExist("A")
   if !(winClass ~= "^(Progman|WorkerW|(Cabinet|Explore)WClass)$")
      Return
   
   shellWindows := ComObjCreate("Shell.Application").Windows
   if (winClass ~= "Progman|WorkerW")  ; IShellWindows::Item:    https://goo.gl/ihW9Gm
                                       ; IShellFolderViewDual:   https://goo.gl/gnntq3
      shellFolderView := shellWindows.Item( ComObject(VT_UI4 := 0x13, SWC_DESKTOP := 0x8) ).Document
   else {
      for window in shellWindows       ; ShellFolderView object: https://is.gd/eyZ4zG
         if (hWnd = window.HWND) && (shellFolderView := window.Document)
            break
   }
   for item in shellFolderView.SelectedItems
      result .= (result = "" ? "" : "`n") . item.Path
   Return result
}

PutFilesIntoClipboard(fileList) {
   static GHND := 0x42, CF_HDROP := 0xF
   fileList := Trim( RegExReplace(fileList, "\R", "`n"), " `t`r`n" ), RegExReplace(fileList, "\R", "", count)
   VarSetCapacity(DROPFILES, size := 20 + StrLen(fileList) + count + 2, 0)
   NumPut(20, DROPFILES)
   prevLen := 0
   Loop, parse, fileList, `n
      prevLen += StrPut(A_LoopField, &DROPFILES + 20 + prevLen + A_Index - 1, StrLen(A_LoopField), "CP0")
   hMem := DllCall("GlobalAlloc", "UInt", GHND, "Ptr", size, "Ptr")
   pData := DllCall("GlobalLock", "Ptr", hMem, "Ptr")
   DllCall("RtlMoveMemory", "Ptr", pData, "Ptr", &DROPFILES, "Ptr", size)
   DllCall("GlobalUnlock", "Ptr", hMem)
   DllCall("OpenClipboard", "Ptr", 0)
   DllCall("SetClipboardData", "UInt", CF_HDROP, "Ptr", hMem)
   DllCall("CloseClipboard")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6 (изменено: alpap, 2021-10-28 19:48:34)

Re: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

Так XButton2 копирует файлы и/или папки, но если вставить, то вставляется только один последний объект (выделяем "aaa1", "aaa2", копируем, вставляем в новое место, на выходе - только "aaa2"). И так включилась противоположная проблема - теперь не работает с текстом.

7

Re: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

alpap пишет:

вставляется только один последний объект

Так не должно быть, у меня вставляется всё выделенное.

alpap пишет:

теперь не работает с текстом

Чтобы работало и с файлами, и с текстом, можно так:

XButton2::
   if fileList := Explorer_GetSelection()
      PutFilesIntoClipboard(fileList)
   else
      Send ^c
   Return
XButton1:: Send ^v

Explorer_GetSelection() {
   WinGetClass, winClass, % "ahk_id" . hWnd := WinExist("A")
   if !(winClass ~= "^(Progman|WorkerW|(Cabinet|Explore)WClass)$")
      Return
   
   shellWindows := ComObjCreate("Shell.Application").Windows
   if (winClass ~= "Progman|WorkerW")  ; IShellWindows::Item:    https://goo.gl/ihW9Gm
                                       ; IShellFolderViewDual:   https://goo.gl/gnntq3
      shellFolderView := shellWindows.Item( ComObject(VT_UI4 := 0x13, SWC_DESKTOP := 0x8) ).Document
   else {
      for window in shellWindows       ; ShellFolderView object: https://is.gd/eyZ4zG
         if (hWnd = window.HWND) && (shellFolderView := window.Document)
            break
   }
   for item in shellFolderView.SelectedItems
      result .= (result = "" ? "" : "`n") . item.Path
   Return result
}

PutFilesIntoClipboard(fileList) {
   static GHND := 0x42, CF_HDROP := 0xF
   fileList := Trim( RegExReplace(fileList, "\R", "`n"), " `t`r`n" ), RegExReplace(fileList, "\R", "", count)
   VarSetCapacity(DROPFILES, size := 20 + StrLen(fileList) + count + 2, 0)
   NumPut(20, DROPFILES)
   prevLen := 0
   Loop, parse, fileList, `n
      prevLen += StrPut(A_LoopField, &DROPFILES + 20 + prevLen + A_Index - 1, StrLen(A_LoopField), "CP0")
   hMem := DllCall("GlobalAlloc", "UInt", GHND, "Ptr", size, "Ptr")
   pData := DllCall("GlobalLock", "Ptr", hMem, "Ptr")
   DllCall("RtlMoveMemory", "Ptr", pData, "Ptr", &DROPFILES, "Ptr", size)
   DllCall("GlobalUnlock", "Ptr", hMem)
   DllCall("OpenClipboard", "Ptr", 0)
   DllCall("SetClipboardData", "UInt", CF_HDROP, "Ptr", hMem)
   DllCall("CloseClipboard")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

Добавил к коду из #5 строку


XButton1:: send {LCtrl Down}V{LCtrl Up}

теперь копирует объекты в том количестве сколько выделено, т.е. правильно, вставить по XButton1, естественно не получается и все также нет теперь работы с текстом.

9

Re: AHK: Copy, Paste, назначенные на боковые кнопки мыши не видят объекты

Вот теперь четко, спасибо! Код из #7 работает так как надо. Теперь попробую еще погонять его в разных окнах и условиях потом напишу, если будут шероховатости.