Есть задача: Вытащить текст и редактировать TXT файл след. образом - Вырезать первую строку с текстом, записать ее в значение пилота. И чтобы это срабатывало каждый раз, каждое вырезание текста было с новой строки. Не побрезгую подключением плагинов.
Содержание файла:
Текст1
Текст2
Текст3
Текст4
Текст5
Текст2
Текст3
Текст4
Текст5
Текст3
Текст4
Текст5
load_array %arr "D:\UOPilot\file.txt" // загрузить массив
// %arr [1] - первая строка из файла
// %arr [2] - вторая строка
// и т. д.
log clear
log mode compact
// вывести в лог все строки из файла
for #i 1 size(%arr)
log %arr [#i]
end_for
end_script
Получается содержимое документа выгружается в программу? Работать на прямую с текстовым документом и редактировать его не получится?
Просто есть база номеров 100к строк, с ней и работать. И важно чтобы если что-то собьется все можно было продолжить с момента прерывания. Иначе придется резать фаил по 1к строк)
я сохраняю работу с номером последней строкой в файл, потом запускаю с этой строки. Хотя может кто что-то лучшее подскажет, так идет постоянная перезапись файла, после каждой строки.
Номер строки, с которой работали, можно записывать в буфер. Если скрипт в какой-то момент остановить, то потом можно получить номер строки из буфера и загрузить массив с указанной строки.
set #count 1 // с какой строки загружать массив
get clipboard %tmp // получить содержимое буфера
if is_real(%tmp[1]) = 1 // если в буфере число
set #count %tmp[1] // то присвоить его переменной #count
end_if
hint Номер строки: #count
load_array %arr 1,1,#count,1,0,0 "C:\Users\abc\Desktop\123.txt" // загрузить массив с указанной строки
// для примера, выводим в лог по 2 строки из файла при каждом запуске скрипта
for #i 1 2
set #count #count + 1
set clipboard #count // записали в буфер номер строки, с которой работали
log %arr [#i] // вывести в лог строку
end_for
end_script
А если комп вырубило, буфер будет пустой ведь? Тогда как быть?
Никак. Пропадает электричество, соответственно все завершается аварийно. Без сохранения. Можно записывать каждые 50-100 единиц обработанных данных. Но точное число получить нельзя в принципе.
схема по сути будет той же самой. Если там нет чего-то сверх экстримального (база на пару гигов), то проще загрузить файл и работать уже с загруженным массивом. Если база огромна, то схема будет та же самая, просто загружать придется частями.
Ребята, почему если брать текст с блокнота через массив,
load_array %arr "D:\Работа\uopilot\insta\tovar.txt"
load_array %arr "D:\Работа\uopilot\insta\tovar.txt"
kleft 155, 145 abs
for #i 1 size(%arr)
send %arr [#i]
sendex {Enter}
end_for
end_script
Вот код, который я использую, для вывода сообщений на экран.
load_array %arr "D:\Работа\uopilot\insta\tovar.txt"
kleft 155, 145 abs
for #i 1 size(%arr)
send %arr [#i]
sendex {Enter}
end_for
end_script
say "Русский текст"
say "English text"
end_script
say "Русский текст"
say "English text"
end_script
Ребята, в чем может быть проблема? На основном компьютере написал бота с командой say , все отлично на нем работало - перенес на другой комп через тимвиевер, запустил, команда say перестала вводить слова, я изменил ее на sendex - слова вводиться, поставил обратно say - вроде заработало, потом подправил скрипт - say снова перестала работать....В чем может быть проблема?
И второй вопрос, я сохранил все слова в блокнот в формате ANSI, но потом в блокнот начал вносить символы из другого языка (индийского) с буквам: ç ü и т.д. При сохранении их в блокноте - они меняют эти иероглифы на стандартные буквы. Как это обойти? Что бы я мог вводить из блокнота и рус и англ и индийские слова?
Заранее, очень благодарен за ответ!
Для say нужна привязка к окну.
ANSI поддерживает только латиницу и кириллицу. Остальные языки только unicode. Пилот не работает с unicode.
Возможно на lua можно как-то сделать, не знаю.
Вот так попробуй:
do
local back = package.path
package.path = "luaPlugins\\winapi\\?.lua;"..package.path
setfenv(1, require'winapi')
local window = require[[winapi.window]]
package.path = back
end
SendMessagePtr(hwnd, WM, wParam, lParam)
Что-то ты прям обгадил мелкомягких. Нехорошо. И зря.
Не с того края ты начал. Начинать надо с того, что за оконная система и как она работает.
Так как у нас оконная система, то управляется она посылкой сообщений. Сообщения делятся на системные и юзерские. Т.к. число только системных сообщений велико уже само по себе, то для охвата всех вообще был придуман SendMessage() с двумя параметрами опционными. Отсюда вытекает, что вот этой функции вообще пофиг что слать и смотреть то надо на само сообщение, как например на https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-char, где в красках все проиллюстрировано.
В юзерских мессаджах это дает маршалинг любых данных между окошками.
тогда уж https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-unichar
Так русские хелпы машиным переводом сделаны ? По крайней мере около года назад было уведомление. И если на английском понятно, то не понимаю изначально суть претензии к мс по поводу что куда.
SendMessagePtr(workwindow(), 0x0102, 0x41, 1) -- англ. буква 'А'
SendMessagePtr(workwindow(), 0x0102, 0x410, 1) -- русская буква 'А' (смотрим таблицу кодов символов юникод)
function SendMessagePtr(hwnd, WM, wParam, lParam)
if wParam == nil then wParam = 0 end
if type(lParam) == 'nil' then lParam = 0 end
return C.SendMessageW(hwnd, flags(WM),
ffi.cast('WPARAM', wParam),
ffi.cast('LPARAM', lParam))
end
https://docs.telerik.com/teststudioapi/html/T_ArtOfTest_Common_Win32_HWND.htm
Properties
Name Description
Public property Children
Public property ClassName
Public property Descendants
Public property HINSTANCE
This is useful because some frameworks store their DLL instance handle here, allowing you to loosely identify the framework that is managing the window.
Public property Id
Public property IsEnabled
Public property IsNull
Public property IsWindow
Public property Owner
Public property Parent
Public property ProcessId
Public property Root
Public property RootOwner
Public property Text
Public property ThreadId
Public property WindowRect
Gets or sets the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the screen origin.
Напрямую можно вот так дергать функцию:
C.SendMessageW
WM_CHAR отправляет в окна символы от 0 до 254, то есть у кодов выше 255 будет обрезаться верхняя часть.
можно обойти разбив код символа на 2 части по 2 байта и отправлять 2 раза WM_CHAR на один Unicod символ
Осталось понять каким образом дернуть hwnd в пределах Lua. EnumWindows и FindWindow вроде как отсутсвуют. GetFocus();GetActiveWindow(); возвращают null.
Ребята, используя скрипт:
load_array %arr "D:\Работа\uopilot\insta\tovar.txt"
kleft 155, 145 abs
for #i 1 size(%arr)
send %arr [#i]
sendex {Enter}
end_for
end_script
load_array %arr "D:\Работа\uopilot\insta\tovar.txt" // загрузить массив
//log %arr[1] // первая строка из файла
write ("D:\Работа\uopilot\insta\tovar2.txt" %arr [1]\r\n) // записываем в файл tovar2.txt
delete_array %arr -1 // удалить первую строку из массива
save_array %arr "C:\Users\yacir\Desktop\tovar.txt" // записать массив в файл
end_script
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)