2009-03-30 4 views
1

J'ai une application Visual Basic 6.0 qui doit reconnaître lorsque l'utilisateur change l'imprimante par défaut de Windows via le Panneau de configuration.Comment reconnaissez-vous lorsque l'utilisateur a modifié l'imprimante par défaut de Windows dans Visual Basic 6.0?

Lorsque l'application démarre, "Printer.DeviceName" contient le nom d'imprimante par défaut ... easy.

Si vous modifiez ensuite l'imprimante par défaut de Windows via le panneau de configuration, votre application Visual Basic ne reconnaîtra pas la nouvelle valeur par défaut tant qu'elle n'est pas redémarrée.

Est-il possible d'actualiser l'objet Visual Basic Printer de sorte que votre application puisse reconnaître le changement?

Répondre

9

Il y a un moyen plus facile. Lorsque votre application démarre, définissez la propriété TrackDefault de l'objet Printer sur True.

Public Sub Main() 

    Printer.TrackDefault = True 

End Sub 

Lorsque la propriété TrackDefault est True, l'objet Printer permettra de suivre les modifications à l'imprimante par défaut fait par le panneau de configuration automatique.

+0

C'est PrintER.TrackDefault. Merci! Je ne savais pas à ce sujet. (Impossible de modifier cela mais quelqu'un qui peut, s'il vous plaît faire.) –

+0

Belle idée mais dans mon expérience, il ne fonctionne pas (bug dans VB6) voir ma réponse – MarkJ

+0

Oh mon dieu, je voudrais pouvoir éditer mes anciens commentaires. Ce que je voulais dire, c'est qu'il y a un getcha. Si vous modifiez l'un des paramètres de l'imprimante via l'objet Imprimante, il réinitialise Printer.TrackDefault sur False. Je suppose que c'est évident si vous y réfléchissez. Je vais retourner dans mon trou maintenant. – MarkJ

0

Vous pouvez ajouter un objet Temporisateur sur le formulaire, avec un déclencheur de 10 secondes qui vérifie si l'imprimante a changé.

+0

Yeh - merci, mais malheureusement l'objet imprimante de VB n'est pas rafraîchi, donc il me dit toujours que l'imprimante est comme elle était, quand l'application a démarré. –

3

J'ai trouvé une solution. Utilisez l'appel d'API comme suit.

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 

Merci à http://www.andreavb.com/tip070005.html

Questions connexes