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