| |
|
|
- 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 |
|
|
| |
|
|
| |
|
- Seite 6 - |
|
|
« 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 ▲ |
|
|
|
|
|
| Genaugenommen ist die Meldung "nicht dimensioniert" nach dim xyz#,0 "falsch", ist ja mit 0 Byte dimensioniert. ^^ |
|
|
| |
|
|
|
Rolf Koch | Naja aufjedenfall ist es wie auf der Arbeit die Meldung wenn ich mal testweise auf 0 setze. Zumindest hab ich jetzt den Absturz durch die IF Abfrage behoben. ^^ So jetzt gehe ich wieder auf die Suche nach dem anderen Seite lesen o.ä. Problem.
[iF] Ich weiß jetzt nicht ad hoc wie groß die DevMode ist aber vlt. könntest Du mal Dumps davon Blockwriten wie auch von den JobInfo1..3-Speichern.
Nö Sorry iF - das kapier ich überhaupt nicht. Naja, ich denke halt zu XProfan. Oder meinste alle Infos einfach mal in ne Datei schreiben, wenn ein Druck erfolgt? |
|
|
| |
|
|
|
| Rolf Koch (23.11.10)
Oder meinste alle Infos einfach mal in ne Datei schreiben, wenn ein Druck erfolgt?
Ja. ^^ |
|
|
| |
|
|
|
Rolf Koch | Also werd ich mich jetzt daran machen alle Sachen aus devmode umzusetzen und zu schreiben. OK ^^ |
|
|
| |
|
|
|
| Probiere mal sowas wie BlockWrite str$(&getTickCount)+".dump",devmoaddr&,0,148 |
|
|
| |
|
|
|
Rolf Koch | Hab jetzt einiges verglichen. Alles bleibt gleich. Was ich mir vorstelle, aber nicht als API finde, wäre der absolute Versender des Auftrags. Die Kundenbelege kommen z.B. vom Computer irgendwo (vlcht. auch Server k.A und egal). Mit diesen zu vergleichenden falschen Ausdrucke kommen von MDE Geräten. Genial wäre es, wenn man also rauffinden könnte: Aha, der Auftrag kam vom Server und der andere von einem MDE Gerät. Dann hät ich das Problem gelöst. Jedoch, gibt es soetwas. Kann mir es vorstellen. |
|
|
| |
|
|
|
Rolf Koch | Hmm, das hier in PRINTER_NOTIFY_INFO_DATA Structure JOB_NOTIFY_FIELD_MACHINE_NAME pBuf is a pointer to a null-terminated string that specifies the name of the machine that created the print job. hört sich vielversprechend an, oder? |
|
|
| |
|
|
|
| Die Machine steht auch in einem Speicher der an Pos. 8 in der Job_Info angegeben wird: KompilierenMarkierenSeparieren'URL: https://xprofan.com/intl/de/forum/druck-seite-inhalt-auslesen/#bottom
' {$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
Var machine$=""
//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)
machine$=String$(Long(JOB_INFO_1#,8),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 machine$
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
|
|
|
| |
|
|
|
Rolf Koch | Hey iF, hab ich bereits auf der Arbeit getestet. Dort kommt immer nur der String an von dem PC an welchem der Drucker angeschlossen ist. Ich meine eigentlich, es müsste ja irgendwie möglich sein, rauszubekommen, wo die Daten eingegeben wurden und weitergesendet wurden. |
|
|
| |
|
|
|
| Rolf Koch (24.11.10)
Hmm, das hier: Rolf Koch (24.11.10)a pointer to a null-terminated string that specifies the name of the machine that created the print job hört sich vielversprechend an, oder?
Hört sich leider nicht anders an als: Rolf Koch (24.11.10)
A pointer to a null-terminated string that specifies the name of the machine that created the print job. aus der job_info_2. |
|
|
| |
|
|
|
Rolf Koch | Ich sage das jetzt aber unter Vorbehalt, denn kann auch sein, daß Maschine wirklich der Serverstring war und ich mich verkuckt habe. Jedoch wäre das auch blöd. Weil dies wäre ja der Erzeuger, wo die Anwendung den Druck evtl. generiert. Ach ist das Blöd ^^ Ich will das Gerät, welches als erstes die Daten sendet - sogesehen die Rohdaten. BOhhhhhaaa bin ich wieder anspruchsvoll muahahahaha. Aber dies ist bestimmt eine unmögliche Sache. Neue Idee muss her - also muss ich wieder denken MIST ^^ |
|
|
| |
|
|
|
| Schon versucht das Spoolerverzeichnis zu überwachen? |
|
|
| |
|
|