Total Members Voted: 5
0 Members and 1 Guest are viewing this topic.
из проводника? боюсь, не получится. Это нужно в проводник встраивать функцию
3. Кнопка "открыть"4. Кнопка "+"
#Persistent/*;enable Debug view a_scriptPID := DllCall("GetCurrentProcessId") ; get script's PID ifwinexist, DebugView on ; kill it if the debug viewer is running from an older instance { winactivate, DebugView on Winwaitactive, DebugView on winclose, DebugView on } run, %A_ScriptDir%\DebugView\Dbgview.exe /f winwait, DebugView on winactivate, DebugView on Winwaitactive, DebugView on sendinput, !E{down}{down}{down}{down}{down}{Enter} winwait, DebugView Filter winactivate, DebugView Filter Winwaitactive, DebugView Filter mouseclick, left, 125, 85 send, [%a_scriptPID%*{Enter}*//*Executes context menu entries of shell items without showing their menusUsage:ShellContextMenu("Desktop",1) ;Calls "Next Desktop background" in Win71st parameter can be "Desktop" for empty selection desktop menu, a path, or an idlLeave 2nd parameter empty to show context menu and extract idn by clicking on an entry (shows up in debugview)*/ ShellContextMenu(sPath,idn) { DllCall("ole32\OleInitialize", "Uint", 0) if (spath="Desktop") { DllCall("shell32\SHGetDesktopFolder", "UintP", psf) DllCall(NumGet(NumGet(1*psf)+32), "Uint", psf, "Uint", 0, "Uint", GUID4String(IID_IContextMenu,"{000214E4-0000-0000-C000-000000000046}"), "UintP", pcm) } else { If sPath Is Not Integer DllCall("shell32\SHParseDisplayName", "Uint", Unicode4Ansi(wPath,sPath), "Uint", 0, "UintP", pidl, "Uint", 0, "Uint", 0) Else DllCall("shell32\SHGetFolderLocation", "Uint", 0, "int", sPath, "Uint", 0, "Uint", 0, "UintP", pidl) DllCall("shell32\SHBindToParent", "Uint", pidl, "Uint", GUID4String(IID_IShellFolder,"{000214E6-0000-0000-C000-000000000046}"), "UintP", psf, "UintP", pidlChild) DllCall(NumGet(NumGet(1*psf)+40), "Uint", psf, "Uint", 0, "Uint", 1, "UintP", pidlChild, "Uint", GUID4String(IID_IContextMenu,"{000214E4-0000-0000-C000-000000000046}"), "Uint", 0, "UintP", pcm) } Release(psf) CoTaskMemFree(pidl) hMenu := DllCall("CreatePopupMenu") idnMIN=1 DllCall(NumGet(NumGet(1*pcm)+12), "Uint", pcm, "Uint", hMenu, "Uint", 0, "Uint", idnMIN, "Uint", 0x7FFF, "Uint", 0) ; QueryContextMenu DetectHiddenWindows, On Process, Exist WinGet, hAHK, ID, ahk_pid %ErrorLevel% if !idn { WinActivate, ahk_id %hAHK% Global pcm2 := QueryInterface(pcm,IID_IContextMenu2:="{000214F4-0000-0000-C000-000000000046}") Global pcm3 := QueryInterface(pcm,IID_IContextMenu3:="{BCFCE0A0-EC17-11D0-8D10-00A0C90F2719}") Global WPOld:= DllCall("SetWindowLong", "Uint", hAHK, "int",-4, "int",RegisterCallback("WindowProc")) DllCall("GetCursorPos", "int64P", pt) DllCall("InsertMenu", "Uint", hMenu, "Uint", 0, "Uint", 0x0400|0x800, "Uint", 2, "Uint", 0) DllCall("InsertMenu", "Uint", hMenu, "Uint", 0, "Uint", 0x0400|0x002, "Uint", 1, "Uint", &sPath) idn2 := DllCall("TrackPopupMenu", "Uint", hMenu, "Uint", 0x0100, "int", pt << 32 >> 32, "int", pt >> 32, "Uint", 0, "Uint", hAHK, "Uint", 0) } else idn2:=idn NumPut(VarSetCapacity(ici,64,0),ici) NumPut(0x4000|0x20000000,ici,4) NumPut(1,NumPut(hAHK,ici,8),12) NumPut(idn2-idnMIN,NumPut(idn2-idnMIN,ici,12),24) if !idn NumPut(pt,ici,56,"int64") DllCall(NumGet(NumGet(1*pcm)+16), "Uint", pcm, "Uint", &ici) ; InvokeCommand if !idn { VarSetCapacity(sName,259), DllCall(NumGet(NumGet(1*pcm)+20), "Uint", pcm, "Uint", idn2-idnMIN, "Uint", 1, "Uint", 0, "str", sName, "Uint", 260) ; GetCommandString outputdebug command string: %sname% idn: %idn2% DllCall("GlobalFree", "Uint", DllCall("SetWindowLong", "Uint", hAHK, "int", -4, "int", WPOld)) Release(pcm3) Release(pcm2) } DllCall("DestroyMenu", "Uint", hMenu) Release(pcm) DllCall("ole32\OleUnInitialize", "Uint", 0) ;pcm2:=pcm3:=WPOld:=0 } WindowProc(hWnd, nMsg, wParam, lParam) { Critical Global pcm2, pcm3, WPOld If pcm3 { If !DllCall(NumGet(NumGet(1*pcm3)+28), "Uint", pcm3, "Uint", nMsg, "Uint", wParam, "Uint", lParam, "UintP", lResult) Return lResult } Else If pcm2 { If !DllCall(NumGet(NumGet(1*pcm2)+24), "Uint", pcm2, "Uint", nMsg, "Uint", wParam, "Uint", lParam) Return 0 } Return DllCall("user32.dll\CallWindowProcA", "Uint", WPOld, "Uint", hWnd, "Uint", nMsg, "Uint", wParam, "Uint", lParam) } VTable(ppv, idx) { Return NumGet(NumGet(1*ppv)+4*idx) } QueryInterface(ppv, ByRef IID) { If StrLen(IID)=38 GUID4String(IID,IID) DllCall(NumGet(NumGet(1*ppv)), "Uint", ppv, "str", IID, "UintP", ppv) Return ppv } AddRef(ppv) { Return DllCall(NumGet(NumGet(1*ppv)+4), "Uint", ppv) } Release(ppv) { Return DllCall(NumGet(NumGet(1*ppv)+8), "Uint", ppv) } GUID4String(ByRef CLSID, String) { VarSetCapacity(CLSID, 16) DllCall("ole32\CLSIDFromString", "Uint", Unicode4Ansi(String,String,38), "Uint", &CLSID) Return &CLSID } CoTaskMemAlloc(cb) { Return DllCall("ole32\CoTaskMemAlloc", "Uint", cb) } CoTaskMemFree(pv) { Return DllCall("ole32\CoTaskMemFree", "Uint", pv) } Unicode4Ansi(ByRef wString, sString, nSize = "") { If (nSize = "") nSize:=DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0) VarSetCapacity(wString, nSize * 2 + 1) DllCall("kernel32\MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nSize + 1) Return &wString }
Если из Проводника/Тотала нужно файл/папку хот-кеем открыть пользуюсь программой Key Manager www.atnsoft.com/rus/keymanager/ .
Получается чуть быстрее перетаскивания
Не знаю, почему эту ф-ю не делают в плеерах, это же супермегаудобно.
Когда-то давно тоже задавал этот вопрос разработчикам, мне объяснили, что функцию эту нужно вшивать в Проводник/Тотал, опцией в Аимпе не отделаешься.........
После этого ничего проще, чем прописать скрипт в hot-key-менеджере я не нашел. Решение достаточно надежное, но если установить программу которая залезет выше Aimp'а в контекстное меню(на скрине это TreeSize), то придется скрипт переписать...........а так из недостатков вроде все
строчка с AIMP'ом в контекстном меню не привязана к определенной позиции.
.......громоздко, но универсально.......хотя я для себя решил: хоткеем я добавляю только папки и только через тотал......
;Add file to playlist by Malcevf11:: path := Explorer_GetPath() all := Explorer_GetAll() sel := Explorer_GetSelected()Loop, parse, sel, `n, `r{ run C:\Program Files\AIMP3\AIMP3.exe /INSERT %A_LoopField%}return 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")}
run C:\Program Files\AIMP3\AIMP3.exe /INSERT %A_LoopField%
f3::Send, ^{vk43} ; Ctrl + CPath := RegExReplace(clipboard, "[\r\n]\R", """ """)Run, %A_ProgramFiles%\AIMP2\AIMP2.exe "%Path%"return
SanekK, а можно сделать, что бы выбранные файлы/папки добавлялись в новый плейлист, но не начинали проигрываться?
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Directory\shell\aimpPlaylist\command]@="\"C:\\Program Files (x86)\\AIMP3\\AIMP3.exe\" /INSERT \"%1\""
Отключить вложенное контекстное меню проводника можно с помощью параметра Cascade в файле aimp3_menu.ini. *
После обновления с 3-ей версии не помню как точно на Aimp 3.20 build 1165 столкнулся с такой проблемой: раньше добавлял пункт в контекстное меню папок:"Aimp: Добавить в плейлист" посредством ключа в реестре, вот экспорт этого ключа в reg-файл:
Ганни, а чем вас не устраивает такой вариант?
Если я правильно понял, раньше у вас пункт "добавить в плейлист" находился в "главном" окне контекстного меню, а не в подменю. Есть специальные программы, которые проводят различные манипуляции с контекстным меню windows. Я бы попробовал их. А чем не удобен вариант с хоткеем (скрипт AHK)?
/INSERT - Добавить объекты в плейлист. [Начнется ли проигрывание добавленных файлов, зависит от выставленных настроек плеера] [Под объектом понимается - плейлист, папка или файл]
Не нашел такого файла
А если внимательно читать?Вопрос: Где программа хранит свои настройки?Ответ: Откройте настройки и найдите внизу ссылку "Папка профиля". Она откроет в Проводнике папку с файлами настроек программы.P.S. билд 1224, иначе можете FAQ\справку прочитать самостоятельно
SubItem3=MenuItemEditTagsSubItem4=MenuItemConvert
SubItemsCount=2Cascade=0
Вроде так по проще будет Code: [Select]f3::Send, ^{vk43} ; Ctrl + CPath := RegExReplace(clipboard, "[\r\n]\R", """ """)Run, %A_ProgramFiles%\AIMP2\AIMP2.exe "%Path%"return
Так в чём у вас заключается проблема с /INSERT никак непойму?
Тут приходится задействовать буфер, наверно, это не очень здорово
Не спорю, конечно вариант с WinApi предпочтительнее. Мой просто проще в плане кода, чтоб новичкам не страшно было смотреть на на много строк кода
Я поначалу пользовался скриптом AHK. Теперь же добавляю папки только перетаскиванием (на десктопе)
А каковы причины?
Иногда (оч. редко) скрипт давал сбои. Плюс, я чаще добавляю целую папку - альбом в качестве отдельного плейлиста, а скрипт работал на добавление в текущий плейлист. В общем, на десктопе как-то не прижилось.
f3::clipboard=Send, ^{vk43} ; Ctrl + CSleep 100If clipboard =returnPath := RegExReplace(clipboard, "[\r\n]\R", """ """)Run, %A_ProgramFiles%\AIMP2\AIMP2.exe "%Path%"ToolTip СделаноSleep 1000ToolTipreturn
а скрипт работал на добавление в текущий плейлист
Run, %A_ProgramFiles%\AIMP2\AIMP2.exe "%Path%"
Run, %A_ProgramFiles%\AIMP2\AIMP2.exe /INSERT "%Path%"
Если добавление нетребуется используйте код выше.
Не очень понял
По идее, можно модифицировать скрипт (если это, конечно, возможно) так, чтобы иметь 2 хоткея; по первому - помещаем треки в текущий плейлист, по второму - создаем новый.
#IfWinActive, ahk_class CabinetWClassf3::clipboard := "" , INSERT := ""Send, ^{vk43} ; Ctrl + C If clipboard =returnMsgBox, 262180, Плейлист АИМП`, добавить файлы, Yes - Добавить в текущий`rNO - Добавить в новый плейлистIfMsgBox YesINSERT := "/INSERT"Path := RegExReplace(clipboard, "[\r\n]\R", """ """)Run, %A_ProgramFiles%\AIMP3\AIMP3.exe %INSERT% "%Path%"return#IfWinActive
#IfWinActive, ahk_class CabinetWClassf3::clipboard := "" Send, ^{vk43} ; Ctrl + C If clipboard =returnPath := RegExReplace(clipboard, "[\r\n]\R", """ """)Run, %A_ProgramFiles%\AIMP3\AIMP3.exe /INSERT "%Path%"return#IfWinActive
#IfWinActive, ahk_class CabinetWClassf4::clipboard := "" Send, ^{vk43} ; Ctrl + C If clipboard =returnPath := RegExReplace(clipboard, "[\r\n]\R", """ """)Run, %A_ProgramFiles%\AIMP3\AIMP3.exe "%Path%"return#IfWinActive
Заметил проблему - при создании нового плейлиста, начинается воспроизведение трека.
В идеале - может появляться на доли секунд полупрозрачное сообщение рядом с треем:
#IfWinActive, ahk_class CabinetWClassf4::clipboard := "" Send, ^{vk43} ; Ctrl + C If clipboard =returnPath := RegExReplace(clipboard, "[\r\n]\R", """ """, Replace)Run, %A_ProgramFiles%\AIMP3\AIMP3.exe /INSERT "%Path%"Replace++TrayTip, AIMP3, Добавлено %Replace% песен, 5000, 1return#IfWinActive
15 треков добавлены в плейлист такой-тоилисоздан плейлист <имя_плейлиста>
Ну это уже к вопросу настроек аимпа.снять отметку сразу воспроизводить при добавлении
Что-то непонятно какой такой плейлист. Где брать его название. У меня просто в дефолтный добавляет.
1. С диалоговым окном есть проблема - оно скрыто плеером, который поверх всех окон
2. При таком способе добавления (через буфер), иногда появляются треки, которые добавляются некорректно - название отображается тусклым, и при воспроизведении АИМП выдает ошибку code: 2 Message: Can't open the fileЯ с таким сталкивался и раньше, только не помню какой именно это был скрипт
Ну, если дефолтный - писать "дефолтный"
TrayTip, AIMP3, Добавлено %Replace% песен, 5000, 1
Может еще создаваться плейлист с названием директории.
Code: [Select]#IfWinActive, ahk_class CabinetWClassf4::clipboard := "" Send, ^{vk43} ; Ctrl + C If clipboard =returnPath := RegExReplace(clipboard, "[\r\n]\R", """ """, Replace)Run, %A_ProgramFiles%\AIMP3\AIMP3.exe /INSERT "%Path%"Replace++TrayTip, AIMP3, Добавлено %Replace% песен, 5000, 1return#IfWinActive
Если этот файл воспроизвести отдельно всё нормально? И есть какаято закономерность какие файлы портятся.
Работает, если выделить несколько файлов. Если же добавить папку с файлами, то будет писать, что добавлен только 1 трек. Т.е. считает число папок, а не треков.
При перетаскивании - все окей. Закономерности пока не нашел, возможно дело в тегах, он берет их из ID3v1 вместо ID3v2.
При перетаскивании - все окей
#IfWinActive, ahk_class CabinetWClassf3::clipboard := "" , INSERT := ""Send, ^{vk43} ; Ctrl + C If clipboard =returnPath = %clipboard%MsgBox, 262180 , Плейлист АИМП`, добавить файлы, Yes - Добавить в текущий`rNO - Добавить в новый плейлистIfMsgBox YesINSERT := "/INSERT"Path := RegExReplace(Path, "[\r\n]\R", """ """)Run, %A_ProgramFiles%\AIMP3\AIMP3.exe %INSERT% "%Path%"return#IfWinActive
В вашем первоначальном варианте с Win Api, такие проблемы были?
SetBatchLInes, -1CoordMode, Mouse ;SearchStr:="&Play in Winamp"SearchStr:="AIMP3", SearchStr2:="Add to playlist" F11:: IfWinNotExist, ahk_class #32768 Send, {AppsKey} WinWait, ahk_class #32768,, 0.25 If ErrorLevel Return MouseGetPos, xPos, yPos SendMessage, 0x1E1 GetMenu(GetMenu(ErrorLevel, SearchStr), SearchStr2) MouseMove, xPos, yPos IfWinExist, ahk_class #32768 WinClose, ahk_class #32768 Return
Производился поиск по контекстному меню.
Попробуйте ещё этот
Может быть это из-за присутствия в названиях иероглифов?
Наверняка. Перечислите символы какие у вас встречаются, и на этом файле открытом через скрипт в аимпе, в свойствах посмотрите к нему путь.
Ещё раз задам вопрос Пришлите полный путь файла на ПК, и того как он отображается в аимпе в свойствах
Да забыл может дело в версии AutoHotkey:У меня на Win-7 64-bit установлен AutoHotkey_L Unicode 32-bit 1.1.09.03
Win7 64-bit, AutoHotkey_L 1.1.07.03Попробую обновиться. Спасибо.
Имхо тема для архива, тема без голосования.