Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: FrankLU am 11.06.21 - 17:37:36

Titel: Feststellen, ob das LN-Programmfenster den Fokus hat
Beitrag von: FrankLU am 11.06.21 - 17:37:36
Hallo,

ich habe pünktlich zum Wochenende noch ein Problem, das mir das Wochenende aber nicht vermiesen wird.  ;D

Situation:
Ich erstelle per LS und Notes2Paper Rechnungen im PDF-Format, die ich in einem lokalen Verzeichnis ablege. Zu jeder Rechnung kann es gescannte Fremddokumente geben (z.B. Arbeitsnachweise, Fremdrechnungen), die im PDF-Format vorliegen, und die mit der Rechnung per E-Mail versendet werden sollen.
Der Kunde möchte nun nicht eine Mail mit x Anhängen zu einem Abrechnungsfall bekommen, sondern nur eine Mail mit einem Anhang, in dem alle PDF-Dateien in einer PDF-Datei zusammengefasst sind.
Mit Hilfe der freien PDF-Software "PDF24" kann ich in einem Shell-Befehl veranlassen, dass alle (PDF-)Dateien in einem Verzeichnis zu einer PDF-Datei zusammengefasst werden. Diese zusammengefasste PDF-Datei kann ich dann per LS in eine E-Mail hängen.

Problem:
Der Shell-Befehl wartet nach dem Aufruf nicht, bis das aufgerufene Programm beendet ist, sondern LS läuft im Hintergrund (während des Packens der PDFs) weiter und verarbeitet die nächste Rechnung. Das würde dazu führen, dass bei vielen zu verarbeitenden Rechnungen das Programm PDF24 unzählige Male gleichzeitig liefe, was auch Crash-anfällig ist.

Frage:
Kann man in einem laufenden LS abfragen, ob der Notes-Client das aktive Windows-Programm ist? Durch den Aufruf von "Shell" mit dem windowStyle "1", verliert das LN-Fenster ja den Fokus und bekommt ihn wieder, wenn PDF24 sich wieder schließt, nachdem es gearbeitet hat. Das würde ich für eine Warte-Schleife nutzen wollen, die man auch noch zeitlich befristen könnte, damit's keine Endlosschleife wird...

Weiß da jemand eine Lösung?

Ich wünsche ein schönes Wochenende!
Frank
Titel: Re: Feststellen, ob das LN-Programmfenster den Fokus hat
Beitrag von: tfrenz am 12.06.21 - 09:28:16
Hallo, wenn das ganze ein Windows batch ist, kann man mit "start /wait prog.exe" warten, bis das Programm ausgeführt ist.
Erst dann wird der nächste Befehl abgearbeitet.
Bei Linux kenne ich das in dem man mit "&&" mehrere Script befehle verbindet.

gruß Thomas
Titel: Re: Feststellen, ob das LN-Programmfenster den Fokus hat
Beitrag von: Tode am 12.06.21 - 15:03:56
Verwende ganz einfach statt des LotusScript Shell- Befehls den ShellExecute- Befehl aus der shell32.dll. Denn dieser liefert einen Rückgabewert, und LotusScript wartet, bis das Programm beendet ist:
Code
'-In den Declarations :
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (Byval hwnd As Long, Byval lpOperation As String, Byval lpFile As String, Byval lpParameters As String, Byval lpDirectory As String, Byval nShowCmd As Long) As Long

'-und aufgerufen wird das ganze dann so:

shRet = ShellExecute(0, "Open", "DeinCommand" , 0, 0, 1)
Titel: Re: Feststellen, ob das LN-Programmfenster den Fokus hat
Beitrag von: FrankLU am 15.06.21 - 13:02:45
Ich danke Euch für die schnelle Unterstützung und Hilfe!!!  ;D

Schöne Woche noch!

Frank
Titel: Re: Feststellen, ob das LN-Programmfenster den Fokus hat
Beitrag von: FrankLU am 12.07.21 - 14:31:04
Hallo!

Ich wünsche Euch eine guten Start in die neue Woche!

Leider hat sich mein Problem noch nicht gelöst, der ShellExecute eine Programm zur PDF-Erstellung aufzurufen.
Es geht darum, mit dem netten Tool PDF24 vorhandene PDF-Dateien in ein PDF-Dokument zu packen, um nur einen Dateianhang per Mail wegschicken zu müssen.
Hier mal der Testcode:

Code
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(Byval hwnd As Long, Byval lpszOp As String, _
Byval lpszFile As String, Byval lpszParams As String, _
Byval LpszDir As String, Byval FsShowCmd As Long) As Long

Sub Click(Source As Button)
	Dim ws As New NotesUIWorkspace
	Dim uiDoc As NotesUIDocument
	Dim Dateien (3) As String
	Dateien(0) = "C:\Temp\Rechnung.pdf"
	Dateien(1) = "C:\Temp\Korrespondenz.pdf"
	Dateien(2) = "C:\Temp\Bericht.pdf"
	Dim Param As String
	Dim Result As Integer
	Set uiDoc = ws.CurrentDocument
	Param = " -join -profile default/good -outputFile C:\Temp\" & uiDoc.FieldGetText("KDNR") & ".pdf " & Join(Dateien, " ")
	'Result = Shell("C:\Program Files (x86)\PDF24\pdf24-doctool.exe" + Param ,1)
	Result = ShellExecute(0, "Open", "C:\Program Files (x86)\PDF24\pdf24-doctool.exe" + Param, 0, 0, 1)
End Sub

Wenn ich den Code mit Shell ausführe, läuft er problemlos durch und ich erhalte die PDF-Datei.
Wenn ich den gleichen befehl mit ShellExecute absetzen will, erhalte ich Result = 2, was wohl "Datei nicht gefunden" bedeutet. Nur welche Datei findet er denn nicht?

Ich hoffe, Ihr könnt mir noch mal helfen. Danke im voraus!

Frank
Titel: Re: Feststellen, ob das LN-Programmfenster den Fokus hat
Beitrag von: FrankLU am 12.07.21 - 14:47:03
Ok, habe es selber herausgefunden.

Die Programmparameter (String "Param") für das Programm pdf24-doctool.exe muss beim ShellExceute in der Parameter-Variable übergeben werden, nicht mit im Parameter für den Programmaufruf.

Eigentlich logisch...  ;D

Code
Result = ShellExecute(0, "Open", "C:\Program Files (x86)\PDF24\pdf24-doctool.exe", Param, 0, 1)

Danke normals!