Wenn man per SetDefaultlPrinter den Windows Printer wechselt, muss man die Funktion SendMessageTimeout aufrufen.
Die Funktion SendMessageTimeout hat nichts mit sleep() zu tun, sondern sendet ein Nachricht an alle Windows Fenster (Prozesse), und teilt mit, dass sich die Systemkonfigurtion geändert hat. Somit bekommen alle Windows Fenster (Prozesse) mit, dass sich er Defaultdrucker geändert hat.
Die Wartezeit in SendMessageTimeout gibt nur an, dass die Funktion längstens x Millisekunden wartet, bis sie die Kontrolle zurückgibt. Wenn die Prozesse schnell genug reagieren, kommt die Funktion auch schneller zurück.
Hier mein Code mit Default Printer setzen. Der Code sieht vielleicht etwas ungewohnt aus, das liegt am Präprozessor.
Code: Alles auswählen
function _dms_wDefPrt
// Default Printer lesen oder setzen
parameter _defprt
if empty( _defprt )
// Lokale Variablen
private _defprt := space( 0x200 )
private _defprtlen := len( _defprt )
// Default Printer ermitteln
dllCall( ;
"winspool.drv", ;
32, ;
"GetDefaultPrinterA", ;
@_defprt, ;
@_defprtlen ;
)
_defprt := left( _defprt, at( chr( 0 ), _defprt ) -1 )
else
// Default Printer setzen
dllCall( ;
"winspool.drv", ;
32, ;
"SetDefaultPrinterA", ;
@_defprt ;
)
// Windows den Wechsel mitteilen
dllCall( ;
"user32.dll", ;
32, ;
"SendMessageTimeoutA", ; // Sends the specified message to one or more windows.
0xffff, ; // HWND_BROADCAST ((HWND)0xffff), the message is sent to all top-level windows in the system.
0x001a, ; // UINT The message to be sent. Applications should send WM_SETTINGCHANGE to all top-level windows when they make changes to system parameters.
0x0000, ; // WPARAM Any additional message-specific information.
0x0000, ; // LPARAM Any additional message-specific information.
0x0000, ; // UINT The behavior of this function. SMTO_NORMAL The calling thread is not prevented from processing other requests while waiting for the function to return.
2000, ; // UINT The duration of the time-out period, in milliseconds.
nil ; // PDWORD The result of the message processing.
)
endif
return _defprt
Grüße
Ulrich