2009-03-30 6 views
1

Ich habe eine Visual Basic 6.0 Anwendung, die erkennen muss, wenn der Benutzer den Windows-Standarddrucker über die Systemsteuerung ändert.Wie erkennen Sie, wenn der Benutzer den Windows-Standarddrucker in Visual Basic 6.0 geändert hat?

Jetzt, wenn die Anwendung gestartet wird, enthält "Printer.DeviceName" diesen Standarddruckernamen ... einfach.

Wenn Sie dann den Windows-Standarddrucker über das Bedienfeld ändern, erkennt Ihre Visual Basic-Anwendung den neuen Standard erst nach einem Neustart.

Gibt es eine Möglichkeit, das Visual Basic-Druckerobjekt irgendwie zu aktualisieren, damit Ihre Anwendung die Änderung erkennen kann?

Antwort

9

Es gibt einen einfacheren Weg. Wenn Ihre Anwendung gestartet wird, legen Sie einfach die Objekt TrackDefault -Eigenschaft auf True.

Public Sub Main() 

    Printer.TrackDefault = True 

End Sub 

Wenn die TrackDefault Eigenschaft ist True, das Printer Objekt Änderungen an den Standarddrucker verfolgt automatisch die Systemsteuerung gemacht durch.

+0

Es ist PrintER.TrackDefault. Vielen Dank! Wusste das nicht. (Kann nicht bearbeiten, aber jemand, der kann, bitte.) –

+0

Schöne Idee, aber meiner Erfahrung nach funktioniert es nicht (Bug in VB6) siehe meine Antwort – MarkJ

+0

Oh, ich wünschte, ich könnte meine alten Kommentare bearbeiten. Was ich sagen wollte, ist, dass es ein Problem gibt. Wenn Sie eine der Druckereinstellungen über das Printer-Objekt ändern, wird Printer.TrackDefault auf False zurückgesetzt. Ich nehme an, es ist offensichtlich, wenn Sie darüber nachdenken. Ich werde jetzt zurück in mein Loch gehen. – MarkJ

0

Sie könnten ein Timer-Objekt auf dem Formular hinzufügen, mit einem 10-Sekunden-Trigger, der prüft, ob der Drucker geändert wurde.

+0

Yeh - danke, aber leider VB Printer Objekt wird nicht aktualisiert, so dass es immer noch sagt mir, dass der Drucker ist wie es war, als die App gestartet wurde. –

3

Ich fand eine Lösung. Verwenden Sie den API-Aufruf wie folgt;

Private Declare Function GetProfileString Lib "kernel32.dll" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long 


Public Function GetDefaultPrinter() As Printer 

    Dim strBuffer As String * 254 
    Dim iRetValue As Long 
    Dim strDefaultPrinterInfo As String 
    Dim tblDefaultPrinterInfo() As String 
    Dim objPrinter As Printer 

    ' Retreive current default printer information 
    iRetValue = GetProfileString("windows", "device", ",,,", strBuffer, 254) 
    strDefaultPrinterInfo = Left(strBuffer, InStr(strBuffer, Chr(0)) - 1) 
    tblDefaultPrinterInfo = Split(strDefaultPrinterInfo, ",") 
    For Each objPrinter In Printers 
     If objPrinter.DeviceName = tblDefaultPrinterInfo(0) Then 
      ' Default printer found ! 
      Exit For 
     End If 
    Next 

    ' If not found, return nothing 
    If objPrinter.DeviceName <> tblDefaultPrinterInfo(0) Then 
     Set objPrinter = Nothing 
    End If 

    Set GetDefaultPrinter = objPrinter 

End Function 

Dank http://www.andreavb.com/tip070005.html

Verwandte Themen