set default printer

I need to create an app in VB.NET that will allow me to change the Default Printer in the Windows 2000 Control Panel.  It is not sufficient to just select a printer to print to for the duration of the program.

Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

TimCotteeHead of Software ServicesCommented:
Hi TomDavie,

You need to close some of your open questions. Failure to maintain your questions is a violation of the member agreement and may lead to your suspension or termination of your account. A guideline of 5 open questions is considered acceptable and you currently have 7.

7 open questions:
11/06/03 "set default printer"
08/20/03 "Need to create a linked document or a sh..."
08/13/03 "Extracting email addresses from Microsof..."
07/23/03 "Using VBA (Word 2000).  Want to use a wi..."
06/05/03 "Cannot output to variables"
06/05/03 "Cannot insert a variable into a select s..."
05/14/03 "Error message obtained while rolling out..."

Brainbench MVP for Visual Basic
TomDavieAuthor Commented:
Hi. Sorry about that.  I've closed six of the questions and posted comments where appropriate.
Determine the Perfect Price for Your IT Services

Do you wonder if your IT business is truly profitable or if you should raise your prices? Learn how to calculate your overhead burden with our free interactive tool and use it to determine the right price for your IT services. Download your free eBook now!

TomDavieAuthor Commented:
the code needs to be compatible with VB.NET.  I have code for VB5 and VB6 but does anybody know if this will be compatible with VB.NET?
Than you should post in .NET Area
This will show all the available printer

To set default printer, you need to access the registry

HKEY_CURRENT_USER/Printers/DevModes2 for winxp

~ fantasy ~
I found this code some time ago.  I really don't remember where I got it.  Copy it into a module, then call it like this:

On your form, put a listbox.  In Form Load, put
ProfileLoadWinIniList Me.lstPrinters, "PrinterPorts"

Then set the listbox Click event:
Private Sub lstPrinters_Click()
    SetDefaultPrinterWinNT (lstPrinters.List(lstPrinters.ListIndex))
End Sub

Private Sub SetDefaultPrinter(ByVal PrinterName As String, _
                              ByVal DriverName As String, _
                              ByVal PrinterPort As String)
   Dim DeviceLine As String
  'rebuild a valid device line string
   DeviceLine = PrinterName & "," & DriverName & "," & PrinterPort
  'Store the new printer information in the
  '[WINDOWS] section of the WIN.INI file for
  'the DEVICE= item
   Call WriteProfileString("windows", "Device", DeviceLine)
  'Cause all applications to reload the INI file
   Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, ByVal "windows")
End Sub

Private Sub GetDriverAndPort(ByVal Buffer As String, _
                             DriverName As String, _
                             PrinterPort As String)

   Dim posDriver As Long
   Dim posPort As Long
   DriverName = ""
   PrinterPort = ""

  'The driver name is first in the string
  'terminated by a comma
   posDriver = InStr(Buffer, ",")
   If posDriver > 0 Then

     'Strip out the driver name
      DriverName = Left(Buffer, posDriver - 1)

     'The port name is the second entry after
     'the driver name separated by commas.
      posPort = InStr(posDriver + 1, Buffer, ",")

      If posPort > 0 Then
        'Strip out the port name
         PrinterPort = Mid(Buffer, posDriver + 1, posPort - posDriver - 1)
       End If
   End If
End Sub

Public Function ProfileLoadWinIniList(LST As ListBox, lpSectionName As String) As Long

'Load the data from win.ini.

   Dim success As Long
   Dim nSize As Long
   Dim lpKeyName As String
   Dim ret As String
  'call the API passing null as the parameter
  'for the lpKeyName parameter. This causes
  'the API to return a list of all keys under
  'that section. Pad the passed string large
  'enough to hold the data. Adjust to suit.
   ret = Space$(8102)
   nSize = Len(ret)
   success = GetProfileString(lpSectionName, _
                              vbNullString, _
                              "", _
                              ret, _
  'The returned string is a null-separated
  'list terminated by a pair of null characters.
   If success Then
        iCurrentPrinter = 1
     'trim terminating null and trailing spaces
      ret = Left$(ret, success)
        'with the resulting string,
        'extract each element
         Do Until ret = ""
           'strip off an item and
           'add the item to the listbox
            lpKeyName = StripNulls(ret)
'            If InStr(UCase$(lpKeyName), "SI") > 0 Then
'                sPrinterArray(iCurrentPrinter) = lpKeyName
'                iCurrentPrinter = iCurrentPrinter + 1
'                If iCurrentPrinter > MAXPRINTERS Then
'                    Exit Do
'                End If
                LST.AddItem lpKeyName
'            End If
   End If
  'return the number of items as an
  'indicator of success
   ProfileLoadWinIniList = iCurrentPrinter - 1

End Function

Private Function StripNulls(startstr As String) As String

 'Take a string separated by chr$(0)
 'and split off 1 item, shortening the
 'string so next item is ready for removal.
  Dim pos As Long

  pos = InStr(startstr$, Chr$(0))
  If pos Then
      StripNulls = Mid$(startstr, 1, pos - 1)
      startstr = Mid$(startstr, pos + 1, Len(startstr))
  End If

End Function

Public Sub SetDefaultPrinterWinNT(PrinterName As String)
' modified CRS 08/05 to pass the printer name in

   Dim Buffer As String
   Dim DeviceName As String
   Dim DriverName As String
   Dim PrinterPort As String
'   Dim PrinterName As String
   Dim r As Long
'   If List1.ListIndex > -1 Then
     'Get the printer information for the currently selected
     'printer in the list. The information is taken from the
     'WIN.INI file.
      Buffer = Space(1024)
'      PrinterName = List1.Text
      Call GetProfileString("PrinterPorts", _
                             PrinterName, "", _
                             Buffer, Len(Buffer))
     'Parse the driver name and port name out of the buffer
      GetDriverAndPort Buffer, DriverName, PrinterPort

      If DriverName <> "" And PrinterPort <> "" Then
'         SetDefaultPrinter List1.Text, DriverName, PrinterPort
         SetDefaultPrinter PrinterName, DriverName, PrinterPort
      End If
'    End If
End Sub
'--end block--'


Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
TomDavieAuthor Commented:
The accepted soultion closely matched some code I had already found on the

All I had to do was adapt the code for VB.NET
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic Classic

From novice to tech pro — start learning today.