A
Alofa
Гость
Ответьте на мои вопросы прошлого поста.Alexey сказал(а):... что конкретно мне ещё нужно написать...
Ответьте на мои вопросы прошлого поста.Alexey сказал(а):... что конкретно мне ещё нужно написать...
попробую ответить как могу, хотя уже просто откровенно опасаюсь что-либо подробно писатьОтветьте на мои вопросы прошлого поста
свою фразу: "следующего содержания" не будет никогдаДа? А как же это:
должено быть выполнено то, что прописано в первом сообщении темы:далее наступает очередь пункта 4), а что там должно быть выполнено?
если речь о скрипте из старой темы, то прямо выше я на это уже ответил (то есть, он должен делать перенос строк особым образом)А вот что по вашему мнению он (этот кусок кода) должен делать?
нет. текст, с которым нужно работать - это всё содержимое нужного окна блокнотаесли я вас правильно понимаю, это и есть тот текст с которым нужно работать, не трогая в файле все остальное?
Title 01
Title 02
Title 03
FILE "CDImage.wav" WAVE
TRACK 01 AUDIO
INDEX 01 00:00:00
TRACK 02 AUDIO
INDEX 01 03:54:00
TRACK 03 AUDIO
INDEX 01 07:30:02
Title 01
Title 02
Title 03
FILE "1.flac" WAVE
TRACK 01 AUDIO
TITLE ""
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE ""
INDEX 01 03:54:00
TRACK 03 AUDIO
TITLE ""
INDEX 01 07:30:02
Title 01
Title 02
Title 03
FILE "1.flac" WAVE
TRACK 01 AUDIO
TITLE "Title 01"
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE "Title 02"
INDEX 01 03:54:00
TRACK 03 AUDIO
TITLE "Title 03"
INDEX 01 07:30:02
Я это понимаю так: "такого шаблона не будет никогда".Alexey сказал(а):... "следующего содержания" не будет никогда...
А о чем существенном эта фраза мне может поведать? Да ни о чем. Мне пришлось перечитывать старую вашу тему, чтобы вспомнить этот "особый образ переноса".Alexey сказал(а):... я на это уже ответил (то есть, он должен делать перенос строк особым образом)...
я имел в виду: именно такого содержания (именно с такими символами/буквами/цифрами) не будет никогда... "следующего содержания" не будет никогда...
про перечитывание понимаю, так как это нужно мне в первую очередь, поэтому только я держу постоянно в голове принцип этого "особого образа переноса"А о чем существенном эта фраза мне может поведать?
не было ли возможности в этот новый скрипт просто разместить/скопировать/интегрировать без изменений (или почти без изменений) весь тот старый скрипт?однократный запуск вот этого стороннего готового скрипта
#include <WinAPIProc.au3>
#include <GuiToolBar.au3>
Local $hWnd, $hControl, $hToolbar, $aText, $sText, $aTitles, $sClip
Local $sFlacFile = '1.flac', $aProcessList = ProcessList('notepad.exe')
Local $iPID = $aProcessList[$aProcessList[0][0]][1]
If Not $iPID Then Exit 1
Local $aWnd = _WinAPI_EnumProcessWindows($iPID) ; Вычисляем окно последнего запущенного процесса
If @error Then Exit 2
$hWnd = WinActivate($aWnd[$aWnd[0][0]][0])
$hControl = ControlGetHandle($hWnd, '', 'Scintilla1')
$hToolbar = ControlGetHandle($hWnd, '', 'ToolbarWindow321')
If (Not $hWnd) Or (Not $hControl) Or (Not $hToolbar) Then Exit 11
ControlSend($hWnd, '', $hControl, '+{INS}') ; 1) нажатие ctrl + v
$sText = ControlGetText($hWnd, '', $hControl)
If Not StringStripWS($sText, 8) Then Exit 22
$sText = StringRegExpReplace($sText, '(?is)(FILE\h*")[^"]+("\h*WAVE.+INDEX(?-s).+\R)\s*((?s).+)', '${1}' & $sFlacFile & '$2<@>$3') ; 2) попутно замена текста CDImage.wav на 1.flac
$aText = StringSplit($sText, '<@>', 1)
If $aText[0] <> 2 Then Exit 33
$aTitles = StringSplit($aText[2], @CRLF, 1)
If @error Then Exit 44
For $i = 1 To $aTitles[0] ; Пункт 3) и 4)
$aText[1] = StringRegExpReplace($aText[1], '(?i)(AUDIO)(\s+INDEX)', '$1' & @CRLF & ' TITLE "' & $aTitles[$i] & '"$2', 1)
Next
; MsgBox(0, 'ПРОВЕРКА', $aText[1]) ; Можно удалить эту строку
ControlSetText($hWnd, '', $hControl, '')
$sClip = ClipGet()
ClipPut($aText[1])
WinActivate($hWnd)
ControlSend($hWnd, '', $hControl, '+{INS}') ; Вставить преобразованный текст
_GUICtrlToolbar_ClickIndex($hToolbar, 3) ; Coхранить
WinKill($hWnd) ; Закрыть окно
ClipPut($sClip)
несколько раз попробовал - ничего не происходитПопробуйте этот вариант
$hWnd = WinWaitActive('[REGEXPCLASS:(?i)Notepad2]', '', 5)
$hWnd = WinWaitActive('[ACTIVE]', '', 5)
изменил скрипт.Alexey сказал(а):... окно блокнота принадлежит файлу notepad.exe...
[REGEXPCLASS:(?i).*Pad.*]
[REGEXPCLASS:(?i).*?Pad.*?]
- Возьмите в буфер обменаTitle 01
Заголовок 02
Еще текст 03
- деактивируйте последнее (нужное нам) окно блокнотаFILE "CDImage.wav" WAVE
TRACK 01 AUDIO
INDEX 01 00:00:00
TRACK 02 AUDIO
INDEX 02 33:333:33
TRACK 03 AUDIO
INDEX 03 44:44:44
нужное окна блокнота активировалось, туда вставилось содержимое буфера обмена, и получилось это:наблюдайте что будет
больше ничего не происходилоFILE "CDImage.wav" WAVE
TRACK 01 AUDIO
INDEX 01 00:00:00
TRACK 02 AUDIO
INDEX 02 33:333:33
TRACK 03 AUDIO
INDEX 03 44:44:44Title 01
Заголовок 02
Еще текст 03
#include <WinAPIProc.au3>
#include <GuiToolBar.au3>
Local $hWnd, $hControl, $hToolbar, $aText[2], $aTitles, $sClip
Local $sFlacFile = '1.flac', $aProcessList = ProcessList('Notepad.exe')
Local $iPID = $aProcessList[$aProcessList[0][0]][1]
If Not $iPID Then Exit MsgBox(262144+16, Default, 1)
Local $aWnd = _WinAPI_EnumProcessWindows($iPID) ; Вычисляем окно последнего запущенного процесса
If @error Then Exit MsgBox(262144+16, Default, 2)
$hWnd = WinActivate($aWnd[$aWnd[0][0]][0])
$hControl = ControlGetHandle($hWnd, '', 'Scintilla1')
$hToolbar = ControlGetHandle($hWnd, '', 'ToolbarWindow321')
If (Not $hWnd) Or (Not $hControl) Or (Not $hToolbar) Then Exit MsgBox(262144+16, Default, 3)
$aText[0] = StringStripWS(ClipGet(), 3) ; Пункт 1) - Берем текст из буфера на прямую, без вставки в поле блокнота
$aText[1] = StringStripWS(ControlGetText($hWnd, '', $hControl), 3)
If (Not $aText[0]) Or (Not $aText[1]) Then Exit MsgBox(262144+16, Default, 4)
$aText[0] = StringRegExpReplace($aText[0], '(?i)(FILE\h*")[^"]+("\h*WAVE)', '${1}' & $sFlacFile & '$2') ; Пункт 2) замена текста CDImage.wav на 1.flac
$aTitles = StringRegExp($aText[1], '[\R\s]*(.+)', 3)
If @error Then Exit MsgBox(262144+16, Default, 'Ошибка №5' & @CRLF & '$aText[1]:' & @CRLF & '[' & $aText[1] & ']')
For $i = 0 To UBound($aTitles) -1 ; Пункт 3) и 4)
$aText[0] = StringRegExpReplace($aText[0], '(?i)(AUDIO)(\s+INDEX)', '$1' & @CRLF & ' TITLE "' & $aTitles[$i] & '"$2', 1)
Next
ControlSetText($hWnd, '', $hControl, '')
$sClip = ClipGet()
ClipPut($aText[0])
WinActivate($hWnd)
ControlSend($hWnd, '', $hControl, '+{INS}') ; Вставить преобразованный текст
_GUICtrlToolbar_ClickIndex($hToolbar, 3) ; Coхранить
WinKill($hWnd) ; Закрыть окно
ClipPut($sClip)
Это для кого какAlexey сказал(а):... тоже самое...
Если вылезет такая ошибка, покажите ее нам.Alexey сказал(а):... только вместо символа "1" символ "5"
Ну вот теперь еще проблема с кодировкой нарисовалась.Alexey сказал(а):... происходит вставка примерно 20 каких-то нечитаемых символов...
#include <WinAPIProc.au3>
#include <WinAPISys.au3>
Local $hWnd, $ahWnd, $hControl, $hToolbar, $aText[2], $aTitles, $sClip
Local $sFlacFile = '1.flac', $aProcessList = ProcessList('Notepad.exe')
Local $iPID = $aProcessList[$aProcessList[0][0]][1]
If Not $iPID Then Exit MsgBox(262144 + 16, Default, 1)
$ahWnd = _WinAPI_EnumProcessWindows($iPID) ; Вычисляем окно последнего запущенного процесса
If @error Then Exit MsgBox(262144 + 16, Default, 2)
$hWnd = WinActivate($ahWnd[$ahWnd[0][0]][0])
If (Not $hWnd) Then Exit MsgBox(262144 + 16, Default, 3)
_FixAccelHotKeyLayout()
$sClip = ClipGet()
$aText[0] = StringStripWS($sClip, 3) ; Пункт 1) - Берем текст из буфера на прямую, без вставки в поле блокнота
_WunSend('!c', $hWnd)
$aText[1] = ClipGet()
If (Not $aText[0]) Or (Not $aText[1]) Then Exit MsgBox(262144 + 16, Default, 4)
$aText[0] = StringRegExpReplace($aText[0], '(?i)(FILE\h*")[^"]+("\h*WAVE)', '${1}' & $sFlacFile & '$2') ; Пункт 2) замена текста CDImage.wav на 1.flac
$aTitles = StringRegExp($aText[1], '[\R\s]*(.+)', 3)
If @error Then Exit MsgBox(262144 + 16, Default, 'Ошибка №5' & @CRLF & '$aText[1]:' & @CRLF & '[' & $aText[1] & ']')
For $i = 0 To UBound($aTitles) - 1 ; Пункт 3) и 4)
$aText[0] = StringRegExpReplace($aText[0], '(?i)(AUDIO)(\s+INDEX)', '$1' & @CRLF & ' TITLE "' & $aTitles[$i] & '"$2', 1)
Next
ClipPut($aText[0])
_WunSend('{CTRLDOWN}avs{CTRLUP}', $hWnd)
WinKill($hWnd) ; Закрыть окно
ClipPut($sClip)
Func _FixAccelHotKeyLayout()
Static $iKbrdLayout, $aKbrdLayouts
If Execute('@exitMethod') <> '' Then
Local $iUnLoad = 1
For $i = 1 To $aKbrdLayouts[0]
If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
$iUnLoad = 0
ExitLoop
EndIf
Next
If $iUnLoad Then
_WinAPI_UnloadKeyboardLayout($iKbrdLayout)
EndIf
Return
EndIf
$iKbrdLayout = 0x0409
$aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
_WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)
OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc ;==>_FixAccelHotKeyLayout
Func _WunSend($sLetter, $hWnd)
SendKeepActive($hWnd)
Send($sLetter)
SendKeepActive('')
EndFunc ;==>_Send
хоть итог и некорректен, но это вроде как первый реально позитивный результатFILE "1.flac" WAVE
TRACK 01 AUDIO
TITLE "FILE "CDImage.wav" WAVE"
INDEX 01 00:00:00
TRACK 02 AUDIO
TITLE "TRACK 01 AUDIO"
INDEX 01 03:54:00
TRACK 03 AUDIO
TITLE "INDEX 01 00:00:00"
INDEX 01 07:30:02
на данный момент это вроде бы не особо важно, но раз уж вопрос задан, отвечаю:это был вообще правильный алгоритм действий?