Отключить сообщения LO

Автор Kadet, 3 октября 2020, 18:30

0 Пользователи и 1 гость просматривают эту тему.

Kadet

Народ, может кто подскажет, как можно отключить внутренние сообщения LO.
Что-то вроде "Помогите сделать LibreOffice лучше".
Желательно программно, макросом.

Эти вредоносы выскакивают периодически и вгоняют в краш мою базу. А отключить их я могу только войдя в Basic, в макросы. Простым пользователям трудно запомнить как их отключать, да и лезть в макросы им не зачем.
Буду очень признателен за подсказку.

Kadet

#1
Значит никто не подскажет. Теоретически всё это отключается в "Параметры" -> "LibreOffice/Общие", выключая все галочки. Но, всё равно, почему-то через какой-то время они снова всплывают. Толи сбой, какой-то происходит и настройки слетают, толи я не пойму что.

Копая в этом направлении, кажется, накопал тропинку по другому своему вопросы, который задавал ранее и не нашёл ответа.
В общем, нужно в LO, на уровне всего офиса, запретить запрашивать восстановление после сбоя. Насколько я понимаю, где это регулируется я нашёл. Вот пример макроса.
'*** Первичные настройки офиса *******************************************
Sub setOffice()
Dim oGlobalSetting
Dim aProps(2) As New com.sun.star.beans.PropertyValue
Dim oGlobalEventBroadcaster

oGlobalSetting = GetDefaultContext().getByName("/singletons/com.sun.star.frame.theAutoRecovery")
oGlobalSetting.Crashed=false
oGlobalSetting.ExistsRecoveryData=false
oGlobalSetting.ExistsSessionData=false

aProps(0).Name  = "Crashed"
aProps(0).Value = false
aProps(1).Name  = "ExistsRecoveryData"
aProps(1).Value = false
aProps(2).Name  = "ExistsSessionData"
aProps(2).Value = false
oGlobalSetting.setPropertyValue(aProps())

oGlobalSetting.setPropertyValue("Crashed", false)
oGlobalSetting.setPropertyValue("ExistsRecoveryData", false)
oGlobalSetting.setPropertyValue("ExistsSessionData", false)
End Sub

Это лишь "черновик" макроса. И он не работает. Дело в том, что методы "Crashed", "ExistsRecoveryData" и "ExistsSessionData" открыты только для чтения, а ведь именно их нужно установить в false. Этот макрос, при всех моих вариантах и пробах даёт ошибку.

Подскажите пожалуйста, как их таки можно выставить в false?

sokol92

Поищите в экспертных настройках по тексту "Recovery".
Владимир.

Kadet

#3
Цитата: sokol92 от  9 октября 2020, 12:28
Поищите в экспертных настройках по тексту "Recovery".
Спасибо за наводку, но думаю это немного не то. В этих настройках вроде бы устанавливаются стационарные установки, а мне нужно постоянно менять их динамически.
Поясню. Когда я открываю свою базу, то макросом перевожу в фон главную форму базы ("мозги", так сказать прячу), а народ пользует уже вторичные, созданные мною формы. И, соответственно, закрытие всей базы я настроил по закрытии "Основной" рабочей формы. Но, так как закрытие происходит из вторичной формы, и во время общего закрытия ещё не закончена работа макроса, который осуществляет это закрытие. И вот такое закрытие LO воспринимает как сбой и при следующей загрузке начинает сыпать ненужными вопросами "восстановить" и т.п.
Т.е. система сама меняет эти параметры динамически.
К тому же - хочется сделать это посредством макросов, чтобы человек на другом конце провода в другой части планеты просто запустил мою программу и у него бы всё это автоматически выставилось.
Так же я планирую отключать "Skia" и прочие предварительные настройки самого офиса.

Kadet

Итак. Снова нет ответов на те вопросы, которые меня мучают.
Сейчас докопался каким образом на свойства и методы объектов ставятся запреты на изменения.
Это делается с помощью специальных listener-ов - ChangeListenerEvent.
Напомню макрос, которым я кручу-верчу, запутать хочу.
Sub setOffices()
Dim oGlobalSetting

oGlobalSetting = GetDefaultContext().getByName("/singletons/com.sun.star.frame.theAutoRecovery")

oGlobalSetting.Crashed=false
oGlobalSetting.ExistsRecoveryData=false
oGlobalSetting.ExistsSessionData=false
' или так
oGlobalSetting.setPropertyValue("Crashed", false)
oGlobalSetting.setPropertyValue("ExistsRecoveryData", false)
oGlobalSetting.setPropertyValue("ExistsSessionData", false)

End Sub

В таком виде, при попытке любых изменений любого параметра выдаёт сообщение о том, что "Параметр только для чтения".
При этом, объект oGlobalSetting имеет некоторые, интересные методы.
' SbxVOID removeStatusListener ( SbxOBJECT, SbxOBJECT )
' SbxVOID removeEventListener ( SbxOBJECT )
' SbxVOID removePropertyChangeListener ( SbxSTRING, SbxOBJECT )
' SbxVOID removeVetoableChangeListener ( SbxSTRING, SbxOBJECT )
' SbxVOID removePropertiesChangeListener ( SbxOBJECT )
' SbxVOID firePropertiesChangeEvent ( SbxARRAY, SbxOBJECT )

С помощью этих методов, теоретически, можно снять контролёров изменений, в частности метод removeVetoableChangeListener должен снимать вето на изменения параметров. НО... как всегда это пресловутое "НО"... Этот метод ждёт два параметра: SbxSTRING и SbxOBJECT. SbxSTRING - это имя параметра, с которого нужно снять вето. А вот с SbxOBJECT засада. Он ждёт объект, класса XVetoableChangeListener, т.е. - ждёт самого листенера, который и ограничивает возможность изменений.
И в этом проблема. Не могу поймать этот объект, потому что не я его создавал и запускал. Если мы сами создаём эти объекты, что-то типа
lVetoableChange = createUnoListener("MyList_", "com.sun.star.beans.XVetoableChangeListener")
То тогда можно оперировать объектом lVetoableChange по своему усмотрению. А вот если его создавал "некто", т.е. сама LO его создала, то как можно его отловить?
Вот сколько не искал и не пытался не могу найти информацию как получать "чужие" листенеры, привязанные к какому-нибудь объекту. В инете такой информации не нашёл.

Kadet

Продолжаю исследования в этом направлении.
Выяснил, что всему "виной" появления запроса на восстановление является параметр ExistsRecoveryData, который в случае "необходимости" такого запроса переводится в значение "true" и это провоцирует вызов диалогового окна. Если этот параметр имеет значение "false", то запроса нет.

В инете в этих случаях рекомендуют почистить или вовсе удалить файл registrymodifications.xcu, в связи с чем набросал макрос:
Sub NoRestore()
dim fso, UserProfilePatch, t_FileName, FileNameCopy, oUrl, oUrlCopy

fso = CreateObject("Scripting.FileSystemObject")

UserProfilePatch = wshShell.ExpandEnvironmentStrings("%USERPROFILE%") ' C:\Users\_USERNAME_
t_FileName = UserProfilePatch & "\AppData\Roaming\LibreOffice\4\user\registrymodifications.xcu"
oUrl = ConvertToURL("file:\\\" & t_FileName)
FileNameCopy = UserProfilePatch & "\AppData\Roaming\LibreOffice\4\registrymodifications.xcu"
oUrlCopy = ConvertToURL("file:\\\" & FileNameCopy)

if fso.FileExists(t_FileName) then
' FileCopy(oUrl, oUrlCopy)
Kill(oUrl)
end if
End Sub

Не. Не помогает. Макрос, повешенный на общее событие "открытие приложения" действительно удаляет этот файл, но он тут же снова появляется, а вслед за ним появляется и запрос на восстановление.
Попробую почистить этот файл от ненужного, как тоже рекомендуют, но, думаю, результат будет прежним.

Kadet

#6
Что я делаю не так?
Набросал макрос, строго по Питоньяку, который должен читать из файла данные и удалять лишние строки (удаление ещё не сделал). А он вроде бы и файл открывает (n становится равной 1), но при этом длину файла определяет как 0, хотя на самомо деле в нём 1,07Мб.
Sub NoRestore()
Dim WshShell, FileName$, FileNameCopy$, LineInFile$, TestStr$, LineInText$, vbCr
Dim TestStrLen, vbamp, n, oUrl
Dim sArg(0) As New com.sun.star.beans.PropertyValue

vbamp = chr(34)
WshShell = CreateObject("WScript.Shell")
FileName = WshShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\AppData\Roaming\LibreOffice\4\user\registrymodifications.xcu"
oUrl = ConvertToURL("file:\\\" & FileName)
NewFileContent = ""

TestStr = "<item oor:path=" & vbamp & "/org.openoffice.Office.Recovery/"
TestStrLen = Len(TestStr)

n = FreeFile
Open oUrl For Output Access Read Write As #n
if FileExists(FileName) then
MsgBox "Длина файла - " & LOF(n) & Chr(10) & "Положение курсора - "  & Loc(n) & Chr(10) & "Конец файла - "  & EOF(n)
Do While NOT EOF(n)
Line Input #n, LineInFile
MsgBox "Абзац считан - " & LineInFile
LineInText = Left(LineInFile, TestStrLen)
If LineInText=TestStr Then
MsgBox "Нужно удалить всю линию - " & LineInFile
end if
Loop
Close #n
end if

End Sub

Когда открывал таким образом уже открытый файл (oDoc = oDesk.loadComponentFromURL(oUrl, "_blank", 8, sArg()), то всё определялось правильно, и длин и данные читались. Писать не хотел, на "Open oUrl For Output Access Read Write As #n" ругался. Ошибка ввода/вывода говорил.
А отключил предварительное открытие файла, так и файл пустым определяется.

rami

Если вы выполняете Open oUrl For Output Access Read Write As #n , то содержимое файла удаляется, он будет пустой.
Чтобы содержимое файла не удалялось, нужно открывать его Open oUrl For Input Access Read Write As #n (для чтения и записи)

bigor

Режим  Access Read Write так же удаляет содержимое, даже при Input

Как вариант читать один, а писать во второй
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Kadet

М-да. Действительно оба варианта удаляют содержимое.
Значит, и эти мои потуги ни к чему. Ибо вне зависимости от попыток, удаляются ли данные из документа или сам документ, запрос на восстановление всё равно выскакивает.


Kadet

Проверил просто Open oUrl For Input As #n. Ничего не удаляет.
Однако, мне же нужно найти заменить строчку, вернее удалить её.
Теоретически можно запомнить номер этой строки (Line), закрыть документ, открыть его заново для записи и удалить эти строчки. Но как их запомнить?

bigor

Цитата: Kadet от 18 октября 2020, 17:24Но как их запомнить?
но вы же сами пример привели, где выводится позиция указателя, установить его можно через seek #n, позиция.
Хотя мне кажется использовать два файла для чтения и записи проще. Читаем первый, если нет интересующей строки пишем ее во второй, если есть не пишем. Закрываем переименовываем
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Kadet

Цитата: Bigor от 18 октября 2020, 18:13Хотя мне кажется использовать два файла для чтения и записи проще. Читаем первый, если нет интересующей строки пишем ее во второй, если есть не пишем. Закрываем переименовываем
Т.е. перекатать все данные, исключая ненужное?!. Круто. Я как-то в таких масшабах не мыслил.

Kadet

Для пробы, чтобы зря не морочиться, сделал проще. В соседнюю папку положил уже почищенный registrymodifications.xcu и на событие запуск офиса (приложения) повесил макрос, который копирует из соседней папки "чистый" файл в папку user, т.е. подменяет на чистый.

Результата никакого. Запрос на восстановление всё равно выскакивает.
Вот если файл registrymodifications.xcu заранее почистить, сохранить, а уж потом запустить LO, тогда да. Тогда запроса нет. А во время запуска этот способ не работает.

М-да. Нужно, таки, найти способ снять вето с параметра ExistsRecoveryData и попробовать зафелсить его. Может это поможет.

А вот в этих строчках в registrymodifications.xcu, при описании параметров и их значений есть такой параметр op="fuse".
<item oor:path="/org.openoffice.Office.Recovery/RecoveryInfo"><prop oor:name="Crashed" oor:op="fuse"><value>false</value></prop></item>
"fuse", насколько мне известно, переводится как "предохранитель". Что бы это значило?

economist

#14
Цитата: Kadet от 18 октября 2020, 18:29Т.е. перекатать все данные, исключая ненужное?!

Если будете читать строки из файла - читайте всё в строковый массив через LINE INPUT, тогда и писать обратно будет легче обычным PRINT в цикле по UBound массива. Не используйте всякие GET PUT - они либо не работают, либо пишут лишний мусор в начале строки. Да и SEEK - лишнее усложнение, следить за указателем - то еще удовольствие.

То есть читаем файл и его полностью пересоздаем, на месте.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...