Что нового

действия с текстом и нажатия комбинаций клавиш в активном окне

Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Ответьте на мои вопросы прошлого поста
попробую ответить как могу, хотя уже просто откровенно опасаюсь что-либо подробно писать
нервы у всех разные и я ещё не вполне отошёл от предыдущей реакции на свои пояснения (на мой взгляд, необоснованно резкой реакции)
и даже уже не знаю, какими ещё словами донести, что у меня нет цели никого здесь пораздражать/подоставать или намеренно самому тупить

задача объяснена очень детально ещё в первом сообщении, на создание которого были потрачены десятки минут
и каждая фраза там продумана и выверена, чтобы свести к минимуму возможное частичное непонимание каких-то нюансов со стороны тех, кто возьмутся помочь
теперь к вопросам:

Да? А как же это:
свою фразу: "следующего содержания" не будет никогда
я не просто так бросил, а сразу пояснил, что имеется в виду
в виду имелось, что в буквальном смысле именно этих символов и именно этих строк не будет никогда, это для наглядности был пример/шаблон
и вот эти мои 2 примера остаются актуальными:
вот это имеется прямо перед запуском скрипта
вот это должно получиться сразу после завершения работы скрипта

далее наступает очередь пункта 4), а что там должно быть выполнено?
должено быть выполнено то, что прописано в первом сообщении темы:
то есть, либо давно готовый скрипт, либо его замена, выполняющая тоже самое; именно замена и была сделана, о чём говорит вот эта фраза:
Решение пункта 4) тоже здесь присутствует, но только в другом исполнении
ну а в целом, готовый скрипт (либо его замена) должны выполнять перенос строк особым образом (это мы помним, поскольку данная задача была решена ранее в другой теме)

А вот что по вашему мнению он (этот кусок кода) должен делать?
если речь о скрипте из старой темы, то прямо выше я на это уже ответил (то есть, он должен делать перенос строк особым образом)

если я вас правильно понимаю, это и есть тот текст с которым нужно работать, не трогая в файле все остальное?
нет. текст, с которым нужно работать - это всё содержимое нужного окна блокнота
то есть, сначала для скрипта всё текстовое содержимое выглядит так (курсор в самом начале):
Код:
Title 01
Title 02
Title 03
подчёркиваю, это только пример:
цифры (которые станут видны чуть ниже в этом сообщении) всегда будут частично другими, а вместо строк Title 01, Title 02, Title 03 всегда будут разные слова или словосочетания

затем скрипт выполняет вставку (и для этого нужен ctrl+v) моего подготовленного в другой программе короткого текстового фрагмента (он всегда разный)
и тогда содержимое нужного окна блокнота становится таким:
Код:
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

затем требуется выполнение пунктов 2 и 3 из первого сообщения этой темы
после их выполнения выглядит текст так:
Код:
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

затем требуется выполнение пункта 4 из первого сообщения этой темы (мне не важно как именно, лишь бы работало не хуже, чем работал проверенный скрипт из старой темы)
после выполнения пункта 4 выглядит текст так:
Код:
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

затем требуется выполнение пунктов 5 и 6 из первого сообщения этой темы: сохранение и закрытие окна

если вдруг моё пожелание/просьба будет всё-таки в итоге учтена:
вычисляем, какой файл открыт в последнем окне блокнота в панели задач, закрываем это окно и далее работаем с файлом
то пункт 6 не понадобится, а мне при таком варианте будет чуть лучше/удобнее
 
A

Alofa

Гость
Ох много чего хотелось сказать, но думаю не стоит.
В место этого, чтобы вы и те, кто будет читать этот пост понимали как я, человек который привык видеть воплощение задачи в коде, воспринимаю подобные темы.
А воспринимаю я это буквально. Для меня нужно знать все детально, пошагово: каждый шаг может привести к тому или иному результату – что делать и как реагировать на него и какой будет следующий шаг. А вот отрывки примеров тех или иных файлов я воспринимаю как шаблон, некую структуру, которая берется за основу.
И так, с учетом всего вышесказанного взгляните снова на Ответ #15, каков там результат (шаблон) - я именно все так и описал, как вы в вашем предыдущем посте.
И тут вы заявляете:
Alexey сказал(а):
... "следующего содержания" не будет никогда...
Я это понимаю так: "такого шаблона не будет никогда".
И что мне при этом думать?
Или вот еще:
Alexey сказал(а):
... я на это уже ответил (то есть, он должен делать перенос строк особым образом)...
А о чем существенном эта фраза мне может поведать? Да ни о чем. Мне пришлось перечитывать старую вашу тему, чтобы вспомнить этот "особый образ переноса".
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
нелепость ситуации в том, что я тоже воспринимаю буквально. и под фразой
... "следующего содержания" не будет никогда...
я имел в виду: именно такого содержания (именно с такими символами/буквами/цифрами) не будет никогда
то есть, я давал понять, что это только пример/ориентир (по виду и сути очень близкий к тому, что будет отображаться каждый раз в реальных условиях использования скрипта)

А о чем существенном эта фраза мне может поведать?
про перечитывание понимаю, так как это нужно мне в первую очередь, поэтому только я держу постоянно в голове принцип этого "особого образа переноса"
но действительно ли этот момент является настолько существенным? ведь изначально в первом сообщении сказано:
однократный запуск вот этого стороннего готового скрипта
не было ли возможности в этот новый скрипт просто разместить/скопировать/интегрировать без изменений (или почти без изменений) весь тот старый скрипт?


если какие-то мои пояснения сбили с толку, то прошу за это прощения; это было не намеренно
я наоборот пытался формулировать как можно детальнее, чтобы были понятны все нюансы

в любом случае на данный момент скрипт использовать никак не получается. в чём может быть причина того, что:
- вставка из буфера обмена произошла в соседнее окно блокнота?
- а при варианте без вставки скрипт вообще ничего не делает

я попробовал ещё несколько раз этот же скрипт и выяснил вот что:
- вставка из буфера обмена по-прежнему происходит в соседнее (предыдущее в панели задач) окно блокнота
- но если специально вручную заранее сделать так, чтобы этого соседнего окна блокнота не было (а была какая-то другая программа, не блокнот), то вставка из буфера обмена происходит в нужное окно блокнота; но при этом всё равно дальше вставки ничего не происходит
 
A

Alofa

Гость
Попробуйте этот вариант:
Код:
#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)
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Попробуйте этот вариант
несколько раз попробовал - ничего не происходит

вдогонку добавлю наблюдение про предыдущий вариант скрипта:
если строку 5
Код:
$hWnd = WinWaitActive('[REGEXPCLASS:(?i)Notepad2]', '', 5)

изменить на
Код:
$hWnd = WinWaitActive('[ACTIVE]', '', 5)
то вставка из буфера обмена происходит в нужное окно блокнота
 
A

Alofa

Гость
Прошу прощения за невнимательность.
С учетом этого
Alexey сказал(а):
... окно блокнота принадлежит файлу notepad.exe...
изменил скрипт.


Добавлено:
Сообщение автоматически объединено:

Первый скрипт тоже подправил.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
я пробовал несколько раз оба подправленных варианта, ничего в них не меняя:
вариант 1: ничего не происходит
вариант 2: происходит вставка из буфера обмена, затем ничего не происходит

я запускал вариант 1, убрав первые 2 символа в строке 10:
вставка из буфера обмена происходит не в то окно блокнота, которое нужно, а в предыдущее на панели задач (затем ничего не происходит)

также я попробовал вариант 1, убрав первые 2 символа в строке 10, а также заменив эти символы в строке 5:
Код:
[REGEXPCLASS:(?i).*Pad.*]

на символы:
Код:
[REGEXPCLASS:(?i).*?Pad.*?]
которые взяты из старой темы (ведь у того готового скрипта нет проблем ни с определением нужного окна блокнота, ни с обработкой текста в самом окне)
в итоге тоже самое:
вставка из буфера обмена происходит не в то окно блокнота, которое нужно, а в предыдущее на панели задач (затем ничего не происходит)
 
A

Alofa

Гость
Alexey давайте поэкспериментируем (заодно вы увидите как я понял вашу задачу):
- Скомпилируйте второй вариант скрипта
- Перейдите с ним на другой ПК (для чистоты эксперимента)
- Откройте там несколько файлов .cue (окон "notepad2"), исполняемый файл должен быть "notepad.exe"
- В последнее окно (файл) вставьте и сохраните
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
- деактивируйте последнее (нужное нам) окно блокнота
- запустите скомпилированный скрипт от имени администратора
- наблюдайте что будет, отпишитесь.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
внимательно сделал всё кроме чистоты эксперимента (нет возможности перейти на другой ПК)
наблюдайте что будет
нужное окна блокнота активировалось, туда вставилось содержимое буфера обмена, и получилось это:
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
больше ничего не происходило

есть ли техническая возможность попробовать пойти по-другому?
а именно полностью взять за основу скрипт из старой темы; никак (почти никак) его не сокращать и не оптимизировать (раз уж он гарантированно рабочий)
и пока добавить туда только часть пунктов из этой темы
пункт 3 в любом случае необходим, а с ним можно заодно и пункт 2, а можно и без пункта 2 пока (то есть начать только с добавления пункта 3)
тогда остальные пункты будут временно делаться мной вручную. вроде бы не самая плохая идея, я бы хотел её попробовать в деле
 
A

Alofa

Гость
Скиньте ссылку на "notepad2" которым пользуетесь.
 
A

Alofa

Гость
Вариант №3:
Код:
#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)
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
если в скрипте ничего не менять, то единственное, что происходит - это появление мелкого окна:
в заголовке у него script.ехе; в центре у него красный круг с белым крестом внутри, возле которых просто 1 символ: 1 (ниже кнопка ОК)

если в строке 4 поменять Notepad2.exe на Notepad.exe, то всё тоже самое, только вместо символа "1" символ "5"
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
при попытке скомпилировать в ехе-файл:

Aut2Exe Error
Line 23
If @error Then Exit MsgBox(262144+16, Default, 'Ошибка №5' & @CRLF & '$aText[1]:' @CRLF & '[' & $aText[1] & ']')
If @error Then Exit MsgBox(262144+16, Default, 'Ошибка №5' & @CRLF & '$aText[1]:' ^ ERROR
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
после запуска скрипта в течение буквально секунды происходит несколько событий, которые нормально успеть рассмотреть нельзя
но кое-что удалось примерно понять:
- происходит вставка примерно 20 каких-то нечитаемых символов в то место, куда должно перемещаться Title 01
форум постоянно пишет Ожидание предварительного просмотра... при попытке вставить в ответ те символы (они доступны в буфере обмена и почти все выглядят просто как квадраты)

- затем блокнот выдаёт запрос "save changes to file?", на который успеть среагировать невозможно
- после чего блокнот закрывается
- если затем этот текстовый файл открыть, то он оказывается пустым (размер 2 байта, первая строка пустая, конец файла в строке 2)
 
A

Alofa

Гость
Alexey сказал(а):
... происходит вставка примерно 20 каких-то нечитаемых символов...
Ну вот теперь еще проблема с кодировкой нарисовалась.

Alexey вспомните "эксперимент" - это был вообще правильный алгоритм действий?

Если да, то вот вам Вариант №4:
Код:
#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
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
текстовый файл был скриптом отредактирован, сохранён и закрыт. получилось вот это:
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
хоть итог и некорректен, но это вроде как первый реально позитивный результат

это был вообще правильный алгоритм действий?
на данный момент это вроде бы не особо важно, но раз уж вопрос задан, отвечаю:

- пункт "вставьте и сохраните" не вполне верный, так как мне нужно каждый раз скрипту для обработки давать несохранённый текстовый файл
- пункт "деактивируйте последнее (нужное нам) окно блокнота" не вполне верный, так как в реальных условиях использования готового скрипта окно не будет специально деактивироваться
 
Верх