Задача:
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

Отредактировано AZJIO (15.09.2022 05:19:43)