You can do it with autohotkey script and offzip.exe http://aluigi.altervista.org/mytoolz/offzip.zip​ Offzip.exe should be placed in the same folder as script. Just select title and press F11. Tested on Premiere CC2017. SetBatchLines -1 #If WinActive("ahk_class Premiere Pro") f11:: if !FileExist("offzip.exe") { MsgBox, 262144, Error!, Error! Place offzip.exe in the folder of script! return } FileName := SaveFile([WinExist("A"), "Save Title"], "title001", {"Premiere Title": "`r*.prtl"}, ,0x00000002 | 0x00000004 | 0x10000000 | 0x02000000) If !FileName return tmp := ClipboardAll Clipboard := "" send ^{vk43} ; c ClipWait, 1, 1 if ErrorLevel = 1 { MsgBox, 262144, Error!, Error! ClipBoard is empty! Clipboard := tmp return } While !DllCall("OpenClipboard", "Ptr", 0) sleep 20 formatCount := DllCall("CountClipboardFormats"), format:=0 Loop % formatCount { format := DllCall("EnumClipboardFormats", "UInt", format) VarSetCapacity(formatName, 512) DllCall("GetClipboardFormatName", "Uint", format, "str", formatName, "Uint", 256) if Instr(formatName, "PProAE/Exchange") break } if !Instr(formatName, "PProAE/Exchange") { MsgBox, 262144, Error!, Error! ClipBoard does not have right format! DllCall("CloseClipboard") Clipboard := tmp return } hText := DllCall("GetClipboardData", "UInt", format, "UInt") pText := DllCall("GlobalLock", "UInt", hText, "UInt") DataText := StrGet(pText, "UTF-8") DllCall("GlobalUnlock", "UInt", hText) DllCall("CloseClipboard") Clipboard := tmp RegexMatch(DataText, "s)<ImporterPrefs Encoding=""base64"".+?>([^\s]+)\s*</ImporterPrefs>", match) if !match1 { MsgBox, 262144, Error!, Error! ClipBoard does not have Premiere Title! return } n := tmpFile1 := tmpFile2 := "" loop 2 { loop { n++ if !FileExist("ahk" n ".tmp") break sleep 10 } tmpFile%A_Index% := "AHK" n ".tmp" } Bytes := Base64Dec(BIN, match1) oFile := FileOpen(tmpFile1, "rw") oFile.RawWrite(BIN, Bytes) oFile.Pos := 32 oFileContent := oFile.Read() oFile.Pos := 0 oFile.Write(oFileContent) oFile.Close() RunWait, offzip.exe %tmpFile1% %tmpFile2%,,Hide FileRead, data, %tmpFile2% if !data { MsgBox, 262144, Error!, Error! ClipBoard does not have Premiere Title! loop 2 FileDelete, % tmpFile%A_Index% return } FileMove, %tmpFile2%, %FileName%, 1 if ErrorLevel { MsgBox, 262144, Error!, Error! Cannot create file! loop 2 FileDelete, % tmpFile%A_Index% return } FileDelete, % tmpFile1 MsgBox, 262144, Done, Done return #If Base64dec(ByRef OutData, ByRef InData) { DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &InData, UInt, StrLen(InData), UInt,1, UInt,0, UIntP, Bytes, UIntP, 0, UIntP, 0) VarSetCapacity(OutData, Bytes) DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &InData, UInt, StrLen(InData), UInt,1, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0) Return Bytes } DirExist(DirName) { loop Files, % DirName, D return A_LoopFileAttrib } /* Displays a standard dialog that allows the user to save a file. Parameters: Owner / Title: The identifier of the window that owns this dialog. This value can be zero. An Array with the identifier of the owner window and the title. If the title is an empty string, it is set to the default. FileName: The path to the file or directory selected by default. If you specify a directory, it must end with a backslash. Filter: Specify a file filter. You must specify an object, each key represents the description and the value the file types. To specify the filter selected by default, add the "`n" character to the value of the key. By default, the first filter is selected. To specify the default extension that will be added to the file names, specify the "`r" character next to the extension. The default character to separate the extensions is ";". The spaces are omitted from the value. CustomPlaces: Specify an Array with the custom directories that will be displayed in the left pane. Missing directories will be omitted. To specify the location in the list, specify an Array with the directory and its location (0 = Lower, 1 = Upper). Options: Determines the behavior of the dialog. This parameter must be one or more of the following values. 0x00000002 (FOS_OVERWRITEPROMPT) = When saving a file, prompt before overwriting an existing file of the same name. 0x00000004 (FOS_STRICTFILETYPES) = Only allow the user to choose a file that has one of the file name extensions specified through Filter. 0x00040000 (FOS_HIDEPINNEDPLACES) = Hide items shown by default in the view's navigation pane. 0x10000000 (FOS_FORCESHOWHIDDEN) = Include hidden and system items. 0x02000000 (FOS_DONTADDTORECENT) = Do not add the item being opened or saved to the recent documents list (SHAddToRecentDocs). You can check all available values at https://msdn.microsoft.com/en-us/library/windows/desktop/dn457282(v=vs.85).aspx. Return: Returns 0 if the user canceled the dialog, otherwise returns the path of the selected file. Example: MsgBox % SaveFile( [0, "Dialog title - SaveFile.."] , A_ComSpec , {Music: "*.mp3", Images: "`n*.jpg;*.png", Videos: "*.avi;*.mp4;*.mkv;*.wmp", Documents: "*.txt"} , [A_WinDir,A_Desktop,A_Temp,A_Startup,A_ProgramFiles] , 0x00000002 | 0x00000004 | 0x10000000 | 0x02000000 ) */ SaveFile(Owner, FileName := "", Filter := "", CustomPlaces := "", Options := 0x6) { ; IFileSaveDialog interface ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775688(v=vs.85).aspx local IFileSaveDialog := ComObjCreate("{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}", "{84BCCD23-5FDE-4CDB-AEA4-AF64B83D78AB}") , Title := IsObject(Owner) ? Owner[2] . "" : "" , Flags := Options ; FILEOPENDIALOGOPTIONS enumeration (https://msdn.microsoft.com/en-us/library/windows/desktop/dn457282(v=vs.85).aspx) , IShellItem := PIDL := 0 ; PIDL recibe la dirección de memoria a la estructura ITEMIDLIST que debe ser liberada con la función CoTaskMemFree , Obj := {}, foo := bar := "" , Directory := FileName Owner := IsObject(Owner) ? Owner[1] : (WinExist("ahk_id" . Owner) ? Owner : 0) Filter := IsObject(Filter) ? Filter : {"All files": "*.*"} if ( FileName != "" ) { if ( InStr(FileName, "\") ) { if !( FileName ~= "\\$" ) ; si «FileName» termina con "\" se trata de una carpeta { local File := "" SplitPath FileName, File, Directory ; IFileDialog::SetFileName ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775974(v=vs.85).aspx DllCall(NumGet(NumGet(IFileSaveDialog+0)+15*A_PtrSize), "UPtr", IFileSaveDialog, "UPtr", &File) } while ( InStr(Directory,"\") && !DirExist(Directory) ) ; si el directorio no existe buscamos directorios superiores Directory := SubStr(Directory, 1, InStr(Directory, "\",, -1) - 1) ; recupera el directorio superior if ( DirExist(Directory) ) { DllCall("Shell32.dll\SHParseDisplayName", "UPtr", &Directory, "Ptr", 0, "UPtrP", PIDL, "UInt", 0, "UInt", 0) DllCall("Shell32.dll\SHCreateShellItem", "Ptr", 0, "Ptr", 0, "UPtr", PIDL, "UPtrP", IShellItem) ObjRawSet(Obj, IShellItem, PIDL) ; IFileDialog::SetFolder method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761828(v=vs.85).aspx DllCall(NumGet(NumGet(IFileSaveDialog+0)+12*A_PtrSize), "Ptr", IFileSaveDialog, "UPtr", IShellItem) } } else ; si «FileName» es únicamente el nombre de un archivo DllCall(NumGet(NumGet(IFileSaveDialog+0)+15*A_PtrSize), "UPtr", IFileSaveDialog, "UPtr", &FileName) } ; COMDLG_FILTERSPEC structure ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb773221(v=vs.85).aspx local Description := "", FileTypes := "", FileTypeIndex := 1 ObjSetCapacity(Obj, "COMDLG_FILTERSPEC", 2*Filter.Count() * A_PtrSize) for Description, FileTypes in Filter { loop parse, FileTypes, ";" ; itera por todas las extensiones separadas por ";" if ( InStr(A_LoopField, "`r") ) ; si se especificó el caracter "`r" en la extensión actual ; IFileDialog::SetDefaultExtension method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775970(v=vs.85).aspx DllCall(NumGet(NumGet(IFileSaveDialog+0)+22*A_PtrSize), "UPtr", IFileSaveDialog, "Str", RegExReplace(A_LoopField,"\s*`n*`r*\**\.*")) FileTypeIndex := InStr(FileTypes,"`n") ? A_Index : FileTypeIndex ObjRawSet(Obj, "#" . A_Index, Trim(Description)), ObjRawSet(Obj, "@" . A_Index, RegExReplace(FileTypes,"\s*`n*`r*")) NumPut(ObjGetAddress(Obj,"#" . A_Index), ObjGetAddress(Obj,"COMDLG_FILTERSPEC") + A_PtrSize * 2*(A_Index-1)) ; COMDLG_FILTERSPEC.pszName NumPut(ObjGetAddress(Obj,"@" . A_Index), ObjGetAddress(Obj,"COMDLG_FILTERSPEC") + A_PtrSize * (2*(A_Index-1)+1)) ; COMDLG_FILTERSPEC.pszSpec } ; IFileDialog::SetFileTypes method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775980(v=vs.85).aspx DllCall(NumGet(NumGet(IFileSaveDialog+0)+4*A_PtrSize), "UPtr", IFileSaveDialog, "UInt", Filter.Count(), "UPtr", ObjGetAddress(Obj,"COMDLG_FILTERSPEC")) ; IFileDialog::SetFileTypeIndex method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775978(v=vs.85).aspx DllCall(NumGet(NumGet(IFileSaveDialog+0)+5*A_PtrSize), "UPtr", IFileSaveDialog, "UInt", FileTypeIndex) if ( IsObject(CustomPlaces := IsObject(CustomPlaces) || CustomPlaces == "" ? CustomPlaces : [CustomPlaces]) ) { local Directory := "" for foo, Directory in CustomPlaces ; foo = index { foo := IsObject(Directory) ? Directory[2] : 0 ; FDAP enumeration (https://msdn.microsoft.com/en-us/library/windows/desktop/bb762502(v=vs.85).aspx) if ( DirExist(Directory := IsObject(Directory) ? Directory[1] : Directory) ) { DllCall("Shell32.dll\SHParseDisplayName", "UPtr", &Directory, "Ptr", 0, "UPtrP", PIDL, "UInt", 0, "UInt", 0) DllCall("Shell32.dll\SHCreateShellItem", "Ptr", 0, "Ptr", 0, "UPtr", PIDL, "UPtrP", IShellItem) ObjRawSet(Obj, IShellItem, PIDL) ; IFileDialog::AddPlace method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775946(v=vs.85).aspx DllCall(NumGet(NumGet(IFileSaveDialog+0)+21*A_PtrSize), "UPtr", IFileSaveDialog, "UPtr", IShellItem, "UInt", foo) } } } ; IFileDialog::SetTitle method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761834(v=vs.85).aspx DllCall(NumGet(NumGet(IFileSaveDialog+0)+17*A_PtrSize), "UPtr", IFileSaveDialog, "UPtr", Title == "" ? 0 : &Title) ; IFileDialog::SetOptions method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761832(v=vs.85).aspx DllCall(NumGet(NumGet(IFileSaveDialog+0)+9*A_PtrSize), "UPtr", IFileSaveDialog, "UInt", Flags) ; IModalWindow::Show method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761688(v=vs.85).aspx local Result := FALSE if ( !DllCall(NumGet(NumGet(IFileSaveDialog+0)+3*A_PtrSize), "UPtr", IFileSaveDialog, "Ptr", Owner, "UInt") ) { ; IFileDialog::GetResult method ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb775964(v=vs.85).aspx if ( !DllCall(NumGet(NumGet(IFileSaveDialog+0)+20*A_PtrSize), "UPtr", IFileSaveDialog, "UPtrP", IShellItem) ) { VarSetCapacity(Result, 32767 * 2, 0) DllCall("Shell32.dll\SHGetIDListFromObject", "UPtr", IShellItem, "UPtrP", PIDL) DllCall("Shell32.dll\SHGetPathFromIDListEx", "UPtr", PIDL, "Str", Result, "UInt", 2000, "UInt", 0) ObjRawSet(Obj, IShellItem, PIDL) } } for foo, bar in Obj ; foo = IShellItem interface (ptr) | bar = PIDL structure (ptr) if foo is integer ; IShellItem? ObjRelease(foo), DllCall("Ole32.dll\CoTaskMemFree", "UPtr", bar) ObjRelease(IFileSaveDialog) return Result } ; https://github.com/flipeador/Library-AutoHotkey/blob/master/dlg/SaveFile.ahk
... View more