Deutsch
Forum

Druck Seite Inhalt auslesen

 
- Seite 1 -



Rolf
Koch
Folgendes ist wieder mal nicht meine Stärke
Hab ein Tool programmiert, wo ich auf einen Drucker mit den üblichen Apis zugreife.
Mir fehlt bis dato noch irgendeine Möglichkeit wenn der Druckbefehl ankommt vorher den Inhalt auszulesen, bevor er druckt.
Also so in der Art: Druckerseite in String.
Einer eine Idee? Mir fällt im Moment nix ein
 
17.11.2010  
 



 
- Seite 3 -


« Dieser Beitrag wurde als Lösung gekennzeichnet. »

- Seite 4 -



Andreas
Miethe


Rolf Koch (11/20/10)
So hatte vorm Konzert nochmal gekuckt und festgestellt, daß
print test&,wi&,he&
Immer 0,0,0 printen.
Naja mal gemütlich rangehen und studieren ^^


If fragt an der falschen Stelle der Devmode-Struktur.
Hoch oder Querformat steht an Position 44 als word 1 oder 2
 {$cleq}
 $H Windows.ph
 $H winspool.ph
DEF Get_STDPrinter(1) Substr$(ReadIni$("WIN.INI","Windows","Device"),@&(1),",")
DEF &PRINTER_CHANGE_JOB  $FF00
DEF &INFINITE $FFFFFFFF
DEF &PRINTER_CHANGE_ADD_JOB $100
DEF OpenPrinterA(3) !"winspool.drv","OpenPrinterA"
DEF FindFirstPrinterChangeNotification(4) !"winspool.drv","FindFirstPrinterChangeNotification"
DEF FindNextPrinterChangeNotification(4) !"winspool.drv","FindNextPrinterChangeNotification"
DEF EnumJobsA(8) !"winspool.drv","EnumJobsA"
DEF FindClosePrinterChangeNotification(1) !"winspool.drv","FindClosePrinterChangeNotification"
DEF ClosePrinter(1) !"winspool.drv","ClosePrinter"
Declare JOB_INFO_1#
Declare druckername$,dokument$,dstring$
Declare Ende%,lb&,old_count&,entry$,sounddir$,lizenz$
Declare hicon&,cancel&,Title$,Version$,config$
Declare wav$,dateipfad$,belege$,wurde$,new$,abelege%
Var InfoBuffer& = 0
Var BytesNeeded& = 0
Var BytesReturned& = 0;
Var A& = 0
Var L& = 0
Var chgObject& = 0
Var pdwChange& = 0
Var fcnreturn& = 0
Var hPrinter& = 0
Var foundprint& = 0
Var Printer$ = Get_STDPrinter(1)
Var devmoaddr&=0
Var drv$=""
Var wi&=0
Var he&=0
Var Orientation&=0
Var test&=0
//WindowStyle 64
CLS
print usedll("winspool.drv")
print printer$
print OpenPrinterA(Addr(Printer$),Addr(hPrinter&),0)
print hPrinter&
chgObject& = FindFirstPrinterChangeNotification(hPrinter&,&PRINTER_CHANGE_JOB, 0, 0)
print chgObject&
dateipfad$=$progdir
dstring$="Drucktest.rtf"'Wordpad Datei unter Drucktest.rtf gespeichert für Test!
' Am besten einen Filedruck auswählen, damit man kein Papier verbraucht.
settimer 50

WhileNot Ende%

    Waitinput

    If %wmtimer

        ~WaitForSingleObject(chgObject&,150)'200 Millisekunden warten
        fcnreturn& = FindNextPrinterChangeNotification(chgObject&, Addr(pdwChange&),0,0)
        foundprint&=0

        If fcnreturn&

            If pdwChange& = &PRINTER_CHANGE_ADD_JOB

                'Print "neuer Druck-Job"
                EnumJobsA(hPrinter&,0,1,2,0,0,Addr(BytesNeeded&),Addr(BytesReturned&))
                Dim JOB_INFO_1#,BytesNeeded&

                Repeat

                    EnumJobsA(hPrinter&,0,1,2,JOB_INFO_1#,BytesNeeded&,Addr(BytesNeeded&),Addr(BytesReturned&))

                    If BytesReturned&

                        'Locate 0,0
                        druckername$=String$(Long(JOB_INFO_1#,4),0)
                        dokument$=String$(Long(JOB_INFO_1#,16),0)
                        foundprint&=1
                        devmoaddr&=Long(JOB_INFO_1#,40)
                        test&=long(devmoaddr&,104)
                        wi&=long(devmoaddr&,108)
                        he&=long(devmoaddr&,112)
                        Orientation&=word(devmoaddr&,44)
                        drv$=string$(devmoaddr&,0)

                    EndIf

                Until BytesReturned& = 0

                If foundprint&=1

                    print dokument$
                    print dstring$
                    print drv$
                    print test&,wi&,he&
                    Print If (Orientation& = 1,"Hochformat","Querformat")

                    If dokument$=dstring$

                        'playsound sounddir$+"doorbell.wav",1 'HIER SOUNDAUSGABE
                        PRINT "Jetzt würde der Lautsprecher Dingdong spielen"

                    EndIf

                EndIf

            EndIf

        EndIf

    EndIf

EndWhile

FindClosePrinterChangeNotification(chgObject&)
ClosePrinter(hPrinter&)
killtimer
End
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
20.11.2010  
 



Obiger Code ist doch super aufschlußreich - jetzt weiß ich was Du möchtest. ^^

Für welches Zielsystem? Wie ich das verstehe wirds unter XP schwieriger als ab Vista wenn ich mir [...]  und [...]  und [...]  und [...]  so ansehe.

Dann scheint es mir als wenn Du - wenn überhaupt - an die Steuerdaten herankommst die für den Drucker aufbereitet wurden - also keine Pixel und kein "DC" sondern eher Text ala PCL der wiederum wohl einfach in einer Datei steht.

GetSpoolFileHandle in Verbindung mit GetFileInformationByHandleEx könnte möglicherweise helfen an den Dateinamen heranzukommen um wiederum aus der Datei zu lesen.

Ich könnte mir schon vorstellen das in der Datei wiederum einfache Texte stehen die Du z.B. mit InStr finden könntest.

Egal aber wohl ob XP oder höher landen die Steuerdaten in einer Datei und als wäre es nicht bereits wohl kompliziert genug gibts dann wohl auch noch [...]  und [...]  was durchaus vielversprechend aussieht.

Davon Ahnung habe ich aber keine und auch keine Erfahrung mit - müsste mich da auch erst (übel) einarbeiten.

Vlt. wäre es viel einfacher im (bekannten?!) Spoolverzeichnis nach ("den") Dateien zu schauen und diese frech einzuladen und mit instr... - 100% zuverlässig ist das aber dann natürlich nicht.
 
17.11.2010  
 



[OFFTOPIC]
E.T. (17.11.10)


[OFFTOPIC]@IF: würd ich ja machen, wenn ich selbige nicht vergessen hätte...[/OFFTOPIC]




Einfach Geburtsdatum bei Passwort und der Benutzername ist der Domainname - also wie bei jeder guten Domain! [/OFFTOPIC]
 
17.11.2010  
 




Rolf
Koch
@iF - Danke zuerst mal für den Anstoss.
@Mario - Das was dann da drin steht, das weis ich ja, denn ich will ja wie iF per instr rausfiltern und wenn gewisse Textpassagen o.ä. vorhanden, dann ist es meine Datei.
 
18.11.2010  
 




Rolf
Koch
Wobei es noch eine Möglichkeit gäbe. Indem ich herausfinde, ob das Dokument am Printer Quer oder Hochkant ist. Denn das wichtige Dokument ist das einzige, welches Quer ankommt.
 
18.11.2010  
 



In der job_info_2 [...]  gibts DevMode [...]  und da gibts Orientation - könnte also klappen!
 
18.11.2010  
 




Rolf
Koch
OK Danke Dir für die Info. Oje die ist ja gewaltig und gerade ich soll das umsetzen. Phew. Naja mal kucken ^^
 
18.11.2010  
 




E.T.
Rolf Koch (18.11.10)

... Oje die ist ja gewaltig und gerade ich soll das umsetzen. ...


Ja, gerade DU sollst das umsetzen, weil du dich ja sonst auch garnicht zu helfen weist...
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
18.11.2010  
 




Rolf
Koch
LOL - sollte ja eigentlich sowas bedeuten: Ich Dussel, ich werd mich doch bestimmt wieder verfranzen. Ich stehe sehr oft mit Api's auf Kriegsfuss, vorallem wenn die Teile so ellenlang sind.
Ach egal irgenwann fällt mir was ein, wie ich das hinterlistige Teil von Drucker überliste
 
18.11.2010  
 




E.T.
Kannste nicht mal so nen Druckauftrag (Datei) posten ??
Mal ein "leeres Formular" zu dir schicken lassen.... die speziellen Daten würden ja keinen interessieren. Nur die rel. Daten, welche ausgewertet sollen, sind ja auch interessant, wie diese in der "zu-druckenden-Datei" stehen.

[OFFTOPIC]Häng grad drann, nem Multiedit einzelne Zeilen hinzuzufügen, dachte, das geht per AddString in der X2-R1, aber pustekuchen...[/OFFTOPIC]
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
19.11.2010  
 




Rolf
Koch
Tjo wenn ich an die Datei rankäme. Das ist ja nicht das Problem, ich weis ja bereits welche Strings ich zum filtern benutzen würde.
Was für ein leeres Formular?
Das wird in der Anwendung mit den Daten generiert irgendwo, irgendwann u.s.w.
Die Programmierer werd ich wohl nie fragen können, die sitzen irgendwo wohl im Busch
Ich werde niemals Infos bekommen - kennst bestimmt die EDV Bestimmungen in Grossfirmen. Ist ja auch egal.
Danke Euch zuerst einmal, so wie ich es sehe, gibt es keine einfache Sache an den Text heranzukommen, so als ob man eine Datei öffnet und in eine Variable schmeist. Hab ich mittlerweile eingesehen.
 
19.11.2010  
 



@Rolf: Vlt. kannst Du obigen Quelltext etwas vervollständigen sodass er läuft, Querformat dann herausbekommen ist dann ganz einfach. ^^
 
19.11.2010  
 




Rolf
Koch
Hab mal angepasst.
Das ist sogar gut so, denn dann kannst Du iF erkennen, warum XPSE über einige Sachen schimpft.
Wie z.B. OpenprinterA. Mit reinem Profan läuft es einwandfrei.
KompilierenMarkierenSeparieren
'Druck erkennen
'Quelltext grosse Teile von Andreas Miethe!!!
Set("Errorlevel",0)
 $H Windows.ph'evtl. anpassen
DEF Get_STDPrinter(1) Substr$(ReadIni$("WIN.INI","Windows","Device"),@&(1),",")
Var InfoBuffer& = 0
Var Spool& = ImportDll("Winspool.drv","")
cls
DEF &PRINTER_CHANGE_JOB  $FF00
DEF &INFINITE $FFFFFFFF
DEF &PRINTER_CHANGE_ADD_JOB $100
Declare JOB_INFO_1#
Var BytesNeeded& = 0
Var BytesReturned& = 0;
Var A& = 0
Var L& = 0
Var chgObject& = 0
Var pdwChange& = 0
Var fcnreturn& = 0
Var hPrinter& = 0
Var foundprint& = 0
Declare druckername$,dokument$,dstring$
Var Printer$ = Get_STDPrinter(1)
OpenPrinterA(Addr(Printer$),Addr(hPrinter&),0)
chgObject& = FindFirstPrinterChangeNotification(hPrinter&,&PRINTER_CHANGE_JOB, 0, 0)
Declare Ende%,lb&,old_count&,entry$,sounddir$,lizenz$
Declare hicon&,cancel&,Title$,Version$,config$
Declare wav$,dateipfad$,belege$,wurde$,new$,abelege%
dateipfad$=$progdir
dstring$="Drucktest.rtf"'Wordpad Datei unter Drucktest.rtf gespeichert für Test!
' Am besten einen Filedruck auswählen, damit man kein Papier verbraucht.
WindowStyle 64
Window 0,0-800,800
settimer 50

WhileNot Ende%

    waitinput

    if %wmtimer

        ~WaitForSingleObject(chgObject&,150)'200 Millisekunden warten
        fcnreturn& = FindNextPrinterChangeNotification(chgObject&, Addr(pdwChange&),0,0)
        foundprint&=0

        If fcnreturn&

            If pdwChange& = &PRINTER_CHANGE_ADD_JOB

                'Print "neuer Druck-Job"
                EnumJobsA(hPrinter&,0,1,1,0,0,Addr(BytesNeeded&),Addr(BytesReturned&))
                Dim JOB_INFO_1#,BytesNeeded&

                Repeat

                    EnumJobsA(hPrinter&,0,1,1,JOB_INFO_1#,BytesNeeded&,Addr(BytesNeeded&),Addr(BytesReturned&))

                    If BytesReturned&

                        'Locate 0,0
                        druckername$=String$(Long(JOB_INFO_1#,4),0)
                        dokument$=String$(Long(JOB_INFO_1#,16),0)
                        foundprint&=1

                    Endif

                Until BytesReturned& = 0

                if foundprint&=1

                    'print dokument$
                    'print dstring$

                    if dokument$=dstring$

                        'playsound sounddir$+"doorbell.wav",1 'HIER SOUNDAUSGABE
                        PRINT "Jetzt würde der Lautsprecher Dingdong spielen"

                    endif

                endif

            endif

        Endif

    endwhile

    FindClosePrinterChangeNotification(chgObject&)
    ClosePrinter(hPrinter&)
    killtimer
    end
 
19.11.2010  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

52.051 Betrachtungen

Unbenanntvor 0 min.
Christof Neuß20.05.2018
Manfred Barei26.07.2015
Uwe Lang06.09.2013
Pauli14.05.2013
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie