• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

можно ли открыть документ скрытно?

  • Автор темы deeeman
  • Дата начала
D

deeeman

Привет всем!

может как нибудь можно открыть документ, чтобы получить у него uiDoc, но чтобы его не было видно...

PS
и это нужно делать в цикле... =)
 
A

allex

Идейно вот так


coll=getalldocbykey(key)
set doc = coll.getfirstdoccument
while not doc is nothing
uind = doc.universalid
wend
set doc = coll.getnextdoccument(doc)
 
N

nvyush

deeeman
А зачем? См. notesDocument.ComputeWithForm, может это поможет.
 
D

deeeman

мне нужно в виде перебирать все документы, откывать их, копировать содержимое в буфер обмена, потом буфер вставлять в word документ - отправлять на печать... и т далее

именно через буфер (потому что так более красиво), через заполнение полей на форме word не устаривает.
 
D

Darker

копировать содержимое документа в UI в буфер без отображения самого дока не получится, ИМХО.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
deeeman

После открытия документа в UI и копирования его в буфер обмена сразу же закрывате его Call NotesUIDocument.Close(True). Если машины мощные, то даже моргать почти не будет :happy:

Свойства Visible у NotesUIDocument'а к сожалению нет...
 
D

deeeman

ну с морганием должно устроить...
накатал код, подскажите в чем ошибка:

вываливается на строке: Call uiDoc.Copy
команда не может быть выполнена...

Код:
Sub Click(Source As Button)
On Error Goto ErrLabel

Dim wObj As Variant
Dim ws As New NotesUIWorkspace
Dim uiDoc As NotesUIDocument
Dim doc As NotesDocument
Dim view As NotesView

Set wObj = CreateObject("Word.Application")
Set view = ws.CurrentView.View
Set doc = view.GetFirstDocument
While Not doc Is Nothing 
With wObj
.Documents.Add
Set uidoc = ws.EditDocument(False, doc)
Call uiDoc.Copy
.Selection.Paste
'.printOut
.ActiveDocument.Close(False)
Call uiDoc.Close
End With
Set doc = view.GetNextDocument(doc)
Wend


EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! Печать документов' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub
 
N

nvyush

Видимо, Лотус не знает, что копировать. Нужно сперва как-то выделить копируемый текст.
 
D

deeeman

Call uidoc.SelectAll

если ставлю эту строку то на ней сваливается

Добавлено: Причем, если такой же код повесить на кнопку на форме, и при открытом документе, то все работает.
может как то нужно фокусировать что открыт документ
 
N

nvyush

deeeman
Может документ просто не успевает открыться? Можно попробовать Sleep, но кмк это не поможет.

Добавлено: можно попробовать вешать копирование в ворд на постопен формы. Необходимость отработки данного фрагмента кода проверять с помощью очередей, темпового поля самого документа, профилей, переменных окружения...
 
D

deeeman

попробовал с паузой, все равно....

ошибка на строке Call uiDoc.Copy
Document command is not available

Если ли еще способы в буфер загнать содержимое UiDoc?
 
T

turumbay

Добавлено: можно попробовать вешать копирование в ворд на постопен формы. Необходимость отработки данного фрагмента кода проверять с помощью очередей, темпового поля самого документа, профилей, переменных окружения...
+1. Юзать события формы. Тока не надо трогать код формы. Достаточно on event
Код:
Function copyDocContent( i_doc As NotesDocument )
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.EditDocument(False, i_doc , False , , True )
On Event queryclose From uidoc Call myQueryClose ' кармообразующее дейстиве 
Call uidoc.Close
End Function
Sub myQueryClose(source As NotesUIDocument , continue )
Dim ws As New NotesUIWorkspace ' использование source у меня не заработало ( 7.0.3 )
Call ws.CurrentDocument.SelectAll
Call ws.CurrentDocument.Copy
End Sub
 
N

nvyush

Если ли еще способы в буфер загнать содержимое UiDoc?
В цикле перед
Код:
 Set uidoc = ws.EditDocument(False, doc)
пишем
Код:
 doc.ReplaceItemValue("$$CopyAll", "1").SaveToDisk = False
В PostOpen формы пишем:
Код:
Sub Postopen(Source As Notesuidocument)
If Source.Document.HasItem("$$CopyAll") Then
Source.SelectAll
Source.Copy
'вставляем в ворд и печатаем
Source.Close
End If
End Sub
Если будет работать, очень удивлюсь :happy:
Добавлено: Пока писал turumbay уже всё решил ;).
 
D

deeeman

turumbay, сделал как ты велел ))
та же ошибка:

на строке Call ws.CurrentDocument.SelectAll

код:

Код:
Dim wObj As Variant

'как глобальные
Dim ws As NotesUIWorkspace
Dim uiDoc As NotesUIDocument
Dim doc As NotesDocument
Dim view As NotesView

Sub Click(Source As Button)
On Error Goto ErrLabel

Set ws = New NotesUIWorkspace
Set wObj = CreateObject("Word.Application")


Set view = ws.CurrentView.View
Set doc = view.GetFirstDocument

While Not doc Is Nothing 
With wObj
.Documents.Add

Set uidoc = ws.EditDocument(False, doc , False , , True )
On Event queryclose From uidoc Call myQueryClose
Call uidoc.Close

End With
Set doc = view.GetNextDocument(doc)
Wend


EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! Печать документов3' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub

Sub myQueryClose(source As NotesUIDocument , continue )
On Error Goto ErrLabel

'тут сваливается...
Call ws.CurrentDocument.SelectAll
Call ws.CurrentDocument.Copy

wObj.Selection.Paste
wObj.printOut
wObj.ActiveDocument.Close(False)

EndSub:
Exit Sub
ErrLabel:
Msgbox "Error! myQueryClose' " & Err() & " at line " & Erl() & ": " & Error() 
If Not Isempty(wObj) Then wObj.Quit(0)
Resume EndSub
End Sub
 
N

nvyush

turumbay, сделал как ты велел ))
та же ошибка:

на строке Call ws.CurrentDocument.SelectAll
Попробуй мой вариант.
Добавлено: В принципе в постопене можно с вордом ничего не делать, документ мы уже скопировали, пастить в ворд и печать можно и в теле цикла.
 
D

Darker

Попробуй пройтись по полям.
uidoc.GotoField("Нужное поле")
uidoc.selectall
 
H

hosm

Это что, проверка на документ в режиме редактирования?
GotoField
This method is valid only when the document is in Edit mode.
 
T

turumbay

turumbay, сделал как ты велел ))
не. я не так велел :)
я велел ws инстанцировать внутре myQueryClose. и уж точно не велел юзать глобальные переменные, и тем более сувать в мой пушистый кроссплатформенный код какие-то wObj :)
P.S. возьми код из этого поста link removed
и замени
Код:
Set uidoc = ws.EditDocument(False, doc)
Call uiDoc.Copy
на
Код:
copyDocContent( doc )
P.S. На пальцах: глобальный ws.currentDocument не указывает куда следует... Т.о. нужно принудительно пересоздать ws, чтобы подсосался uidoc.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!