
PPRTR32  DLL                 The real deal.
README   32                  self-reference (this).

VB       ZIP                 Visual Basic 4.0 sample
PB       ZIP                 PowerBuilder 5.0 sample

DM32     TXT                 device mode definitions from C header file.
DEVCAP   TXT                 device cap definitions from C hdr file.
PPRTR32  LIB                 Import library for C.

FUNCS    TXT                 C, VB, PB function prototypes

CREDIT   TXT                 Information about credit card purchases

-------------------------------------------------------------------

functions:

    PPrtr -- allows retrieval or change to any attribute of the default
             printer

    DefPrtr -- allows you to find out or change the default printer

    Prtrs -- returns semi-colon delimeted list of available active
             printers

    PrtrCap -- returns structure (VB type) containing default printer
               device capabilities

    GetPrtr -- returns the name of the current default printer

    GetPort -- returns the port of the current default printer

    PPGetDriver -- returns the port of the current default printer

    SetuPP -- pops up the printer's setup dialog (for those who
              don't like the common dialog)

    PPReady -- checks selected LPT for ready condition

    PPDefReady -- checks current Windows default printer port
                  for ready condition

    PPGetSizes -- returns paper, page and margin dimensions...
                  for calculating unprintable margins and printable
                  area

    PPSetupFileName  - establishes a filename as the printer output
                       destination
    PPRemoveFileName - removes that filename from WIN.INI (cleanup)

    PPResetDC - provides capability of making any pprtr() type changes,
                e.g. orientation, bin, etc, on the fly within a
                document, so that, for instance different pages could
                have different orientations.

-----------------------------------------------------------------------
*
 *   NOTE: * integers have been changed to longs lots of places.
  *         * where the C prototypes show "int", VB and PB usually
 *           require "long" to match.
*
-----------------------------------------------------------------------

function prototypes:          ( in C format ) :

   DllExport int _stdcall PPrtr (int hx, int selection, int NewValue, int action)
   DllExport int _stdcall Prtrs (LPSTR szActives)
   DllExport int _stdcall GetPrtr (LPSTR szPrtr)
   DllExport int _stdcall DefPrtr (LPSTR szNewPrinter, LPSTR szOldPrinter)
   DllExport int _stdcall GetPort (LPSTR szPort)
   DllExport int _stdcall PPGetDriver (LPSTR szD)
   DllExport int _stdcall SetuPP (HWND hwndx)
   DllExport int _stdcall PPGetSizes(LPINT iPaperX, LPINT iPaperY,
                                     LPINT iPageX, LPINT iPageY,
                                     LPINT iPageLeft, LPINT iPageTop,
                                     LPINT iPixelsInchX,
                                     LPINT iPixelsInchY)
   DllExport int _stdcall PPSetupFileName (LPSTR szPrinterName, LPSTR szFileName)
   DllExport int _stdcall PPRemoveFileName (LPSTR szPrinterName, LPSTR szFileName)
   DllExport int _stdcall PPResetDC (int hx, HDC hDCPrinter)
   DllExport int _stdcall PrtrCap (LPINT nDevCap)

-----------------------------------------------------------------------

function definitions:         ( in Visual Basic format ) :

    ******************************** PPrtr **********************************

    Declare Function PPrtr Lib "PPRTR32.DLL" (ByVal hx As Long, ByVal i1 As Long, ByVal i2 As Long, ByVal i3 As Long) As Long

          where:    hWnd ................ is a window handle (form1.hWnd)
                    ppSelection ......... is the selected printer device
                                           attribute to get/change.
                                      ... NOTE that not all printers
                                           support all actions (e.g. my
                                           Epson LX-800 doesn't support
                                           PaperLength or PaperWidth)
                    ppNewValue .......... is the value to change it to
                                      ... (anything will do if call is a
                                           gimme, no change )
                                      ... see PPRTRBAS.TXT for available
                                           values
                    ppAction ............ is the action requested
                                      ...  0 = gimme current value
                                      ...  1 = change it to ppNewValue
             returns ......... long of value of selected attribute
                                before the call
                           ... 995 when there is no default printer
                           ... 996 when the ppSelection is not supported
                                   by the default printer driver
                           ... 997 for a bad ppSelection code parameter
                           ... 998 for a bad ppAction code parameter
                           ... 999 when it can't find printer/driver info

    ppSelection:
        DM_ORIENTATION = &H1
        DM_PAPERSIZE = &H2
        DM_PAPERLENGTH = &H4       // note: must be in tenths of millimeters
        DM_PAPERWIDTH = &H8        // note: must be in tenths of millimeters
        DM_SCALE = &H10
        DM_COPIES = &H100
        DM_DEFAULTSOURCE = &H200
        DM_PRINTQUALITY = &H400
        DM_COLOR = &H800
        DM_DUPLEX = &H1000
        DM_YRESOLUTION = &H2000
        DM_TTOPTION = &H4000
        DM_COLLATE          &H00008000
        DM_FORMNAME         &H00010000
        DM_LOGPIXELS        &H00020000
        DM_BITSPERPEL       &H00040000
        DM_PELSWIDTH        &H00080000
        DM_PELSHEIGHT       &H00100000
        DM_DISPLAYFLAGS     &H00200000
        DM_DISPLAYFREQUENCY &H00400000
        DM_ICMMETHOD     &H00800000
        DM_ICMINTENT     &H01000000
        DM_MEDIATYPE     &H02000000
        DM_DITHERTYPE     &H04000000

    Samples:

        PPrtr(hWnd, DM_PAPERSIZE, PP_UNNEEDED, PP_GIMME)
        PPrtr(hWnd, DM_ORIENTATION, PP_UNNEEDED, PP_GIMME)

        PPrtr(hWnd, DM_ORIENTATION, DMORIENT_PORTRAIT, PP_CHANGE_IT)
        PPrtr(hWnd, DM_PAPERSIZE, DMPAPER_LEGAL, PP_CHANGE_IT)

    C programmers...the relavent header file for this call is PRINT.H
                    (in Borland C++)
    ******************************** DefPrtr *******************************-

    Declare Function DefPrtr Lib "PPRTR32.DLL" (ByVal newone As String,
    ByVal oldone As String) As Long

          * note: the above must all be on one line in VB

       where:  newone .. is a string corresponding to what you see in the
                         control panel printers dialog box.  It shows
                         printer names followed by "on xxxx:" where
                         xxxx is a port.  Don't use one where it says
                         "on None".

                                    HP LaserJet Series II on LPT1:
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                   ^-- all this

                         This is case insensitive, but otherwise must
                         be identical.

                         Note: the printer must have been
                         made "active" in the control panel
                         printers applet...it'll show "None"
                         for a port if it's not...e.g.

                            active -> HP LaserJet Series II=HPPCL,LPT1:
                            not ----> HPGL Plotter=MGXHPGL,None

                         Note: the printer may be active on
                         more than one port.  It'll show the
                         additional ports on the same line
                         separated by commas...e.g.

                            1 port -> HP LaserJet Series II on LPT1:
                            3 ports -> HP LaserJet Series II on LPT1:, LPT2:, COM2:

                         To use the LPT2 printer, pass this:

                             HP LaserJet Series II on LPT2:

                         Passing this parameter as an empty string or
                         unrecognizable string results in a 998 error, but
                         does return the name of the current printer
                         in the "oldone" parameter...thus, allowing
                         retrieval of the name of the current default
                         printer without changing anything:

                            currentptr$ = String$(255, 0)
                            i = DefPrtr("", currentptr$)

       where:  oldone .. is a string in which the function will return
                         the default printer before your call.

                         Save this for use as "newone" to reset the
                         printer to the prior default printer when
                         and if you desire to do so.

                         Note: in Visual Basic you must pre-load a
                         string which is to be filled by a called
                         function...e.g.

                            oldptr$ = String$(255, 0)
                            i = DefPrtr("HP LaserJet Series II on LPT1:", oldptr$)

                         If there was no old default printer, this string
                         will be as you initialized it on return.

       returns:          0   = successful
                         999 = Unable to write to WIN.INI ... this
                               is a system problem.
                         998 = The "newone" printer was not found in
                               [devices] section of WIN.INI
                               ... be sure you've put in all spaces
                         997 = The "newone" printer was found, but it
                               is not "active"...i.e. its port is
                               "None"


    Sample:
       Declare Function DefPrtr Lib "PPRTR.DLL" (ByVal newone As String, ByVal oldone As String) As Long

       //---- change to LaserJet ---------------------
       oldprinter$ = String$(255, 0)
       L = DefPrtr("HP LaserJet Series II on LPT1:", oldprinter$)
       //----
       .
       .    print to LaserJet
       .
       //---- change back to original printer --------
       dontcare$ = String$(255, 0)
       L = DefPrtr(oldprinter$,dontcare$)

    ******************************** Prtrs *******************************-

    Declare Function Prtrs Lib "PPRTR32.DLL" (ByVal plist As String) As Long

       where:  pList ... is a string for the return of a list of
                         available active printers.

                         The list only contains the names of "active"
                         printers.  The printer must have been
                         made "active" in the control panel
                         printers applet...it'll show "None"
                         for a port if it's not...e.g.

                            active -> HP LaserJet Series II=HPPCL,LPT1:
                            not ----> HPGL Plotter=MGXHPGL,None

                         Note: in Visual Basic you must pre-load a
                         string which is to be filled by a called
                         function...e.g.

                            plist$ = String$(1023, 0)
                            l = Prtrs(plist$)

                         The active printer names are separated by
                         semi-colons (;), e.g.

                              Epson LX-800 on LPT1:;HP LaserJet Series II on LPT2:

       returns ....... 0 if no active printers found, or
                       unable to access [drivers] section in WIN.INI
               ....... 999 if the substring " on " cannot be found in the
                       string you passed, or
               ....... the length of the returned string

    ******************************** PrtrCap *******************************-

    Declare Function PrtrCap Lib "PPRTR32.DLL" (ndc As DEVCAP) As Long
       where:  ndc .. is a structure (VB type definition) containing the
                      device capability variable definitions:

                      Type devcap
                           DRIVERVERSION As Long
                           TECHNOLOGY    As Long ' bits
                           HORZSIZE      As Long
                           VERTSIZE      As Long
                           HORZRES       As Long
                           VERTRES       As Long
                           BITSPIXEL     As Long
                           PLANES        As Long
                           NUMBRUSHES    As Long
                           NUMPENS       As Long
                           NUMMARKERS    As Long
                           NUMFONTS      As Long
                           NUMCOLORS     As Long
                           PDEVICESIZE   As Long
                           CURVECAPS     As Long ' bits
                           LINECAPS      As Long ' bits
                           POLYGONALCAPS As Long ' bits
                           TEXTCAPS      As Long ' bits
                           CLIPCAPS      As Long ' bits
                           RASTERCAPS    As Long ' bits
                           ASPECTX       As Long
                           ASPECTY       As Long
                           ASPECTXY      As Long
                           LOGPIXELSX    As Long
                           LOGPIXELSY    As Long
                           SIZEPALETTE   As Long
                           NUMRESERVED   As Long
                           COLORRES      As Long
                           PHYSICALWIDTH   As Long
                           PHYSICALHEIGHT  As Long
                           PHYSICALOFFSETX As Long
                           PHYSICALOFFSETY As Long
                           SCALINGFACTORX  As Long
                           SCALINGFACTORY  As Long
                      End Type

                      See the PPRTRBAS.TXT file for 'bit' field masks;
                      and see the VB example for sample usage.  See the
                      windows SDK documentation for explanation of the
                      dev cap fields.

       Returns 0 unless there is no default printer, then returns 995;

    ******************************** GetPrtr *******************************-

    Declare Function GetPrtr Lib "PPRTR32.DLL" (ByVal DefPrtr As String) As Long
       where:  DefP .. is a string set up to receive the name of the
                       current default printer.

                       Note: in Visual Basic you must pre-load a
                       string which is to be filled by a called
                       function...e.g.

                          defptr$ = String$(255, 0)
                          i = GetPrtr(defptr$)

      Returns 0 -- and printer name in the string if successful;
      Returns 995 when there is no default printer, string is as you
                  initialized it.

    ******************************** GetPort *******************************-

    Declare Function GetPort Lib "PPRTR32.DLL" (ByVal ptrport As String) As Long
       where:  DefP .. is a string set up to receive the name of the
                       current default printer port.

                       Note: in Visual Basic you must pre-load a
                       string which is to be filled by a called
                       function...e.g.

                          defport$ = String$(255, 0)
                          i = GetPort(defport$)

      Returns 0 -- and printer name in the string if successful;
                   if not, string is as you initialized it.
      Returns 995 when there is no default printer, string is as you
                  initialized it.

    ******************************** GetDriver *****************************-

    Declare Function PPGetDriver Lib "PPRTR32.DLL" (ByVal sdriver As String) As Long
       where:  DefD .. is a string set up to receive the name of the
                       current default printer's driver name.

                       Note: in Visual Basic you must pre-load a
                       string which is to be filled by a called
                       function...e.g.

                          defdriver$ = String$(255, 0)
                          i = PPGetDriver(defdriver$)

      Returns 0 -- and printer name in the string if successful;
                   if not, string is as you initialized it.
      Returns 995 when there is no default printer, string is as you
                  initialized it.

    ******************************** SetuPP *******************************-

    Declare Function SetuPP Lib "PPRTR32.DLL" (ByVal hwndx As Long) As Long

    Usage:  L = SetuPP(hWnd)

    Returns   1 if "OK" was selected from the Setup dialog,
              2 if "CANCEL" was selected from the Setup dialog,
            995 if not successful.

    ************************ PPGetSizes *******************************

    Declare Function PPGetSizes Lib "PPRTR32.DLL" (
                                     lPaperX As Long,
                                     lPaperY As Long,
                                     lPageX As Long,
                                     lPageY As Long,
                                     lPageLeft As Long,
                                     lPageTop As Long,
                                     lPixInX As Long,
                                     lPixInY As Long) As Long

          * note: the above must all be on one line in VB

        Parameters:
         1. iPaperW      returns the width of the paper in device
                                 units (pixels)
         2. iPaperH      returns the height of the paper in device
                                 units (pixels)
         3. iPageW       returns the width of the printable area in
                                 device units (pixels)
         4. iPageH       returns the width of the printable area in
                                 device units (pixels)
         5. iPageLeft    returns the offset of the printable area from
                                 the left edge of the paper (pixels)
         6. iPageTop     returns the offset of the printable area from
                                 the Top edge of the paper (pixels)
         7. iPixelsInchX returns the resolution in the horizontal
                                 direction in pixels per inch
         8. iPixelsInchT returns the resolution in the vertical
                                 direction in pixels per inch

        Returns.....  -1 when unable to create a device context
                              (probably memory)
                 ... 995 when there is no default printer

    ************************ PPSetupFileName **************************

    Declare Function PPSetupFileName Lib "PPRTR32.DLL" (
                                            ByVal s1 As String,
                                            ByVal fn As String) As Long

          * ALERT --- PARAMETERS ARE DIFFERENT THAN 16-BIT VERSION

          * note: the above must all be on one line in VB

       where:  s1......is a GLOBAL STRING of 255 characters for the
                       function to return the printer name, which is
                       required by PPRemoveFileName for cleanup.

               fn......is a string containing a fully-qualified file
                       name (i.e. including drive letter and path,
                       e.g. "c:\wp51\files\wpout.prn"

                       Note: this can be "FILE:" for printing to
                             a file whose name will be supplied by
                             the user when Windows prompts for it.

                       Note: in Visual Basic you must pre-load a
                       string which is to be filled by a called
                       function...e.g.

                          spname$ = String$(255, 0)
                          i = PPSetupFileName(spname$, "c:\fabc.prn")

       returns   ... 995 when there is no default printer

       NOTE: you MUST call the companion function:  PPRemoveFileName()
       when you've finished printing.  Otherwise, the WIN.INI file
       retains the filename in several sections, and you'll have to
       clean it up manually...ugh.

       This is NOW necessary evem if the filename parameter was "FILE:".

       NOTE: this function must be completed BEFORE any reference to the
             VB printer object (see note to VB developers below) or it
             will not take effect.

    ************************ PPRemoveFileName **************************

    Declare Function PPRemoveFileName Lib "PPRTR32.DLL" (
                                 ByVal s1 As String,
                                 ByVal fn As String) As Long

          * ALERT --- PARAMETERS ARE DIFFERENT THAN 16-BIT VERSION

          * note: the above must all be on one line in VB

       where:  s2......is the GLOBAL STRING that the PPSetupFileName
                       function returned as its first parameter.
                       It is the printer name, e.g. "HP Laserjet IIIsi"

               fn......is the string containing a fully-qualified file
                       name (i.e. including drive letter and path,
                       e.g. "c:\wp51\files\wpout.prn") that was set up
                       using a prior PPSetupFileName function.

       NOTE: you MUST this function after using:  PPSetupFileName()
       when you've finished printing.  Otherwise, the WIN.INI file
       retains the filename in several sections, and you'll have to
       clean it up manually...ugh.

       ALERT -- no longer should you call defprtr() before this one,
             as was necessary for 16-bit...in fact you must not.

       NOTE: I've noticed on one of my printers that if I issue this
             function too soon after the VB print operation finishes
             I get a Windows message that the port parameters have changed
             before the job could be completed, so it is cancelled.  You
             will need to take this into account in your use of it.

    ************************ PPRemoveFileName **************************

    Declare Function PPResetDC Lib "PPRTR32.DLL" (ByVal hwndx As Long,
                                          ByVal hdcx As Long) As Long

          * note: the above must all be on one line in VB

       where:  hwndx...is any window handle (form1.hWnd)
               hdcx....is the printer object's device context,
                       always: Printer.hDC

       example:  L = PPResetDC(Form1.hWnd, Printer.hDC)

       returns   ... 995 when there is no default printer
                 ... 994 when the ResetDC() API function fails
                 ... 0   when successful

       Uses:  Programmers able to use the Windows API in all its glory
              have access to the printer's device context (DC) and
              device mode structure (DEVMODE).  By manipulating these,
              those programmers are able to do such things as print
              different pages in different orientations in the same
              document (print job).  Visual Basic does not allow direct
              manipulation of it's "Printer Object", which roughly
              represents the combination of DC and DEVMODE, except via
              pre-defined attributest of that object.  Thus, the
              usefulness of such functions as PPrtr(), above, for
              manipulating the DEVMODE structure.  Unfortunately, this
              can't conveniently be done DURING a print job, as explained
              below.
              The Windows API *does* provide a function for affecting
              DEVMODE changes DURING a print job.  It's called the
              ResetDC function, taking as its parameters the current
              printer's DC and DEVMODE structure.  PPResetDC provides
              you this capability...you pass it the DC and it gets the
              DEVMODE structure.

       But... This is a double-edged sword.  The API documentation
              for the ResetDC function says "Before calling ResetDC, the
              application must ensure that all objects (other than stock
              objects) that had been selected into the device context
              have been selected out."  They are then to be re-selected
              into the DC after the ResetDC...using other API functions.
              These "objects" correspond roughly to VB's Printer Object
              attributes (e.g. Fontname, Fontbold...).
              Since I can't know what attributes you've set, I can't
              restore them after a PPResetDC, so they're lost.
              Consequently, after a PPResetDC call, *you* have to re-do
              any Printer Object attributes that you'd set previously.

       ALERT - this didn't seem to work as it did in 16-bit during
              32-bit testing.  Fonts didn't seem to take.  Orientation
              did, tho, so I kept it in.

       WHOA...not so fast, PowerBuilders...since you can't get the
              printer DC, you can't use this function as currently
              implemented.  One of the sacrifices for using a better
              development tool.

    ************************ PPReady & PPDefReady **********************
    I switched to MC C++ and it just wouldn't let me do the assembly
    stuff mixed in with C like Borland's C compiler would, so I just
    killed these functions.  You shouldn't be messing that close to
    the metal anyway.

--------------------------------------------------------------------
Visual Basic programmers, PLEASE READ:
   Windows programs, including VB, print to a virtual printer called
a Device Context, or DC.  When you start a print job by performing
any print action, any reference to the printer object, even something
as simple as "printer.font=...", VB gets a new DC...this attaches
printer setting data from a structure called DEVMODE.  From then
till you issue an ENDDOC, setting changes like orientation or default
printer are not recognized.  It appears as tho the dll calls didn't
work, when in fact they worked but were ignored.
   So, you must make pprtr.dll calls before your first print action,
or after the ENDDOC if you want to change stuff between print jobs.
   If pprtr function calls don't return an error code, but don't seem
to have worked, this is always why.  Check out your code before writing,
please...thanks...PP

   NOTE that the above can be gotten around by using the PPResetDC()
function...but see the note under that functions regarding "selected
object" (Printer.Attributes) for its limitations.

   Also, please check out the plength form (button in upper left corner
of main sample form) for user-defined paperlength and or paperwidth.
--------------------------------------------------------------------
POWERBUILDER programmers:
The above discussion applies to PB, except that the print job is
framed by PrintOpen() and PrintClose().
--------------------------------------------------------------------
This DLL has been lightly tested by me and a couple of persistent
nags who finally got me to port it...so YMMV...test it thoroughly
as I don't guarantee anything.

The latest version can always be found via links from my web site:
        http://rampages.onramp.net/~pelican

The DBFast folks have been using the 16-bit version, and a couple
of friends from 'down-under' worked up some samples and wrappers.
Post requests on the CADEV forum for help with DBFast.

A tip of the pelican's beak to OsoSoft's "Gentle" George Campbell who
suggested the original idea for this DLL.

Thanks to all who have recommended this DLL on the VB and PB fora.
Especially Jens on the VB newsgroup, who single-handedly probably
made me the rich man that I've become.

A special pelican dropping to those of you who only got in touch
with me when you found out there was no 32-bit version to port your
existing use of the 16-bit dll you had never bothered to pay for.

You are free to try this DLL for 30 days.

If you decide to use it thereafter, you are obligated to send $10 to
                     PAUL POELLINGER
                     2019 Round Lake Drive
                     Houston, TX  77077

Please make checks payable to Paul Poellinger, not Silent O Software.
Please include you e-mail address if you have one.  I usually send
an acknowledgement, but only via e-mail...you get nothing any other
way, since you've already got the dll.  I also use e-mail to alert
you to the updates, all of which are free.  Whatta guy.

>>>> Please be sure to indicate that payment is for PPRTR.DLL <<<<<<

         -- OR --

register via Compuserve's shareware registration service by
typing GO SWREG at the prompt.  Registration ID # 1462.  I charge
$12 for registration this way, cause Compuserve takes a 15%
share :-( ... guess shareware means everyone who can gets a share.

         -- OR --

register via credit card through Public software Library (PsL).
See the enclosed CREDIT.TXT for details.

         -- OR --

I accept purchase orders (verbal, mailed or faxed...fax# 800-321-1722).
BTW...please don't fax me tech support questions...I pay for that
fax line by the page...if you haven't got e-mail, get with the program.

After registering, you are free to use it in your applications, and
to distribute it with such applications, as long as you do not
charge separately for the DLL or publish its calling conventions.

Please note that even if you paid for a diskette or CD containing
this package, you must still pay the $10 registration fee for use
of this DLL past the 30 day free trial.  What you paid them is
their "share".

Multi-user licenses are available for:
      up to 50 developers...........$250
      Unlimited.....................$400
DLL Source code is available for $500.

If you paid for the earlier version, you've paid for this one.
I and all those dependent on me thank you.

You are free to pass this package on to others or upload it to
bulletin boards provided that 1) you do not charge for it above
the cost of distribution, and 2) all parts of the package are
included (see "included" at the top).

Thank you for supporting shareware.
-------------------------------------------------------------------
Let me know if you have any trouble or suggestions.

-------------------------------------------------------------------
**************** other offerings you might like ******************
-------------------------------------------------------------------

For a simple windows utility that may do the job, check out
spoolf20.zip in any cica, garbo, or simtel mirror,
(spoolf.zip on CIS, spoolfle.zip on AOL),
e.g. ftp://ftp.simtel.net/pub/simtelnet/win3/util/spoolf20.zip

   Windows utility to print files created by printing to a
   file (e.g. by printing the the FILE: port).  Sends file
   directly to the printer using Windows PassThrough
   escape.  Works even if normal driver doesn't support
   PassThrough.  Also handles postscript files.
   No more need to use DOS "copy /B xxx.prn lpt1:".
   Shareware $10.

---------------------------

Check out wprt104.zip on any cica, garbo or simtel mirror
(winptr.zip on CIS or AOL),
e.g. ftp://ftp.simtel.net/pub/simtelnet/win3/util/wprt104.zip

  Send screen,window,client or rectangle to printer,
  clipboard,file or fax. Send clipboard contents to
  printer,file or fax. Print files. Load files to the
  clipboard. Text,bitmaps or metafiles. Assign a new
  default printer. Change to portrait/landscape. Route
  all printer output to files. View or clear the clipboard.
  See what printer is current and its orientation on  icon.
  ALL FROM A SINGLE ICON loaded with windows.  Most
  via HOTKEYS.  v1.04 adds Windows NT and 95 compatiblity
  (MDI sheet/sheet-client for w95 only).  Shareware $20.

Windows User Group Network's (WUGNET) WinUser Forum
"Shareware Pick of the Week" - 12/24/95

---------------------
"Programming is the art of debugging a blank sheet of paper"
Paul F Poellinger              2019 Round Lake Drive
Silent O Software              Houston, TX  77077
pelican@onramp.net         Compuserve: 70732,3576
AOL: PFPelican             pelican@msn.com
        http://rampages.onramp.net/~pelican
---------------------
