Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: enny am 17.04.03 - 08:56:29
-
Suche eine Möglichkeit via Lotus vor dem Ausdruck eines Notes Dokoments meinen Drucker zu wechseln und auch gleich mal zu konfigurieren (zumindest Querformat einzustellen)!!! Hat irgendjemand eine Idee???
MfG
Enny
-
In der Sandbox findest du die API Goodies
http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/b376f26b8cbd9f1b8525694d004e24c3?OpenDocument&Highlight=0,printer
Hiermit kannst du dann über script Querdruck und einige andere Sachen einstellen; allerdings nur unter Win9x
Unter W2K und NT funktioniert das ein wenig anders. Auf www.searchdomino.com gibt es das passende Tool
Changing printer orientation for Windows 2000
http://searchdomino.techtarget.com/tip/1,289483,sid4_gci880501,00.html?FromTaxonomy=%2Fpr%2F283841
und den default printer kannst du mit
http://eknori.dyndns.org/knowledge/devidea.nsf/Alpha/0C10694D54E888C9C1256B8C002F912F?OpenDocument
wechseln
eknori
-
Was soll ich sagen hört sich super an! Danke für den Tipp
MfG
Enny
-
Hallo Ihr beide,
hab' das Script zum Umschalten des Druckers ausprobiert. Windows hat darauf wunderbar reagiert und den Standarddrucker umgestellt.
Nur Notes hat kein Interesse im laufenden Betrieb den neuen Standard Drucker zu verwenden und bleibt immer auf dem zuletzt benutzten Drucker stehen.
Wie kann ich Notes noch überreden?
Danke - Gruß muR :)
-
... ich habe das bislang nur bei Win98SE problemlos zum Laufen gebracht - unter Win2000 kenne ich noch keinen, der mir das zeigen konnte...
ata
-
Ich habe das script jetzt auch mal ausprobiert nur er ändert mir auch nicht auf Querformat! Ändert das script nur auf Querformat oder beim zweiten durchlaufen wieder auf hochformat!! und wie sehe ich das im script ob er umgestellt hat?
robertpp
-
... um sicher zu gehen mußt du jedesmal wieder aus der Registry/Druckereinstellungen auslesen...
... ich habe festgetellt, daß es je OS unterschiedlich erkannt wird. Am wenigsten Probleme hatte ich wie bereits erwähnt mit Win98SE...
ata
-
Nun ja ich habe das ganze auch mal ausprobiert und muß sagen es funktioniert ja ganz gut! (zumindest mit der Papierausrichtung)
Alles andere (wie z.B. defaultSource, Color, Scale etc.) lässt sich nicht ändern und gleich nutzen, sondern erst nach neustart von Notes. :-(
Hat den keiner eine Idee wie man das vielleicht auch noch umgehen könnte?
Übrigens sollte die Ausrichtung auch nach mehrfachem ausführen gleich bleiben.
-
Ich hab das ganze unter win2000 ausprobiert aber es ändert sich das layout nicht hat sonst noch jemand erfahrung mit diesem problem unter win2000!! oder hat jemand eine db die er mir schicken kann um es auszuprobieren?
robertpp
-
... das Problem ist, daß Notes trotz Aufforderung nicht erkennt, daß sich in der Zwischenzeit die Druckerauswahl geändert hat. Daher funktionierts erst nach einem Neustart...
... mir ist ( noch ) kein Workaround bekannt, auch ich bin an einer Lösung interessiert...
ata
-
@robertpp:
Nun ja also ich kann bloß sagen das es bei mir zumindest mit dem Layout unter w2k funktioniert hat. Vielleicht hast du bloß eine kleinigkeit übersehen!?
@ata:
nun ja da werden wir wohl auf "BigBlue" warten müssen oder uns mit externen Programmen rumschlagen dürfen!!! :'(
-
Ganz doofe Frage: Warum nicht: Strg+D drücken, dort kannste dann den Drucker auswählen und unter Einrichten auch Hoch/Querformat auswählen ;)
-
HMM, nur mal so nachgefragt: Soll das Drucken so ganz ohne Userinteraktion erfolgen ??
Sonst würde es ja auch ein simples
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Call uidoc.Print
tun; da poppt ja automatisch der DruckerConfigDLG auf.
eknori
-
ansonsten ginge das über die WIndows API
http://www.vbarchiv.net/vbapi/PrintDlg.php
da lassen sich einige Einstellungen in der DEVMODE-Struktur vorbesetzen.
-
... die Problemstellung bei mir war folgendes Szenario:
Ein User drückt eine Aktion. Eine Backend-Auswertung ermittelt eine Anzahl an Dokumenten. Bestimmte Dokumente sollen auf einem anderen Drucker ausgedruckt werden.
... hier kann man kein Userinterface mehr verwenden.
... ich hatte meinenAnsatz über das Auslesen der Win-Ini, bzw. Registry und einem abschließenden Broadcast an alle geöffneten Anwendungen, daß der Drucker sich geändert hat. Das begreifen alle geöffneten Anwendungen, nur eben Notes unter Win2000 nicht...
@Eknori
... was heiß Devmode? Ich werde mir deinen Link anschauen...
ata
-
nun ja benutzer sind nun mal faul und fehler anfällig. Ich wollte es eigentlich schon mehr oder minder voll automatisiert machen!
@ekorni:
Das mit der Winodows API ist ja schön wenn Notes alle Einstellungen übernehmen würde! Dies geschieht nämlich mit ausnahme der Ausrichtung erst nach einem Neustart von Notes! :'(
Oder habe ich etwas übersehen?
-
Ich hab den link auf www.searchdomino.com ausprobiert fürs win2000 um beim drucken auf querformat umzustellen weil man kann ja den user nicht sagen er muss jedes mal wenn er in dieser DB etwas drucken möchte auf querformat umschalten!! Bei mir hat das allerdings nicht funktioniert!!
@enny hast du das mit dem querformat schon probiert? funktioniert es bei dir? kannst du mir die DB schicken weil bei mir übernimmt er nicht einmal das querformat im win2000!
Oder hat schon jemand das script fürs vb ausprobiert?
robertpp
-
@robertpp: Habe es schon gemacht allerdings daheim! :(
Aber ich glaube ich könnte eine allgemeine Lösung gefunden haben die dann auch den Drucker wechsel kann und alle anderen einstellungen machen kann:
http://www.experts-exchange.com/Applications/Email/Lotus_Notes/Q_20373597.html (http://www.experts-exchange.com/Applications/Email/Lotus_Notes/Q_20373597.html)
-
Dort steht zwar viel aber über hoch und querformat hab ich dort nicht wirklich etwas gefunden!!!
-
... ich habe mir den Code angeschaut und ausprobiert, bei mir geht er leider nicht...
ata
-
hier wäre noch was
http://www.benpoole.com/members/benpoole/benhome.nsf/0/3D1CA809AA35C9E780256C1B006FBD0D?OpenDocument
eknori
-
Also bei mir scheint alles zu funktionieren!
@ata: Hast du gleich nach dem wechseln versucht etwas zum Drucker zu schicken? Die Funktion SendMessage braucht nämlich anscheinend eine Zeit bis sie zurückkehrt, d.h. mein Debugger hat zumindest eine Zeit gebraucht das ganze auszuführen.
@all:
Werde heute abend versuchen alle Sachen in meine DB einzupflegen also Drucker wechseln, Einzug wechseln, Ausrichtung wechseln etc., wenn es funktioniert bekommt ihr morgen eine TestDB
MfG
Enny
-
... ich habe noch eine Zeitverzögerung drin aus diesem Grund - damit kann ich natürlich noch spielen...
ata
-
Also wie versprochen gibt es heute eine TestDB!!! Sie funktioniert für Wechsel des Standard Druckers, Wechsel der Orientierung, Wechsel des Einzugs und beim Rest wie z.B. Skalierung kann ich jetzt nicht genau sagen ob es nicht funktioniert oder ob mein Drucker das einfach nicht unterstützt! genau das selbe war es mit dem Format hab halt mal A5 gewählt kann mein Drucker aber nicht! Deswegen könnte auch funktionieren! ;D
Es ist auch noch erweiterbar siehe DEVMODE Type in Skriptbibliothek.
Ach ja ich habe keine Aktionen gemacht da ich das ganze noch übern Debugger laufen lassen wollte! So have a lot of fun ... ;D
-
Ich hätte da vielleicht noch eine kleine Performance verbesserung, kann sie aber leider nicht implementieren,
da ich diesen Tip nicht ganz umsetzen kann!
Applications that need to communicate using HWND_BROADCAST should use the RegisterWindowMessage function
to obtain a unique message for inter-application communication.
(Quelle MSDN)
siehe:
SendMessage:
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/
messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp (http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/
messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp)
RegisterWindowMessage:
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/MessagesandMessageQueues/
MessagesandMessageQueuesReference/MessagesandMessageQueuesFunctions/RegisterWindowMessage.asp
(http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/MessagesandMessageQueues/
MessagesandMessageQueuesReference/MessagesandMessageQueuesFunctions/RegisterWindowMessage.asp)
hat vielleicht einer von euch eine Idee was ich der guten funktion übergeben muß, dass sie auch mit LN redet. SendMessage braucht
nämlich anscheinend je nach konfiguration oder vielleicht auch laufenden Programmen ganz schön viel Zeit. (Bei mir daheim hab ich
ca. 10 sec. warten müssen und ich habe keinen 386er ;) )
-
Hallo,
ich kämpfe auch eine Weile mit dem Problem. Mir würde es schon reichen wenn Notes den umgestellten standard Drucker akzeptieren würde. Habe einige Sachen von Euch ausprobiert. Windows (Nt4SP6) und andere Programme stellen sich um nur nicht Notes (5.0.11).
Ich hab' es jetzt mit einem externen VB6 Programm probiert. Dabei hat sich gezeigt, das Notes erst nach einem zweiten SendMessage auf die Umstellung reagiert.
Public Sub SetDefaultPrinter(ByVal PrinterName As String, ByVal DriverName As String, ByVal PrinterPort As String)
Dim DeviceLine As String
DeviceLine = PrinterName & "," & DriverName & "," & PrinterPort
Call WriteProfileString("windows", "Device", DeviceLine)
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, ByVal "windows")
'Nach dem zweiten Aufruf kommt auch bei Notes 5 der Wechsel an
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, ByVal "Windows")
End Sub
Innerhalb eines Notes Scripts hat das aber auch nicht viel gebracht.
Das VB Programm kann mit dem Namen des gewünschten Druckers als Parameter gestartet werden. Dann stellt es den standard Drucker um. Ich werde dieses externe Programm in mein Notes script zum Umschalten einbinden.
Vielleicht kommt jemand mit dem VB Programm weiter und kann es in Notes besser einbinden
Gruß muR :P
-
Ich habe jetzt natürlich das Problem das ich kein NT4 aber ich werde dein zeug mal ausprobieren!
MfG
Enny
-
ich bekomm das leider nicht hin!
Funktioniert das auch wenn man nur netzwerkdrucker hat?
mir gibt er bei nRet immer -1 zurück.
Was sollte bei hPrinter drinnen stehen!! Da steht bei mir auch nichts drinnen!!
der drucker heisst bei mir "PRT52_EDV" und den Port hab ich auf "NE04:" gesetzt oder kann ich ihm auch irgendwie die ip-adresse angeben?
-
Also um es genau zu wissen wie sich dein Drucker nennt auf welchem Port und vor allem wie
dieser sich nennt, kannst du via VB (wenn du es besitzt) über das Printer Objekt alle Daten
auslesen. Dazu erstellst du einfach ein Projekt, schreibst irgend eine Zeile Code rein die er
abarbeiten muss, lässt das ganze über den Debugger laufen und fügt in der Überwachung das
globale Printer objekt ein. Dann solltest du schon mal alle Daten zu deinem aktuellen std-Printer
haben. Übrigens nRet war glaub ich doch bloß im zweiten Skript dieses ändert ja bloß die
Einstellungen des Druckers und benötigt lediglich den Namen des Druckers. Du solltest eher mal
schauen ob nach der ausführung überhaupt noch ein Standarddrucker ausgewählt ist, wenn nicht
dann passt sicherlich etwas mit dem Namen vom Port nicht!
-
das problem mit dem druckernamen hab ich gelöst der hat anders geheissen!
("\\srveb05\PRT52_EDV").
Ich hab es mir über vba im excel mit application.activeprinter ausgeben lassen das ergebnis war : \\srveb05\PRT52_EDV auf Ne04:
der port müsste dann also Ne04: sein.
Er ist mir das script im notes jetzt komplett durchgelaufen und hab auch keine fehler zurückbekommen nur wen ich dann auf drucken gehe und das ganze ausdrucken möchte dann druckt er es mir nicht so wie es in der maske printadmin eingegeben habe!! Er druckt es mir immer im hochformat.
Wenn ich aber vorher auf querformat umschalte und dann in die erste form gehe wo ich hochformat in der printadmin eingestellt habe dann stellt er um aber wenn ich dann im hochformat bin und dann die zweite form öffne dann wechselt er nicht auf quer!!
Wo kann jetzt der fehler liegen?
-
@mur: Also win2k macht keine Probleme, nach dem ich diesen blöden Übergabeparameter bemerkt habe der wohl noch von dir stammt. Nun ja ich bin nicht unbedingt das genie in Sachen Programmierung aber wenn ich mich nicht verlesen hab müssten die Funktion SendMessage auf NT4 genauso funktionieren wie unter NT5 so I don't know!?!
-
@robertpp:
Ich kann bloß soviel sagen: Bei mir gehts! Hin und Her auch die Papiergröße usw. hatte jetzt zwar auch ein Problem das er mir meinen Standardeinzug nicht mehr geändert hat aber auf meinem zweiten Drucker gings wieder. ???
Angepasst hast du ja wahrscheinlich nichts mehr außer deiner Druckerconfig deswegen! ???
Hier nochmal meine letzte Version der DB da dürfte sich aber kaum bis gar nichts geändert haben!
-
@enny
... das werde ich mir heute Abend mal anschauen...
ata
PS: danke für das umbrechen der LINKS - die Seitenbreite ist wieder normal...
-
Ach ja Ata weil du gerade sagst du willst es auch testen.
Wie ihr wahrscheinlich merken werdet schluckt diese blöde Funktion SendMessage verdammt viele Ressourcen (bzw. ist einfach mit Kanonnen auf Spatzen geschossen).
Deswegen fänd ich es echt cool wenn sich noch jemand finden würde der uns erzählen kann was man der anderen Funktion übergeben muss damit sie funktioniert.
Ich glaube wenn ich das so bei uns implementiere und das ein paar Leute auf Citrix nutzen gibt es dann bei uns in der Firma bald lange Wartezeiten! :-\
-
... einen anderen Weg wie über SendMessage kenne ich auch nicht. Ich habe bei mir noche einen Sleep drin, damit Notes sich noch überlegen kann, ob er alles wahrnehmen will - in Win98 alles noch im grünen Bereich - unter Win2000 habe ich weiterhin Probleme - entgegen den Aussagen, das es funktioniert...
... wenn es aber wo anders funzt, dann müßte das doch zu knacken sein - doch jetzt ist erst mal WE - Familie - gutes Wetter - RELAX
ata
-
@enny, sorry, hat ich vergessen vor dem Speichern zu löschen. Eine andere Möglichkeit als mit SendMessage die Programme zu informieren ist mir nicht bekannt. Im Internet ist auch nur diese SendM.. Möglichkeit zu finden. Ich frag mich auch warum Notes erst auf die zweite SendMessage reagiert. Hat das schon mal jemand mit Notes 6 probiert? Geht's da einfacher?
Es schein auch ein Unterschied zu sein ob Du in der Systemsteuerung den Drucker umstellst oder per Programm. Bei einer Umstellung in der Systemsteuerung reagiert Notes sofort darauf beim Programm nicht. Hat jemand hierfür eine Erklärung? ???
-
@mur: Dafür habe ich eine Erklärung:
Wenn du über die Systemsteuerung den Drucker umstellst übernimmt Windows selber die Aufgabe die Programme davon zu informieren! Wenn du genau aufpasst merkst du das auch, denn die Umstellung dauert auch eine gewisse Zeit und das müsste dann der HWND_Broadcast sein.
Übrigens muss es eine andere Lösung als SendMessage geben. Wenn Du dir mal den Link zur SendMessage Beschreibung bei MSDN anschaust den ich gepostet habe, steht dort nämlich das man gerade für solche Programme, die sowas bloß über Broadcasts verstehen, eine andere Funktion nutzen soll. Ich habe bloß das Problem das ich keine Ahnung hab was ich dieser Funktion übergeben soll!!!
-
Hab' mir die SendMessage nochmal angesehen, dabei ist auch der "HWND_BROADCAST" beschrieben.
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, _
lParam As Any) As Long
Beschreibung:
SendMessage sendet eine Nachricht an ein anderes Fenster und wartet auf eine Antwort. Die Nachricht umgeht die Nachrichtenwarteschlange und wird unmittelbar verarbeitet.
Parameter:
hWnd Das Handle des Fensters, das die Nachricht erhalten soll. Über die Konstante "HWND_BROADCAST" erreicht man, dass diese Nachricht an alle TopLevel-Fenster gesendet wird.
Msg Legt die zu versendende Nachricht fest.
wParam Zusätzliche Informationen über die Fensternachricht in "Msg".
lParam Zusätzliche Informationen über die Fensternachricht in "Msg".
Beispiele und Infos unter: http://www.vbarchiv.net/vbapi/SendMessage.php
Der Link (enny) zu MSDN funktioniert bei mir nicht, werde es später nochmal versuchen, vielleicht findet sich dort noch etwas.
-
Hallo,
da ich mich im letzten Jahr auch mit dem Problem erfolglos rumgeschlagen habe, möchte ich einige Bermerkungen dazu loslassen.
Meiner Meinung nach gibt es keine Möglichkeit, dass der Notes-Client in der Version 5.x richtig auf die Änderung des Standarddruckers reagiert (weder wenn dieser per Hand über die Systemsteuerung noch per Programmbefehl umgestellt wird) - zumindest unter Windows NT und 2000. Liegt wohl daran, dass der Notes-Client eben nicht - oder nicht immer - auf WM_SETTINGCHANGE (alt: WM_WININICHANGE) reagiert. Ich bin mir auch ziemlich sicher, das irgendwo bei Lotus als "eingestandenen Fehler" gelesen zu haben, der ab Version 6 behoben sein soll.
Zu der hier häufig angegeben Methode SendMessage ist zu sagen, dass sie in dem Sinne kein "Ressourcen-Fresser ist", sondern so arbeitet, wie sie eingesetzt wird: Wird als Fenster-Handle HWND_BROADCAST verwendet, werden eben alle Top-Level-Window informiert. Zusätzlich wartet die Methode darauf, bis jedes Top-Level-Window auch die Nachricht verarbeitet hat.
Als Alterrnativen bieten sich an: SendNotifyMessage und SendMessageTimeout. Die erste Methode sendet die Nachricht an alle Fenster ohne auf die Bearbeitung zu warten. Bei der zweiten Methode kann man angeben, wie lange sie jeweils auf die Bearbeitung warten soll.
BOOL SendNotifyMessage(
HWND hWnd, // handle to window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
LRESULT SendMessageTimeout(
HWND hWnd, // handle to window
UINT Msg, // message
WPARAM wParam, // first message parameter
LPARAM lParam, // second message parameter
UINT fuFlags, // send options
UINT uTimeout, // time-out duration
PDWORD_PTR lpdwResult // return value for synchronous call
);
Manfred
-
@manfred
... das ist auch mein Stand der Dinge...
ata
-
Hallo,
hab' noch etwas probiert (auch mit meinem VB Tool) dabei hat sich gezeigt, daß Notes doch mitbekommt wenn der Drucker umgesetzt wird. Allerdings erst nach dem das Script beendet ist.
Probiert mal aus, das Script im Debug laufen lassen, nach dem Umsetzen des Druckers das Script stoppen, nach Notes wechseln und den Ausdruck starten, bei mir war dann der Drucker umgestellt.
Mein Problem ist jetzt, wie halte ich das Script an und gebe Notes für eine Kurze Zeit frei damit die Meldung von SendMessage auch angenommen werden kann. Dann hat auch Notes die Info über die neuen Einstellungen.
Die in der Hilfe beschrieben Yield Funktion läuft bei mir nicht. ???
-
So Leute, ich habe ja gesagt es gibt noch eine andere Möglichkeit als HWND-BROADCASTS an Notes zu schicken und ich habe auch eine gefunden! (Ich werde auf Arbeit nicht um sonst Potter genannt!) ;D
In den Declarations diese Zeile einfügen:
Declare Function GetForegroundWindow Lib "user32" () As Long
-----------------------------------------------------------------------------------------------
und dann in der Funktion zum Drucker wechseln das hier anstatt dem alten SendMessage-Aufruf:
Dim hWndNotes As Long ' Variable für das NotesFenster
' Über die Funktion GetForegroundWindow die HWND des aktuellen Fensters
' (Notes) auslesen
hWndNotes = GetForegroundWindow()
' anschließend die HWND SendMessage übergeben
Call SendMessage(hWndNotes, WM_WININICHANGE, 0, Byval "Windows")
-----------------------------------------------------------------------------------------------
Also es scheind zumindest schneller zu laufen! Ach ja hatte ich eigentlich vergessen zu sagen das ich nie probiert habe aus meiner TestDB gleich nach dem wechsel zu drucken, sondern mir dann lediglich die Einstellungen aus dem Druckmenü angeschaut hab? ::)
Have a lot of fun ...
-
... na das hört sich schon mal anders an - ich gebe dir Bescheid, wenn es damit klappt....
ata
-
Hallo,
wir will der Unterschied nicht einleuchten, ob ich die SendMessage an alle offenen Fenster sende oder nur an das Notes Fenster. Bleibt für mein Verständnis gleich.
@enny, probier doch mal aus aus Deinem Script heraus zu drucken. Das es danach umgestellt würde ja mit meiner Aussage übereinstimmen, daß Notes die SendMessage Anweisung angenommen hat sobald das Script beendet ist.
Oder seit Ihr da anderer Meinung?
muR
-
Änderungen an den globalen Einstellungen sollten immer an alle Anwendungen mitgeteilt werden. Dies sollte zwar zu den Aufgaben eines Betriebssystems gehören, aber Microsoft überlässt es dem Programmierer.
Eine weitere Möglichkeit, das Notes-Fenster zu ermitteln:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (Byval lpClassName As String, Byval lpWindowName As Long) As Long
hWndNotes = FindWindow("NOTES", 0)
Funktioniert auch dann, wenn Notes nicht das "Foreground-Window" ist.
Manfred
-
Hi,
der Vorteil liegt mit Sicherheit darin, daß
Call SendMessage(hWndNotes, WM_WININICHANGE, 0, Byval "Windows")
den Broadcast nur an das fenster schickt, daß es auch angeht und nicht an andere offenen Parent Windows, die damit im Prinzip nix anfangen können.
Die Crux liegt aber woanders:
Alle Script ( VB, VBA und sonstige Arten und somit auch LS ) laufen im Speicher in einem abgeschlossenen Adressbereich.
Auch wenn du API Calls verwendest, werden diese in genau diesem einen bereich ausgeführt. Dann werden aber auch die Prozesse sequentiell abgearbeitet. Daher muß das LS erst beendet werden, bevor der Broadcast ausgeführt wird.
Die vorher schon einmal angesprochene SLEEP Funktion hilft da überhaupt nicht weiter, da sie lediglich ein FREEZEN der weiteren programmausführung bewirkt.
Mit Script wirst du daher nicht weiterkommen, da du dich immer in diesem abgeschlossenen bereich bewegst.
eknori
-
Meiner Meinung nach sind einige Aussagen nicht so ganz richtig:
Änderungen in den globalen Einstellungen gehen selbstverständlich alle derzeit laufenden Anwendungen etwas an. Wie sollen die sonst z.B. auf die Änderung des Standarddruckers reagieren?
Auch der Notes-Client bekommt die Änderung mitgeteilt, unabhängig davon, in welchem Adressbereich SendMessage aufgerufen wird.:
"The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message. "
Manfred
-
Ob man die SendMessage an alle oder nur an Notes sendet kann am diskutieren, ändert aber nichts am Verhalten von Notes.
Notes setzt die Mitteilung von SendMessage nicht um solange das Script läuft. Wie also unterbreche ich das Script, damit Notes die SendMessage Aufforderung verarbeitet?
VB/VBA kann mit eigenen Befehlen den Drucker auswählen mit dem es arbeiten will und muß nicht den Standarddrucker ändern. Notes kann das aber nicht in der 5er Version. Hat jemand Erfahrung mit der 6er Version?
muR
-
... ich wiederhole mich zwar, aber es liegt nicht alleine an Notes, denn unter Win98SE funzt es...
ata
-
Win9x.xx verwendet eine andere Speicherverwaltung als NT, W2K und XP.
-
Mein Vorteil ist das ich Eingabe und Druckmaske in meiner DB habe die ich entwickle. Ich gebe dem User somit in der Eingabemaske lediglich die Möglichkeit sich die Vorschau anzusehen und anschließend müssen Sie dann eben noch einen Button zum Drucken drücken. Ist zwar keine Lösung für das Problem aber damit habe ich dann zwei getrennte Scripts und dann sollte es auch gehen!
-
Ich habe hier noch eine Funktion, die ein SLEEP ohne das komplette Blockieren der weiteren Codebearbeitung ermöglicht.
Declarations:
'********************************************
Const STATUS_TIMEOUT = &H102&
Const INFINITE = -1& ' Infinite interval
Const QS_KEY = &H1&
Const QS_MOUSEMOVE = &H2&
Const QS_MOUSEBUTTON = &H4&
Const QS_POSTMESSAGE = &H8&
Const QS_TIMER = &H10&
Const QS_PAINT = &H20&
Const QS_SENDMESSAGE = &H40&
Const QS_HOTKEY = &H80&
Const QS_ALLINPUT = (QS_SENDMESSAGE Or QS_PAINT _
Or QS_TIMER Or QS_POSTMESSAGE Or QS_MOUSEBUTTON _
Or QS_MOUSEMOVE Or QS_HOTKEY Or QS_KEY)
Declare Function MsgWaitForMultipleObjects Lib "user32" _
(ByVal nCount As Long, pHandles As Long, _
ByVal fWaitAll As Long, ByVal dwMilliseconds _
As Long, ByVal dwWakeMask As Long) As Long
Declare Function GetTickCount Lib "kernel32" () As Long
Code:
' The MsgWaitObj function replaces Sleep,
' WaitForSingleObject, WaitForMultipleObjects functions.
' Unlike these functions, it
' doesn't block thread messages processing.
' Using instead Sleep:
' MsgWaitObj dwMilliseconds
' Using instead WaitForSingleObject:
' retval = MsgWaitObj(dwMilliseconds, hObj, 1&)
' Using instead WaitForMultipleObjects:
' retval = MsgWaitObj(dwMilliseconds, hObj(0&), n),
' where n - wait objects quantity,
' hObj() - their handles array.
Function MsgWaitObj(Interval As Long,hObj As Long,nObj As Long ) As Long
Dim T As Long, T1 As Long
If Interval <> INFINITE Then
T = GetTickCount()
On Error Resume Next
T = T + Interval
' Overflow prevention
If Err <> 0& Then
If T > 0& Then
T = ((T + &H80000000) _
+ Interval) + &H80000000
Else
T = ((T - &H80000000) _
+ Interval) - &H80000000
End If
End If
On Error GoTo 0
' T contains now absolute time of the end of interval
Else
T1 = INFINITE
End If
Do
If Interval <> INFINITE Then
T1 = GetTickCount()
On Error Resume Next
T1 = T - T1
' Overflow prevention
If Err <> 0& Then
If T > 0& Then
T1 = ((T + &H80000000) _
- (T1 - &H80000000))
Else
T1 = ((T - &H80000000) _
- (T1 + &H80000000))
End If
End If
On Error GoTo 0
' T1 contains now the remaining interval part
' ACHTUNG: Fürr LS muß das folgende IIF noch aufgelöst werden
If IIf((T1 Xor Interval) > 0&, _
T1 > Interval, T1 < 0&) Then
' Interval expired
' during DoEvents
MsgWaitObj = STATUS_TIMEOUT
Exit Function
End If
End If
' Wait for event, interval expiration
' or message appearance in thread queue
MsgWaitObj = MsgWaitForMultipleObjects(nObj, _
hObj, 0&, T1, QS_ALLINPUT)
' Let's message be processed
DoEvents
If MsgWaitObj <> nObj Then Exit Function
' It was message - continue to wait
Loop
End Function
-
evtl hilft Euch dieser Link ein bißerl weiter:
http://www.experts-exchange.com/Applications/Email/Lotus_Notes/Q_20506162.html
incl. einer gezippten Bsp DB mit API Calls: http://www.icejersey.com/dev/printerchange.zip
Der Bursch hat es für WinNT/W2k geschafft, allerdings scheint es bei der Combo R6/Win98 Probleme zu geben, nämlich genau der Art wie Ihr sie schon entdeckt habt:
"Wow!! This is proving to be a real pain, the SendMessage call does change the default printer but notes doesn't recognise it. However if you change the default printer manually Notes does recognise the changes.
I am trying out some other things and I think I am getting close, this lot seems to work with windows NT/2000 but Win98 is not playing ball.
I just need to work out what windows98 does after the user changes the default printer manually to see if I can do the same. Soon as I find this out we should be sorted..
Sorry this is taking a while faithsg "
Das war am 28.03.
(Seine Erläuterungen zur DB:
Hi Faithsg,
I have put together a sample of a printer change system
I have had it working on my computer so you shouldn't have any problems using it.
You should be able to copy/paste bits of it into your database; the essential items you need to look at are as follows.
1) Script Library - this holds all the api calls and other goodies and is called "PrinterChange"
2) In the main form you need to look at the form globals, PostOpen event and QueryClose event
3) Lastly you need to see the code behind the two buttons, these buttons call the functions in the script library.
Click on the following link to download example
http://www.icejersey.com/dev/printerchange.zip
Hope this helps, Notes can be a pain to change printers, after looking myself for aaagggeeeessssss I managed to find out that setting the printer to default then back again is the only way to get the job done.
One last thing, you need to be on Notes 5.0.10 or later for this to work, if your on a lower version you have do an incremental upgrade by visiting the notes website, look out for MR (Maintanance release).
Good luck, Joe.)
-
Ich konnte mir die Datei leider nicht runterladen aber kann mir mal jemand sagen ob er vielleicht im PostOpen bereits den Drucker umstellt denn dann wär das nichts neues. Das wollte ich ja auch so lösen. Beim öffnen den Drucker umstellen und dann die User über einen Button drucken lassen. Wo wir wieder bei dem Thema wären das es zwei von einander getrennte Skripts währen!
-
YEAH, das funzt bei mir ( momentan NT4 SP 6a und Client 5.0.11 ) :D :D :D
Kommando zurück :'( :'( :'( :'(
Das funktioniert nur, wenn man das SetDefault Printer und Print Kommando trennt.
In einer Aktion klappt das nicht. Also nichts neues
Nachtrag:
scheint wohl probleme mit dem DL zu geben, daher hier die Datei:
-
und was ist daran so schlimm, eknori, daß die User 2 Fingerbewegungen machen müssen, statt einer? Oder stört das irgendwie einen Ablauf groß?
Und wie sieht es mit der Timer Klasse aus...kann man da Notes "zeit" geben, die Änderungen mitzubekommen und dann den Prozess weiter anschieben?
Achsoo...eigentlich wollt ich nur die Datei attachen..siehe unten
-
@RobGreen:
ne, ich finde das nicht schlimm, aber dann kann ich auch gleich den normalen Druckerdialog verwenden.
Es geht ja in der Hauptsache darum ( wenn ich das richtig verstanden habe) den einzelnen Dokumenten mitzugeben, auf welchem Drucker sie ausgedruckt werden sollen. Und da kannst du natürlich keine Interaktion gebrauchen.
Eine Idee wäre noch, die beiden Aktionen in 2 Agenten zu stecken und dann durch einen dritten agenten aufrufen zu lassen.
Möglicherweise reicht diese trennung schon aus, damit Notes den Change mitbekommt.
Ulrich
-
... das ist natürlich auch noch eine Idee - werde ich checken...
ata
-
@Rob Green:
Wie eknori sagt eigentlich wollte ich keine Benutzerinteraktion und es tatsächlich erst beim drücken des Buttons umstellen. Aber ich bin mittlerweile auch schon so weit zu sagen: Meine User sind sonst keine PowerUser und haben dementsprechend eigentlich nicht zwei Unterschiedliche Masken im Einsatz also wird bei mir jetzt der Drucker via PostOpen Event umgestellt und anschließend kann der User über einen Button ausdrucken.
-
Laut Notes-Fixliste soll es ab der Version 5.0.10 funktionieren, dass der Notes-Client Änderungen des Standarddrucker berücksichtigt:
SPR# HYAI4LR8WS - Fixed a problem which caused default printer changes not to be recognized by the Notes client. This regression was introduced in 5.0.
-
Naja ich hab die 5.0.10 aber das hilft auch nicht wirklich!
-
Dann gehört 5.0.11 auch nicht zu einer Version die nach 5.0.10 kommt. >:(
-
;D ;D ;D ;D 8) 8) ;D ;D ;D