Win: Setting default printer

Just starting out? Need help? Post your questions and find answers here.
jesperbrannmark
Enthusiast
Enthusiast
Posts: 536
Joined: Mon Feb 16, 2009 10:42 am
Location: sweden
Contact:

Win: Setting default printer

Post by jesperbrannmark »

Hi.
I've been sitting for two days now, so now its time to ask for some help.
I want to set default printer without any user dialogue, and then print a webgadget.

I can set the default printer, remove the IE header and footer and set the margins.
Now.... I want to set paper size to A5 and page orientation to landscape. Can someone please help me?


I have seen people do similar things, but there is a great differance - I try to alter IE settings and default printer - they try to open a printer, set settings, print a page and then close the printer.
I dont do any openprinter, openpage, endpage, endprint etc..

To print the webgadget i use:

Code: Select all

#OLECMDEXECOPT_DONTPROMPTUSER   = 2
#OLECMDID_PRINT             = 6

Procedure.s GetKeyString(HKEY_Folder.l, key.s, Subkey.s)
  Protected OpenKey.l, Type.l, cbData.l, *lpbData, ReturnValue.s
  cbData = (#MAX_PATH * 2) + 2
  *lpbData = AllocateMemory(cbData)
  If RegOpenKeyEx_(HKEY_Folder, key, 0, #KEY_ALL_ACCESS, @OpenKey) = #ERROR_SUCCESS
    If RegQueryValueEx_(OpenKey, Subkey, 0, @Type, *lpbData, @cbData) = #ERROR_SUCCESS
      If Type = #REG_SZ
        ReturnValue = PeekS(*lpbData)
      EndIf
    EndIf
    RegCloseKey_(OpenKey)
  EndIf
  FreeMemory(*lpbData)
  ProcedureReturn ReturnValue
EndProcedure
Procedure.l SetKeyString(HKEY_Folder.l, key.s, Subkey.s, Value.s)
  Protected OpenKey.l, ReturnValue.l
  If RegOpenKeyEx_(HKEY_Folder, key, 0, #KEY_ALL_ACCESS, @OpenKey) = #ERROR_SUCCESS
    If RegSetValueEx_(OpenKey, Subkey, 0, #REG_SZ, @Value, Len(Value) + 1) = #ERROR_SUCCESS
      ReturnValue = #True
    EndIf
    RegCloseKey_(OpenKey)
  EndIf
  ProcedureReturn ReturnValue
EndProcedure
Procedure ModifyIEHeaderFooter(State.l) ; #TRUE : modify , #FALSE : reverse to original
  Static FirstTime.l, IEHeader.s, IEFooter.s, IELeft.s, IERight.s, IEBottom.s
  If FirstTime = 0
    IEHeader = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "header") ; default : "&w&bPage &p de &P"
    IEFooter = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "footer") ; default : "&u&b&d"
    IELeft = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_left") ; default : "0.750000"
    IERight = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_right") ; default : "0.750000"
    IEBottom = GetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_bottom") ; default : "0.750000"
    FirstTime = 1
  EndIf
  If State = #True
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "header", "")
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "footer", "")
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_left", "0.400000")
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_right", "0.400000")
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_bottom", "0.500000")
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_bottom", "0.500000")
  Else
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "header", IEHeader)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "footer", IEFooter)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_left", IELeft)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_right", IERight)
    SetKeyString(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\PageSetup", "margin_bottom", IEBottom)
  EndIf
EndProcedure
Procedure SetDefaultPrinter(DeviceLine.s)
  WriteProfileString_("windows", "Device", DeviceLine)
  SendMessage_(#HWND_BROADCAST, #WM_WININICHANGE, 0, "windows")
EndProcedure
Procedure.s GetDefaultPrinter()
  If OpenLibrary(0, "winspool.drv")
    bufferSize.l    = 255
    defaultPrinter$ = Space(bufferSize)    
    If CallFunction(0, "GetDefaultPrinterA", @defaultPrinter$, @bufferSize)
      ProcedureReturn defaultPrinter$
    EndIf      
    CloseLibrary(0)
  EndIf
  ProcedureReturn ""
EndProcedure
Procedure printurl(url.s,gadget.l,printer.s)
  HideGadget(gadget.l,0)
  printerbefore.s=GetDefaultPrinter()
  SetDefaultPrinter(printer)
  SetGadgetText(gadget, url.s)
  WebObject.IWebBrowser2 = GetWindowLong_(GadgetID(gadget), #GWL_USERDATA)    
  Repeat    
    Delay(20)
    While WindowEvent(): Wend
  Until GetGadgetText(gadget)=url
  Repeat
    WebObject\get_Busy(@IsBusy.l)
    Delay(20)
    While WindowEvent(): Wend
  Until IsBusy = 0
  
  ModifyIEHeaderFooter(#True)
  WebObject\ExecWB(#OLECMDID_PRINT, #OLECMDEXECOPT_DONTPROMPTUSER, 0, 0)
  ModifyIEHeaderFooter(#False)
  If printerbefore<>""
    setdefaultprinter(printerbefore)  
  EndIf
  HideGadget(gadget,1)
EndProcedure

OpenWindow(0,0,0,400,100,"")
WebGadget(0,100,100,100,100,"about:") ;this one is just luking until we finally gonna print
ComboBoxGadget(1,0,0,200,50)
ButtonGadget(2,200,0,50,50,"OK",#PB_Button_Default)
Buffersize.l  = 8102
*Buffer       = AllocateMemory(Buffersize)
TempPrinter.s = Space(1024)

If GetProfileString_("devices",0,"",*Buffer,Buffersize)
  TempString.s = PeekS(*Buffer)
  Length = Len(TempString)
  While TempString <> ""    
    GetPrivateProfileString_("devices",TempString,"",TempPrinter,1024,"Win.Ini")
    AddGadgetItem(1,-1,TempString+","+StringField(TempPrinter,1,",")+","+StringField(TempPrinter,2,","))
    TempString = PeekS(*Buffer+Length + 1)
    Length = Length + Len(TempString) + 1
  Wend
Else
  MessageRequester("Error","No printer installed")
EndIf

FreeMemory(*buffer)
SetGadgetState(1,0)
HideGadget(0,1)
Repeat
  a=WindowEvent()
  If a=#PB_Event_CloseWindow
    End
  ElseIf a=#PB_Event_Gadget And EventGadget()=2
    printurl("http://purebasic.com",0,GetGadgetText(1))
    End
  EndIf
  Delay(10)
ForEver
TerryHough
Enthusiast
Enthusiast
Posts: 781
Joined: Fri Apr 25, 2003 6:51 pm
Location: NC, USA
Contact:

Re: Win: Setting default printer

Post by TerryHough »

I hope you have already been successful solving your problem.

Not sure this will help, but here is a routine I used to do something similar to automatically print a webpage or a local HTML file. It utilizes the WebGadget and Print Preview, switches to Landscape and then prints. Maybe you can do something similar to also set your paper size.

NOTE: Sometimes the presented Print Dialog's Print button does not have the Alt-P hot key enabled. In that case it fails to automatically print. I don't know why the Print Preview's Print Dialog sometimes drops the Alt-P hotkey for the Print button.

Code: Select all

; HTML_Report    written by TerryHough
; Version 10.0.000 11/04/2010

Procedure SendKeys(handle,window$,keys$)
  If window$<>"" : handle=FindWindow_(0,window$) : EndIf ; Use window$ instead of handle.
  If IsWindow_(handle)=0 ; Does the target window actually exist?
    ProcedureReturn 0 ; Nope, so report 0 for failure to type.
  Else
    ; This block gives the target window the focus before typing.
    thread1=GetWindowThreadProcessId_(GetForegroundWindow_(),0)
    thread2=GetWindowThreadProcessId_(handle,0)
    If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf
    SetForegroundWindow_(handle) ; Target window now has the focus for typing.
    Delay(125) ; 1/8 second pause before typing, to prevent fast CPU problems.
    ; Now the actual typing starts.
    For r=1 To Len(keys$)
      vk$=Mid(keys$,r,1)
      If vk$="{" ; Special key found.
        s=FindString(keys$,"}",r+1)-(r+1) ; Get length of special key.
        s$=Mid(keys$,r+1,s) ; Get special key name.
        notakey=#False
        Select s$ ; Get virtual key code of special key.
          Case "ALTDOWN" : alted = 1 : keybd_event_(#VK_MENU,0,0,0) ; Hold ALT down.
          Case "ALTUP" : alted = 0 : keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT.
          Case "BACKSPACE" : vk=#VK_BACK
          Case "CONTROLDOWN" : ctrled = 1 : keybd_event_(#VK_CONTROL,0,0,0) ; Hold CONTROL down.
          Case "CONTROLUP" : ctrled = 0 : keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL.
          Case "DELETE" : vk=#VK_DELETE
          Case "DOWN" : vk=#VK_DOWN
          Case "END" : vk=#VK_END
          Case "ENTER" : vk=#VK_RETURN
          Case "F1" : vk=#VK_F1
          Case "F2" : vk=#VK_F2
          Case "F3" : vk=#VK_F3
          Case "F4" : vk=#VK_F4
          Case "F5" : vk=#VK_F5
          Case "F6" : vk=#VK_F6
          Case "F7" : vk=#VK_F7
          Case "F8" : vk=#VK_F8
          Case "F9" : vk=#VK_F9
          Case "F10" : vk=#VK_F10
          Case "F11" : vk=#VK_F11
          Case "F12" : vk=#VK_F12
          Case "ESCAPE" : vk=#VK_ESCAPE
          Case "HOME" : vk=#VK_HOME
          Case "INSERT" : vk=#VK_INSERT
          Case "LEFT" : vk=#VK_LEFT
          Case "PAGEDOWN" : vk=#VK_NEXT
          Case "PAGEUP" : vk=#VK_PRIOR
          Case "PRINTSCREEN" : vk=#VK_SNAPSHOT
          Case "RETURN" : vk=#VK_RETURN
          Case "RIGHT" : vk=#VK_RIGHT
          Case "SHIFTDOWN" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down.
          Case "SHIFTUP" : shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT.
          Case "TAB" : vk=#VK_TAB
          Case "UP" : vk=#VK_UP
          Default
            notakey = #True
        EndSelect
        If notakey=#False
          If Left(s$,3)<>"ALT" And Left(s$,7)<>"CONTROL" And Left(s$,5)<>"SHIFT"
            keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the special key.
          EndIf
          r=r+s+1 ; Continue getting the keystrokes that follow the special key.
        Else
          vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found
          keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key.
        EndIf
      Else
        ;LoadKeyboardLayout_("000040c",#KLF_ACTIVATE|#KLF_REORDER)
        vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found
        If (vk&$0100)<>0 And shifted = 0 : keybd_event_(#VK_SHIFT,0,0,0) : EndIf ; Due to shifted character.
        If (vk&$0200)<>0 And ctrled = 0 :  keybd_event_(#VK_CONTROL,0,0,0) : EndIf
        If (vk&$0400)<>0 And alted = 0 :   keybd_event_(#VK_MENU,0,0,0) : EndIf
        keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key.
        If (vk&$0100)<>0 And shifted = 0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) : EndIf ; Due to shifted character.
        If (vk&$0200)<>0 And ctrled = 0  : keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) : EndIf
        If (vk&$0400)<>0 And alted = 0   : keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) : EndIf
      EndIf
    Next
    
    If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf ; Finished typing to target window!
    keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key if user forgot.
    keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key if user forgot.
    keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key if user forgot.
    ProcedureReturn 1 ; Report successful typing! :)
  EndIf
EndProcedure

; Constants for the ExecWB Method:
#OLECMDID_OPEN              = 1
#OLECMDID_NEW               = 2
#OLECMDID_SAVE              = 3
#OLECMDID_SAVEAS            = 4
#OLECMDID_SAVECOPYAS        = 5
#OLECMDID_PRINT             = 6
#OLECMDID_PRINTPREVIEW      = 7
#OLECMDID_PAGESETUP         = 8
#OLECMDID_SPELL             = 9
#OLECMDID_PROPERTIES        = 10
#OLECMDID_CUT               = 11
#OLECMDID_COPY              = 12
#OLECMDID_PASTE             = 13
#OLECMDID_PASTESPECIAL      = 14
#OLECMDID_UNDO              = 15
#OLECMDID_REDO              = 16
#OLECMDID_SELECTALL         = 17
#OLECMDID_CLEARSELECTION    = 18
#OLECMDID_ZOOM              = 19
#OLECMDID_GETZOOMRANGE      = 20
#OLECMDID_UPDATECOMMANDS    = 21
#OLECMDID_REFRESH           = 22
#OLECMDID_STOP              = 23
#OLECMDID_HIDETOOLBARS      = 24
#OLECMDID_SETPROGRESSMAX    = 25
#OLECMDID_SETPROGRESSPOS    = 26
#OLECMDID_SETPROGRESSTEXT   = 27
#OLECMDID_SETTITLE          = 28
#OLECMDID_SETDOWNLOADSTATE  = 29
#OLECMDID_STOPDOWNLOAD      = 30

#OLECMDID_ONTOOLBARACTIVATED     = 31
#OLECMDID_FIND                   = 32
#OLECMDID_DELETE                 = 33
#OLECMDID_HTTPEQUIV              = 34
#OLECMDID_HTTPEQUIV_DONE         = 35
#OLECMDID_ENABLE_INTERACTION     = 36
#OLECMDID_ONUNLOAD               = 37
#OLECMDID_PROPERTYBAG2           = 38
#OLECMDID_PREREFRESH             = 39
#OLECMDID_SHOWSCRIPTERROR        = 40
#OLECMDID_SHOWMESSAGE            = 41
#OLECMDID_SHOWFIND               = 42
#OLECMDID_SHOWPAGESETUP          = 43
#OLECMDID_SHOWPRINT              = 44
#OLECMDID_CLOSE                  = 45
#OLECMDID_ALLOWUILESSSAVEAS      = 46
#OLECMDID_DONTDOWNLOADCSS        = 47
#OLECMDID_UPDATEPAGESTATUS       = 48
#OLECMDID_PRINT2                 = 49
#OLECMDID_PRINTPREVIEW2          = 50
#OLECMDID_SETPRINTTEMPLATE       = 51
#OLECMDID_GETPRINTTEMPLATE       = 52
#OLECMDID_PAGEACTIONBLOCKED      = 55
#OLECMDID_PAGEACTIONUIQUERY      = 56
#OLECMDID_FOCUSVIEWCONTROLS      = 57
#OLECMDID_FOCUSVIEWCONTROLSQUERY = 58

#OLECMDEXECOPT_DODEFAULT        = 0
#OLECMDEXECOPT_PROMPTUSER       = 1
#OLECMDEXECOPT_DONTPROMPTUSER   = 2
#OLECMDEXECOPT_SHOWHELP         = 3


#Window = 0
#my_Webgadget = 1
#my_ProgBarGadget  = 2
#my_TextGadget = 3

;Result$ = ProgramParameter()
Result$= "http://www.purebasic.com"

hWnd = OpenWindow(#Window,0,0,0,0,"HTML View Webgadget",#PB_Window_SystemMenu|#PB_Window_Maximize)
LockWindowUpdate_(hWnd)
If hWnd
  WebGadget(#my_Webgadget,10,30,WindowWidth(#Window)-20,WindowHeight(#Window)-40,Result$)
  HideGadget(#my_Webgadget,#True)
    
  Repeat
    Event= WaitWindowEvent()
    Select Event
      Case  #PB_Event_Gadget
        Select EventGadget()
          Case #my_Webgadget
            Select EventType()
                
              Case #PB_EventType_DownloadStart
                
              Case #PB_EventType_DownloadEnd
                If GetGadgetText(#my_Webgadget) = "about:blank" ; throw away any blank pages in webgadget
                  Continue
                EndIf   
                Loaded.l = #True
                LockWindowUpdate_(#Null)
                WebObject.IWebBrowser2 = GetWindowLong_(GadgetID(#my_Webgadget), #GWL_USERDATA)
                Repeat
                  WebObject\get_Busy(@IsBusy.l)
                  Delay(1)
                Until IsBusy = 0
                While WindowEvent(): Wend
                WebObject\ExecWB(#OLECMDID_PRINTPREVIEW, #OLECMDEXECOPT_DONTPROMPTUSER, 0, 0)
                Repeat
                  WebObject\get_Busy(@IsBusy.l)
                  Delay(1)
                Until IsBusy = 0
                While WindowEvent(): Wend
                
                hInput.l = FindWindow_(0,"Print Preview")    ; Find the print preview window
                If hInput
                  results = SendKeys(hInput,"","{ALTDOWN}W") ; Alt-W = View full width
                  results = SendKeys(hInput,"","{ALTDOWN}L") ; Alt-L = View landscape
                  results = SendKeys(hInput,"","{ALTDOWN}P") ; Alt-P = Pop up the print dialog
                  results = SendKeys(hInput,"","{ALTDOWN}P") ; Alt-P = Send print command to print dialog
                EndIf
                
            EndSelect
        EndSelect
    EndSelect
    If Loaded = #True And FindWindow_(0,"Print Preview") = 0
      Quit.l = #True
    EndIf
  Until Event = #PB_Event_CloseWindow Or Quit = #True
EndIf
jesperbrannmark
Enthusiast
Enthusiast
Posts: 536
Joined: Mon Feb 16, 2009 10:42 am
Location: sweden
Contact:

Re: Win: Setting default printer

Post by jesperbrannmark »

I see what the code is trying to do. I have found a code that is supposed to do exactly what I am looking for. Its for VB6, and I will try to adapt it over the comming days. If someone beats me to it, i dont mind ;-)
http://www.bigresource.com/Tracker/Track-vb-tGoHxgOuN6/ (see the attached file at the last post)
Post Reply