Задача:
1. Пользователь выбирает 5 файлов в папке, жмёт хоткей, получает архив этих файлов в той же папке.
2. Тоже самое но не обязательно архив, это может быть другая команда.
Техническая реализация:
вариант 1, использовать ранее обсуждаемую DLL, каким то образом вызвав пункт меню, или вызвать функцию внутри DLL. Но не так всё просто с вызовом функции, там работает внутренний механизм связанный с реестром, просто вызвать функцию не получится. Аналогично имя пункта меню может быть разное, поэтому выслать активацию меню и выбор пункта по букве не универсальное решение.
вариант 2, используя программу TrueLounchBar, которая регистрирует хоткей, запустить исполняемый файл написанный на PureBasic, который высылает хоткей Ctrl + Insert, копируя список в буфер обмена. Но как оказалось список в специальном формате, и если прога CLCL или AutoIt3 понимает этот формат и преобразовывает его в текст, то функция GetClipboardText() не понимает этот формат, надежда получить список файлов в виде текста, который потом разделить на список по символу переноса не оправдалась. Либо нужно создать аналог GetClipboardText() но для файлового дескриптора, либо найти функцию как в ранее указанной DLL, типа DragQueryFile_(), которая перечисляет выделенные файлы. Ну и далее уже используя ini-файл сделать исполняемый файл универсальный, который запустит батник или другой исполняемый файл и передаст ему файлы в ком-строке.
Человеку нужно именно удобство хоткей, а не вызов меню, так как если операция делается очень часто то вызов меню и поиск пункта напрягает, а если решить эту проблему, то получится универсальное решение для проводника для любых случаев.
EnableExplicit ; [url=http://purebasic.mybb.ru/viewtopic.php?id=905]SendKey[/url] XIncludeFile "SendKey.pbi" Global hWnd_Find Structure CtrlClass Control.i Class.s EndStructure ; Поиск элемента по ID и классу Procedure enumChildren0(hwnd, *ctcl.CtrlClass) Protected classText$ If hwnd If GetDlgCtrlID_(hwnd) = *ctcl\Control classText$ = Space(256) GetClassName_(hwnd, @classText$, 256) If classText$ = *ctcl\Class hWnd_Find = hwnd ProcedureReturn 0 EndIf EndIf ; Debug classText$ ; Debug GetDlgCtrlID_(hwnd) ; OutputDebugString_(Str(GetDlgCtrlID_(hwnd)) + #TAB$ + classText$ + #TAB$ + Text$) EndIf ProcedureReturn 1 EndProcedure Procedure GetActiveWindowExporer() Protected hWnd, classText$, Text$, Pos Protected ctcl.CtrlClass ctcl\Control = 1001 ctcl\Class = "ToolbarWindow32" classText$ = Space(256) ; Protected RECT.RECT hWnd = GetForegroundWindow_() ; GetWindowRect_(Handle,@RECT.RECT) GetClassName_(hWnd, @classText$, 256) If classText$ = "CabinetWClass" ; OutputDebugString_(classText$) EnumChildWindows_(hWnd, @enumChildren0(), @ctcl) Text$ = Space(256) GetWindowText_(hWnd_Find, @Text$, 256) Pos = FindString(Text$, ": ") If Pos Text$ = Mid(Text$, pos + 2) EndIf If FileSize(Text$) = -2 ; высылает хоткей Ctrl + Insert SendKey(#VK_INSERT, #MOD_LCONTROL) Delay(30) Text$ = GetClipboardText() MessageRequester("", Text$) EndIf OutputDebugString_(Text$) ; Debug classText$ ; MessageRequester("", classText$) EndIf EndProcedure GetActiveWindowExporer()
Нашёл решение с DragQueryFile_()
Готовая программа Com2Selfiles
Обновление
теперь ini-файл может содержать несколько секций, а через ком-строку в Com2Selfiles передаётся имя секции, которую использовать. Так получается одна программа и куча семплов/пресетов.
Отредактировано AZJIO (14.12.2022 09:53:32)