помогите с решением плз

Автор foxyra, 14 июня 2020, 06:10

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

foxyra

Доброго времени суток.
есть задача делать скриншот экрана в vba (openoffice)и сохранять его в определенную папку на hdd.
Нашел код который сохраняет в буфер.

REM  *****  BASIC  *****
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const VK_SNAPSHOT = &H2C

Sub PrintScreen()
    keybd_event VK_SNAPSHOT, 1, 0, 0
End Sub


как сохранить в файл из буфера , разницы нет bmp ,jpeg.

за ранее спасибо...

bigor

А зачем для этого OpenOffice?
Но если очень хочется, то как то так:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const VK_SNAPSHOT = &H2C

Sub PrintScreen()
Dim Param1(0) as new com.sun.star.beans.PropertyValue
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Param1(0).Name =  "FilterName"
Param1(0).Value = "draw_jpg_Export"


    keybd_event VK_SNAPSHOT, 1, 0, 0
    wait(100)
   
NewDoc=StarDesktop.loadComponentFromURL("private:factory/sdraw" ,"_blank", 0, Array())

dispatcher.executeDispatch(NewDoc.CurrentController.Frame, ".uno:Paste", "", 0, Array())
aURL = "file:///c:/test/Scr_" & replace(date,".","-") & replace(time,":","") &".jpg"
NewDoc.storetourl(aUrl,Param1())
NewDoc.close true
End Sub

правда, экспорт с разрешением 96 dpi. Но дальше копайте сами :)


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

foxyra

ООО ваще нормально , огромное спасибо

foxyra

#3
Вообще все хорошо работает , меня только одно смущает когда он сохраняет картинку , на секунду выскакивает белое окно ,с названием Без названия....  от этого можно как-то избавиться? чтобы пользователь не видел что происходит какие-то действие.

а так все работает замечательно..
и еще вопрос как можно запустить данное действие из макроса? про горячие кнопки в настройках я знаю...а по средством самого макроса... к примеру назначить ctrl+p..
просто проблема если в настройках ставишь горячие кнопки например ctrl+p .... то в этом документе все работает хорош,но когда открываешь другой документ ,то в нем вылазит ошибка сценария.. а должен вылазить просто принтер печать..
макрос прикреплен к конкретному документу

bigor

Можно создать скрытый документ Draw, но вставка буфера в него при экспериментах отработала криво.  Если есть желание экспериментируйте:
Sub PrintScreen()
Dim Param1(0) as new com.sun.star.beans.PropertyValue

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Param1(0).Name = "Hidden"
Param1(0).Value = true
    keybd_event VK_SNAPSHOT, 1, 0, 0
    wait(100)
NewDoc=StarDesktop.loadComponentFromURL("private:factory/sdraw" ,"_blank", 0, Param1())
dispatcher.executeDispatch(NewDoc.CurrentController.Frame, ".uno:Paste", "", 0, Array())
aURL = "file:///~/test/Scr_" & replace(date,".","-") & replace(time,":","") &".jpg"
Param1(0).Name =  "FilterName"
Param1(0).Value = "draw_jpg_Export"
NewDoc.storetourl(aUrl,Param1())
NewDoc.close true
End Sub


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

foxyra

Огромное Вам спасибо добрый человек .... низкий Вам поклон ,за то что откликнулись на мое сообщение ... честно сказать вы единственный кто дал мне правильный макрос ..он работает так как надо... а с кнопками я разберусь сам ) еще раз спасибо

foxyra

#6
NewDoc=StarDesktop.loadComponentFromURL("private:factory/sdraw" ,"_hidden", 0, Array())
в книге указано

В качестве второго параметра, loadComponentFromURL ожидает имя для фреймового
объекта окна, которое LibreOffice создает внутри для его управления. Здесь обычно
определяется предопределенное имя _blank, и оно гарантирует, что LibreOffice создаст новое
окно. Альтернативно, может также быть определено _hidden, и оно гарантирует, что
соответствующий документ будет загружен, но останется невидимым.

но он все равно видимый

а если вместо Array вписать переменную с параметрами ,то он работает с буфером криво,и сохраняет картинку криво.

Param1(0).Name =  "FilterName"
Param1(0).Value = "draw_jpg_Export"


NewDoc=StarDesktop.loadComponentFromURL("private:factory/sdraw" ,"_hidden", 0, Param1())


но если сделать так , то картинка в буфер скидывается нормальная... но файл в папке экпортируется не определенный

Sub PrintScreen()
Dim Param1(0) as new com.sun.star.beans.PropertyValue

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Param1(0).Name =  "Hidden"
Param1(0).Value = true


   keybd_event VK_SNAPSHOT, 1, 0, 0
     
NewDoc=StarDesktop.loadComponentFromURL("private:factory/sdraw" ,"_blank", 0, Param1())

dispatcher.executeDispatch(NewDoc.CurrentController.Frame, ".uno:Paste", "", 0, Array())
aURL = "file:///c:/test/Scr_" & replace(date,".","-") & replace(time,":","") &".jpg"

NewDoc.storetourl(aUrl,Param1())
NewDoc.close true
End Sub

так как нет

Param1(0).Name =  "FilterName"
Param1(0).Value = "draw_jpg_Export"

mikekaganski

Цитата: foxyra от 15 июня 2020, 07:12
но если сделать так , то картинка в буфер скидывается нормальная... но файл в папке экпортируется не определенный

...
Dim Param1(0) as new com.sun.star.beans.PropertyValue
...
Param1(0).Name =  "Hidden"
Param1(0).Value = true
  ...
NewDoc=StarDesktop.loadComponentFromURL("private:factory/sdraw" ,"_blank", 0, Param1())
...
NewDoc.storetourl(aUrl,Param1())
...

так как нет

Param1(0).Name =  "FilterName"
Param1(0).Value = "draw_jpg_Export"


А почему Вы используете одни и те же параметры и для создания документа, и для его экспорта? При создании Вы передаёте параметр операции "Hidden=true", который в этом случае имеет смысл; но этот параметр бессмыслен при экспорте. Перед экспортом переопределите значение Param1(0) на новую пару "FilterName"-"draw_jpg_Export".
С уважением,
Михаил Каганский

mikekaganski

Цитата: foxyra от 15 июня 2020, 07:12
NewDoc=StarDesktop.loadComponentFromURL("private:factory/sdraw" ,"_hidden", 0, Array())
в книге указано

В качестве второго параметра, loadComponentFromURL ожидает имя для фреймового
объекта окна, которое LibreOffice создает внутри для его управления. Здесь обычно
определяется предопределенное имя _blank, и оно гарантирует, что LibreOffice создаст новое
окно. Альтернативно, может также быть определено _hidden, и оно гарантирует, что
соответствующий документ будет загружен, но останется невидимым.

но он все равно видимый

Возможно, в книге указано желаемое, а не действительное.

Вот страница документации, которая перечисляет возможные специальные значение для целевого фрейма: XComponentLoader. Там нет никакого _hidden.

Дополнительно некоторые из специальных значений упоминаются на страницах:


... и там тоже нет такого значения.

Ну и наконец вот исходный код, где определены все специальные значения.
С уважением,
Михаил Каганский

bigor

#9
Используя, параметры:
Param1(0).Name =  "Hidden"
Param1(0).Value = true
получаем, что при "скрытом" создании файла картинка из буфера вставляется не в видимую область, а со смещением. (Приложение Scr_*.odg). Ее можно конечно подвинуть, но вот интересно почему такое отличие от вставки в "видимый" файл?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут