Задача:
1. Пользователь выбирает 5 файлов в папке, жмёт хоткей, получает архив этих файлов в той же папке.
2. Тоже самое но не обязательно архив, это может быть другая команда.
Техническая реализация:
вариант 1, использовать ранее обсуждаемую DLL, каким то образом вызвав пункт меню, или вызвать функцию внутри DLL. Но не так всё просто с вызовом функции, там работает внутренний механизм связанный с реестром, просто вызвать функцию не получится. Аналогично имя пункта меню может быть разное, поэтому выслать активацию меню и выбор пункта по букве не универсальное решение.
вариант 2, используя программу TrueLounchBar, которая регистрирует хоткей, запустить исполняемый файл написанный на PureBasic, который высылает хоткей Ctrl + Insert, копируя список в буфер обмена. Но как оказалось список в специальном формате, и если прога CLCL или AutoIt3 понимает этот формат и преобразовывает его в текст, то функция GetClipboardText() не понимает этот формат, надежда получить список файлов в виде текста, который потом разделить на список по символу переноса не оправдалась. Либо нужно создать аналог GetClipboardText() но для файлового дескриптора, либо найти функцию как в ранее указанной DLL, типа DragQueryFile_(), которая перечисляет выделенные файлы. Ну и далее уже используя ini-файл сделать исполняемый файл универсальный, который запустит батник или другой исполняемый файл и передаст ему файлы в ком-строке.
Человеку нужно именно удобство хоткей, а не вызов меню, так как если операция делается очень часто то вызов меню и поиск пункта напрягает, а если решить эту проблему, то получится универсальное решение для проводника для любых случаев.
EnableExplicit
; [url=https://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)