1

Тема: AHK: Перенос выделенного файла в папку

Приветствую. Хочу задать вопрос.
В данный момент появилась необходимость сортировки вручную 30тыс изображений по определенной тематике. Наслышан про возможно AHK и сам пользовался ими в молодости (Бинды для онлайн игр).

Искал информацию об этом, но нашел лишь "конкретный файл в конкретную папку". А мне требуется полная подстройка под ситуацию. То есть выделенный мышкой файл по нажатию определенного бинда (Прим. Numpad) будет переноситься в заранее записанную на этот бинд папку. К тому же, таких папок будет очень много, следовательно менять конечный пункт в коде придется часто.

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

В коде разобраться смогу, для перестройки конечной папки.
Спасибо!

2

Re: AHK: Перенос выделенного файла в папку

Поищите по форуму "значок под курсором", что-то вроде этого. Скрипт получает путь к файлу и перемещает его в нужную папку.

3

Re: AHK: Перенос выделенного файла в папку

Поищите по форуму "значок под курсором", что-то вроде этого.

Зачем, Ведь нужно вроде:

выделенный мышкой файл по нажатию определенного бинда

Я б не мудрствовал и пускал через буфер обмена:

folder := "c:\temp"

f11::
clipboard := ""
Send, ^{vk43}   ; Ctrl + C
ClipWait, 2
if ErrorLevel
{
   MsgBox, Буфер обмена пуст!
   Return
}
Loop, parse, clipboard, `n, `r
   FileMove,%A_LoopField%, %folder%
Return

4

Re: AHK: Перенос выделенного файла в папку

По F10 помещает выделенные файлы в активном окне в Рабочий стол\MyFirstFolder, по F11 в Рабочий стол\MySecondFolder:

KeysAndFolders := {F10: A_Desktop "\MyFirstFolder", F11: A_Desktop "\MySecondFolder"}
F10::
F11::
   if !Paths := GetSelected()  {
      MsgBox, Выделенные файлы не найдены!
      Return
   }
   if !FileExist(dir := KeysAndFolders[A_ThisHotkey])
      FileCreateDir, % dir
   
   Loop, parse, Paths, `n
      FileMove, % A_LoopField, % dir
   Return

GetSelected(hwnd="")
{
   if (hwnd = "")
      WinGet, hwnd,, A
   
   for window in ComObjCreate("Shell.Application").Windows
      if (window.hwnd = hwnd && found := 1)
         break

   if !found
      return

   for item in window.document.SelectedItems
      paths .= item.path "`n"
   
   Return Trim(paths, "`n")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Перенос выделенного файла в папку

Ну вот тут разве GoTo не предпочтительней?
Добавлять проще.

f11::
folder := "c:\temp"
GoTo, filemove
f12::
folder := "c:\temp1"
GoTo, filemove

filemove:
clipboard := ""
Send, ^{vk43}   ; Ctrl + C
ClipWait, 2
if ErrorLevel
{
   MsgBox, Буфер обмена пуст!
   Return
}
Loop, parse, clipboard, `n, `r
   FileMove,%A_LoopField%, %folder%
Return

6

Re: AHK: Перенос выделенного файла в папку

Чем предпочтительней? GoTo — зло, Clipboard предназначен для пользователя, а не для приложений.

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

7 (изменено: Malcev, 2015-07-26 00:51:44)

Re: AHK: Перенос выделенного файла в папку

Зло - не зло, но в мой код добавить новый хотки проще, чем в твой.
Мой:

f11::
folder := "c:\temp"
GoTo, filemove
f12::
folder := "c:\temp1"
GoTo, filemove

Твой:

KeysAndFolders := {F10: A_Desktop "\MyFirstFolder", F11: A_Desktop "\MySecondFolder"}
F10::
F11::

А буфер обмена дает нам больше маневров - твой вариант будет работать только в эксплорере.

8

Re: AHK: Перенос выделенного файла в папку

Чем проще-то? У меня они все в одном месте, у тебя будут вразнобой. Впрочем, этот момент в данном случае не принципиален, как удобнее.

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

9

Re: AHK: Перенос выделенного файла в папку

Спасибо всем!
Malcev тебе отдельное спасибо, скрипт работает и я могу его сам редактировать. Простота тут кстати! Поставил плюс в репутацию.

10

Re: AHK: Перенос выделенного файла в папку

Вот библиотека специально для таких дел:

/*
    Library for getting info from a specific explorer window (if window handle not specified, the currently active
    window will be used).  Requires AHK_L or similar.  Works with the desktop.  Does not currently work with save
    dialogs and such.
    
    
    Explorer_GetSelected(hwnd="")   - paths of target window's selected items
    Explorer_GetAll(hwnd="")        - paths of all items in the target window's folder
    Explorer_GetPath(hwnd="")       - path of target window's folder
    
    example:
        F1::
            path := Explorer_GetPath()
            all := Explorer_GetAll()
            sel := Explorer_GetSelected()
            MsgBox % path
            MsgBox % all
            MsgBox % sel
        return
    
    Joshua A. Kinnison
    2011-04-27, 16:12
*/
Explorer_GetPath(hwnd="")
{
    if !(window := Explorer_GetWindow(hwnd))
        return ErrorLevel := "ERROR"
    if (window="desktop")
        return A_Desktop
    path := window.LocationURL
    path := RegExReplace(path, "ftp://.*@","ftp://")
    StringReplace, path, path, file:///
    StringReplace, path, path, /, \, All 
    
    ; thanks to polyethene
    Loop
        If RegExMatch(path, "i)(?<=%)[\da-f]{1,2}", hex)
            StringReplace, path, path, `%%hex%, % Chr("0x" . hex), All
        Else Break
    return path
}
Explorer_GetAll(hwnd="")
{
    return Explorer_Get(hwnd)
}
Explorer_GetSelected(hwnd="")
{
    return Explorer_Get(hwnd,true)
}

Explorer_GetWindow(hwnd="")
{
    ; thanks to jethrow for some pointers here
    WinGet, process, processName, % "ahk_id" hwnd := hwnd? hwnd:WinExist("A")
    WinGetClass class, ahk_id %hwnd%
    
    if (process!="explorer.exe")
        return
    if (class ~= "(Cabinet|Explore)WClass")
    {
        for window in ComObjCreate("Shell.Application").Windows
            if (window.hwnd==hwnd)
                return window
    }
    else if (class ~= "Progman|WorkerW") 
        return "desktop" ; desktop found
}
Explorer_Get(hwnd="",selection=false)
{
    if !(window := Explorer_GetWindow(hwnd))
        return ErrorLevel := "ERROR"
    if (window="desktop")
    {
        ControlGet, hwWindow, HWND,, SysListView321, ahk_class Progman
        if !hwWindow ; #D mode
            ControlGet, hwWindow, HWND,, SysListView321, A
        ControlGet, files, List, % ( selection ? "Selected":"") "Col1",,ahk_id %hwWindow%
        base := SubStr(A_Desktop,0,1)=="\" ? SubStr(A_Desktop,1,-1) : A_Desktop
        Loop, Parse, files, `n, `r
        {
            path := base "\" A_LoopField
            IfExist %path% ; ignore special icons like Computer (at least for now)
                ret .= path "`n"
        }
    }
    else
    {
        if selection
            collection := window.document.SelectedItems
        else
            collection := window.document.Folder.Items
        for item in collection
            ret .= item.path "`n"
    }
    return Trim(ret,"`n")
}

Использование:


#include lib.ahk
f11::
files:= Explorer_GetSelected()
if (Files != "error")
    Loop, Parse, Files, `n, `r
        FileCopy, % A_loopField, % PathToYouFolder
return

11

Re: AHK: Перенос выделенного файла в папку

Teadrinker, код из 4 поста не работает на рабочем столе.
Подправишь?

12

Re: AHK: Перенос выделенного файла в папку

KeysAndFolders := {F10: A_Desktop "\MyFirstFolder", F11: A_Desktop "\MySecondFolder"}
F10::
F11::
   if !paths := GetSelected()  {
      MsgBox, Выделенные файлы не найдены!
      Return
   }
   if !FileExist(dir := KeysAndFolders[A_ThisHotkey])
      FileCreateDir, % dir
   
   Loop, parse, paths, `n
   {
      if !InStr(FileExist(A_LoopField), "D")
         FileMove, % A_LoopField, % dir
      else {
         SplitPath, A_LoopField, DirName
         FileMoveDir, % A_LoopField, % dir "\" DirName
      }
   }
   PostMessage, WM_COMMAND := 0x111, Refresh := 41504,,, % "ahk_id" HWND_BROADCAST := 0xFFFF
   Return

GetSelected(hwnd="")
{
   if (hwnd = "")
      WinGet, hwnd,, A
   
   WinGetClass class, ahk_id %hwnd%
   
   if (class ~= "(Cabinet|Explore)WClass")  {
      for window in ComObjCreate("Shell.Application").Windows
         if (window.hwnd = hwnd && found := 1)
            break

      if !found
         return

      for item in window.document.SelectedItems
         paths .= item.path "`n"
   }
   
   else if (class ~= "Progman|WorkerW")  {
      for item in GetDesktopIShellFolderViewDual().SelectedItems
         paths .= item.path . "`n"
   }
   Return Trim(paths, "`n")
}

GetDesktopIShellFolderViewDual()
{
    IShellWindows := ComObjCreate("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}")
    desktop := IShellWindows.Item(ComObj(19, 8)) ; VT_UI4, SCW_DESKTOP                
   
    ; Retrieve top-level browser object.
    if ptlb := ComObjQuery(desktop
        , "{4C96BE40-915C-11CF-99D3-00AA004AE837}"  ; SID_STopLevelBrowser
        , "{000214E2-0000-0000-C000-000000000046}") ; IID_IShellBrowser
    {
        ; IShellBrowser.QueryActiveShellView -> IShellView
        if DllCall(NumGet(NumGet(ptlb+0)+15*A_PtrSize), "ptr", ptlb, "ptr*", psv) = 0
        {
            ; Define IID_IDispatch.
            VarSetCapacity(IID_IDispatch, 16)
            NumPut(0x46000000000000C0, NumPut(0x20400, IID_IDispatch, "int64"), "int64")
           
            ; IShellView.GetItemObject -> IDispatch (object which implements IShellFolderViewDual)
            DllCall(NumGet(NumGet(psv+0)+15*A_PtrSize), "ptr", psv
                , "uint", 0, "ptr", &IID_IDispatch, "ptr*", pdisp)
           
            IShellFolderViewDual := ComObjEnwrap(pdisp)
            ObjRelease(psv)
        }
        ObjRelease(ptlb)
    }
    return IShellFolderViewDual
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13 (изменено: RoboMilk, 2024-04-07 14:18:10)

Re: AHK: Перенос выделенного файла в папку

teadrinker, здравствуйте!
Код работает, но не работает, если нажать на F10 или F11, когда файл (.png .jpg) просматривается в активном окне.
Можете, пожалуйста, код улучшить?

Post's attachments

Screenshot_1.png
Screenshot_1.png 2.63 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

14

Re: AHK: Перенос выделенного файла в папку

Чтобы не было кракозябров, сохраняйте скрипт в кодировке UTF-8 с BOM. Не уверен, что точно понял, что у вас происходит, но предполагаю, что вы пытаетесь перенести файл, который открыт в каком-то приложении. Этого сделать не получится.

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

15 (изменено: RoboMilk, 2024-04-08 19:21:37)

Re: AHK: Перенос выделенного файла в папку

teadrinker, когда в момент просмотра через средство просмотра фотографий Windows нажимаю F10/F11, то картинка не отправляется в папку и выскакивают кракозябры

Post's attachments

Screenshot_5.png 218.58 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

16

Re: AHK: Перенос выделенного файла в папку

Используйте мой вариант с буфером обмена.