<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[FindNextPrinterChangeNotification &#x2F;&#x2F; JOB_NOTIFY_FIELD_PAGES_PRINTED bzw. JOB_NOTIFY_FIELD_TOTAL_PAGES]]></title><description><![CDATA[<p>Hi ihrse,</p>
<p>ich möchte einen Status über den Druckauftrag meines Programms ausgeben, habe dort jedoch 2 Problemchen, das eine schlimm, das andere weniger schlimm.</p>
<p>1. Anzahl der &quot;TOTAL_PAGES&quot; des Druckauftrags, diese werden nicht direkt auf die endgültige Zahl der genauen Anzahl gesetzt, sondern Scheibchenweise, siehe weiter unten in dem Debugfenster.</p>
<p>2. Hier das schlimmere Problem:<br />
Die Anzahl der bereits gedruckten Daten. Bei dem Beispiel unten, in welchem 3 Seiten ausgedruckt werden. erhoeht sich PRINTED_PAGES nur auf 2, danach kommt keine Änderung mehr. Dazu kommt, dass sich das bereits ändert sobald der Drucker angefangen hat zu Drucken, d.h. er hat gerade mit Seite 1 begonnen, windows liefert mir jedoch bereits, dass er bereits 2 Seiten gedruckt hat.</p>
<p>- a) Wo ist Seite 3?<br />
- b) Ich bekomme die Änderungen zu früh.</p>
<p>Als Alternative wie man so etwas realisieren kann fällt mir nur ein, nen virtuellen Drucker zu coden, was sich jedoch nicht lohnt, da es einfach zu viel Aufwand für eine solch &quot;unwichtige&quot; Sache ist.</p>
<p>Ich habe es mit JOB_INFO_2 und JOB_NOTIFY_FIELD_PAGES_PRINTED bzw. JOB_NOTIFY_FIELD_TOTAL_PAGES probiert. Ergebnis bei beidem gleich.</p>
<p>Vielleicht weiss ja jemand von euch Rat<br />
Vielen Dank im Voraus</p>
<p>Marc</p>
<pre><code class="language-cpp">BOOL CPrintJobs::SpyPrinter( LPCTSTR pstrPrinterName )
{
	TRACE ( &quot;SpyPrinter entered\n&quot; );
	HANDLE	hPrinter;
	HANDLE	hPrinterCN;
	DWORD	dwChanged;

	JOB_INFO_2 *pJob;
	DWORD dwNeeded;

	unsigned short		usPrinterJobInfo[4];
	usPrinterJobInfo[0]		=	JOB_NOTIFY_FIELD_PRINTER_NAME;
	usPrinterJobInfo[1]		=	JOB_NOTIFY_FIELD_DOCUMENT;
	usPrinterJobInfo[2]		=	JOB_NOTIFY_FIELD_TOTAL_PAGES;
	usPrinterJobInfo[3]		=	JOB_NOTIFY_FIELD_PAGES_PRINTED;

	PRINTER_NOTIFY_OPTIONS_TYPE			stgPrinterNotifyOptionsType[1];
	stgPrinterNotifyOptionsType[0].Type		=	JOB_NOTIFY_TYPE;
	stgPrinterNotifyOptionsType[0].Count	=	4;
	stgPrinterNotifyOptionsType[0].pFields	=	usPrinterJobInfo;

	PRINTER_NOTIFY_OPTIONS		stgPrinterOptions;
	stgPrinterOptions.Flags		=	PRINTER_NOTIFY_OPTIONS_REFRESH ;
	stgPrinterOptions.Version	=	2;
	stgPrinterOptions.Count		=	1;
	stgPrinterOptions.pTypes	=	stgPrinterNotifyOptionsType;

	PPRINTER_NOTIFY_INFO	pPrinterInfo;

	// PrinterHandle initialisieren
	if( TRUE == OpenPrinter( (LPTSTR) pstrPrinterName, &amp;hPrinter, NULL ) )
	{
		TRACE (&quot;PrinterHandel initialisiert\n&quot;);
		// Drucküberwachung anstossen ...
		hPrinterCN = FindFirstPrinterChangeNotification( hPrinter, PRINTER_CHANGE_ALL, NULL, &amp;stgPrinterOptions );

		// ... hat funktioniert?
		if( INVALID_HANDLE_VALUE != hPrinterCN )
		{
			while( true	)
			{
				// Darauf warten, dass sich etwas bei den Druckaufträgen tut
				WaitForSingleObject( hPrinterCN, INFINITE );

				// Informationen auslesen
				if( TRUE == FindNextPrinterChangeNotification( hPrinterCN, &amp;dwChanged, NULL, (LPVOID *) &amp;pPrinterInfo ) )
				{ 
					// Wenn ein Druckauftrag hinzugefügt wurde
					if( PRINTER_CHANGE_ADD_JOB &amp; dwChanged )
					{
						// Job pausieren
						SetJob( hPrinter, pPrinterInfo-&gt;aData[0].Id, 0, NULL, JOB_CONTROL_PAUSE );
						TRACE( &quot;ADD_JOB ... Job pausieren\n&quot;);

						// Job auslesen
				/*		GetJob( hPrinter, pPrinterInfo-&gt;aData[0].Id, 2, NULL, NULL, &amp;dwNeeded);
						pJob = new JOB_INFO_2[dwNeeded];
						GetJob( hPrinter, pPrinterInfo-&gt;aData[0].Id, 2, (PBYTE) pJob, dwNeeded, &amp;dwNeeded);
						TRACE(&quot;TotalPages: %ld\n&quot;, pJob-&gt;TotalPages );*/
					}

					// Wenn der Druckauftrag geschrieben wird
					if( PRINTER_CHANGE_WRITE_JOB &amp; dwChanged )
					{
						TRACE (&quot;WRITE_JOB gefunden\n&quot;);
						for( unsigned int i = 0; i &lt; pPrinterInfo-&gt;Count; i++ )
						{
							// Wenn es eine Druckauftragsänderung ist
							if( JOB_NOTIFY_TYPE == pPrinterInfo-&gt;aData[i].Type )
							{
								//// Anzahl zu druckender Seiten auslesen
								if( JOB_NOTIFY_FIELD_TOTAL_PAGES == pPrinterInfo-&gt;aData[i].Field )
								{
									TRACE (&quot;TotalPages: %ld\n&quot;, pPrinterInfo-&gt;aData[i].NotifyData.adwData[0] );
								}
								//// Anzahl gedruckter Seiten auslesen
								if( JOB_NOTIFY_FIELD_PAGES_PRINTED == pPrinterInfo-&gt;aData[i].Field )
								{
									TRACE (&quot;PagesPrinted: %ld\n&quot;, pPrinterInfo-&gt;aData[i].NotifyData.adwData[0] );
								}
							}
						}
					}
				}
			}
		}
		return TRUE;
	}
	return FALSE;
}
</code></pre>
<pre><code>SpyPrinter entered
PrinterHandel initialisiert
ADD_JOB ... Job pausieren
WRITE_JOB gefunden
TotalPages: 1
WRITE_JOB gefunden
TotalPages: 3

//Hier stoße ich in der Übersicht der Druckaufträge (von windows) den Druck wieder an

WRITE_JOB gefunden
PagesPrinted: 0
WRITE_JOB gefunden
PagesPrinted: 0
WRITE_JOB gefunden
PagesPrinted: 0
WRITE_JOB gefunden
PagesPrinted: 1
WRITE_JOB gefunden
PagesPrinted: 1
WRITE_JOB gefunden
PagesPrinted: 2

//Hier ist der Drucker jedoch gerade erst bei Blatt 1, welches er druckt
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/97876/findnextprinterchangenotification-job_notify_field_pages_printed-bzw-job_notify_field_total_pages</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 20:41:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/97876.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Jan 2005 14:42:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to FindNextPrinterChangeNotification &#x2F;&#x2F; JOB_NOTIFY_FIELD_PAGES_PRINTED bzw. JOB_NOTIFY_FIELD_TOTAL_PAGES on Fri, 14 Jan 2005 14:42:56 GMT]]></title><description><![CDATA[<p>Hi ihrse,</p>
<p>ich möchte einen Status über den Druckauftrag meines Programms ausgeben, habe dort jedoch 2 Problemchen, das eine schlimm, das andere weniger schlimm.</p>
<p>1. Anzahl der &quot;TOTAL_PAGES&quot; des Druckauftrags, diese werden nicht direkt auf die endgültige Zahl der genauen Anzahl gesetzt, sondern Scheibchenweise, siehe weiter unten in dem Debugfenster.</p>
<p>2. Hier das schlimmere Problem:<br />
Die Anzahl der bereits gedruckten Daten. Bei dem Beispiel unten, in welchem 3 Seiten ausgedruckt werden. erhoeht sich PRINTED_PAGES nur auf 2, danach kommt keine Änderung mehr. Dazu kommt, dass sich das bereits ändert sobald der Drucker angefangen hat zu Drucken, d.h. er hat gerade mit Seite 1 begonnen, windows liefert mir jedoch bereits, dass er bereits 2 Seiten gedruckt hat.</p>
<p>- a) Wo ist Seite 3?<br />
- b) Ich bekomme die Änderungen zu früh.</p>
<p>Als Alternative wie man so etwas realisieren kann fällt mir nur ein, nen virtuellen Drucker zu coden, was sich jedoch nicht lohnt, da es einfach zu viel Aufwand für eine solch &quot;unwichtige&quot; Sache ist.</p>
<p>Ich habe es mit JOB_INFO_2 und JOB_NOTIFY_FIELD_PAGES_PRINTED bzw. JOB_NOTIFY_FIELD_TOTAL_PAGES probiert. Ergebnis bei beidem gleich.</p>
<p>Vielleicht weiss ja jemand von euch Rat<br />
Vielen Dank im Voraus</p>
<p>Marc</p>
<pre><code class="language-cpp">BOOL CPrintJobs::SpyPrinter( LPCTSTR pstrPrinterName )
{
	TRACE ( &quot;SpyPrinter entered\n&quot; );
	HANDLE	hPrinter;
	HANDLE	hPrinterCN;
	DWORD	dwChanged;

	JOB_INFO_2 *pJob;
	DWORD dwNeeded;

	unsigned short		usPrinterJobInfo[4];
	usPrinterJobInfo[0]		=	JOB_NOTIFY_FIELD_PRINTER_NAME;
	usPrinterJobInfo[1]		=	JOB_NOTIFY_FIELD_DOCUMENT;
	usPrinterJobInfo[2]		=	JOB_NOTIFY_FIELD_TOTAL_PAGES;
	usPrinterJobInfo[3]		=	JOB_NOTIFY_FIELD_PAGES_PRINTED;

	PRINTER_NOTIFY_OPTIONS_TYPE			stgPrinterNotifyOptionsType[1];
	stgPrinterNotifyOptionsType[0].Type		=	JOB_NOTIFY_TYPE;
	stgPrinterNotifyOptionsType[0].Count	=	4;
	stgPrinterNotifyOptionsType[0].pFields	=	usPrinterJobInfo;

	PRINTER_NOTIFY_OPTIONS		stgPrinterOptions;
	stgPrinterOptions.Flags		=	PRINTER_NOTIFY_OPTIONS_REFRESH ;
	stgPrinterOptions.Version	=	2;
	stgPrinterOptions.Count		=	1;
	stgPrinterOptions.pTypes	=	stgPrinterNotifyOptionsType;

	PPRINTER_NOTIFY_INFO	pPrinterInfo;

	// PrinterHandle initialisieren
	if( TRUE == OpenPrinter( (LPTSTR) pstrPrinterName, &amp;hPrinter, NULL ) )
	{
		TRACE (&quot;PrinterHandel initialisiert\n&quot;);
		// Drucküberwachung anstossen ...
		hPrinterCN = FindFirstPrinterChangeNotification( hPrinter, PRINTER_CHANGE_ALL, NULL, &amp;stgPrinterOptions );

		// ... hat funktioniert?
		if( INVALID_HANDLE_VALUE != hPrinterCN )
		{
			while( true	)
			{
				// Darauf warten, dass sich etwas bei den Druckaufträgen tut
				WaitForSingleObject( hPrinterCN, INFINITE );

				// Informationen auslesen
				if( TRUE == FindNextPrinterChangeNotification( hPrinterCN, &amp;dwChanged, NULL, (LPVOID *) &amp;pPrinterInfo ) )
				{ 
					// Wenn ein Druckauftrag hinzugefügt wurde
					if( PRINTER_CHANGE_ADD_JOB &amp; dwChanged )
					{
						// Job pausieren
						SetJob( hPrinter, pPrinterInfo-&gt;aData[0].Id, 0, NULL, JOB_CONTROL_PAUSE );
						TRACE( &quot;ADD_JOB ... Job pausieren\n&quot;);

						// Job auslesen
				/*		GetJob( hPrinter, pPrinterInfo-&gt;aData[0].Id, 2, NULL, NULL, &amp;dwNeeded);
						pJob = new JOB_INFO_2[dwNeeded];
						GetJob( hPrinter, pPrinterInfo-&gt;aData[0].Id, 2, (PBYTE) pJob, dwNeeded, &amp;dwNeeded);
						TRACE(&quot;TotalPages: %ld\n&quot;, pJob-&gt;TotalPages );*/
					}

					// Wenn der Druckauftrag geschrieben wird
					if( PRINTER_CHANGE_WRITE_JOB &amp; dwChanged )
					{
						TRACE (&quot;WRITE_JOB gefunden\n&quot;);
						for( unsigned int i = 0; i &lt; pPrinterInfo-&gt;Count; i++ )
						{
							// Wenn es eine Druckauftragsänderung ist
							if( JOB_NOTIFY_TYPE == pPrinterInfo-&gt;aData[i].Type )
							{
								//// Anzahl zu druckender Seiten auslesen
								if( JOB_NOTIFY_FIELD_TOTAL_PAGES == pPrinterInfo-&gt;aData[i].Field )
								{
									TRACE (&quot;TotalPages: %ld\n&quot;, pPrinterInfo-&gt;aData[i].NotifyData.adwData[0] );
								}
								//// Anzahl gedruckter Seiten auslesen
								if( JOB_NOTIFY_FIELD_PAGES_PRINTED == pPrinterInfo-&gt;aData[i].Field )
								{
									TRACE (&quot;PagesPrinted: %ld\n&quot;, pPrinterInfo-&gt;aData[i].NotifyData.adwData[0] );
								}
							}
						}
					}
				}
			}
		}
		return TRUE;
	}
	return FALSE;
}
</code></pre>
<pre><code>SpyPrinter entered
PrinterHandel initialisiert
ADD_JOB ... Job pausieren
WRITE_JOB gefunden
TotalPages: 1
WRITE_JOB gefunden
TotalPages: 3

//Hier stoße ich in der Übersicht der Druckaufträge (von windows) den Druck wieder an

WRITE_JOB gefunden
PagesPrinted: 0
WRITE_JOB gefunden
PagesPrinted: 0
WRITE_JOB gefunden
PagesPrinted: 0
WRITE_JOB gefunden
PagesPrinted: 1
WRITE_JOB gefunden
PagesPrinted: 1
WRITE_JOB gefunden
PagesPrinted: 2

//Hier ist der Drucker jedoch gerade erst bei Blatt 1, welches er druckt
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/696264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/696264</guid><dc:creator><![CDATA[MarcA]]></dc:creator><pubDate>Fri, 14 Jan 2005 14:42:56 GMT</pubDate></item><item><title><![CDATA[Reply to FindNextPrinterChangeNotification &#x2F;&#x2F; JOB_NOTIFY_FIELD_PAGES_PRINTED bzw. JOB_NOTIFY_FIELD_TOTAL_PAGES on Fri, 14 Jan 2005 17:59:21 GMT]]></title><description><![CDATA[<p>MarcA schrieb:</p>
<blockquote>
<p>Dazu kommt, dass sich das bereits ändert sobald der Drucker angefangen hat zu Drucken, d.h. er hat gerade mit Seite 1 begonnen, windows liefert mir jedoch bereits, dass er bereits 2 Seiten gedruckt hat.</p>
</blockquote>
<p>Ich denke, das liegt am Drucker-Spooler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/696477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/696477</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Fri, 14 Jan 2005 17:59:21 GMT</pubDate></item><item><title><![CDATA[Reply to FindNextPrinterChangeNotification &#x2F;&#x2F; JOB_NOTIFY_FIELD_PAGES_PRINTED bzw. JOB_NOTIFY_FIELD_TOTAL_PAGES on Wed, 19 Jan 2005 08:18:37 GMT]]></title><description><![CDATA[<p>flenders schrieb:</p>
<blockquote>
<p>MarcA schrieb:</p>
<blockquote>
<p>Dazu kommt, dass sich das bereits ändert sobald der Drucker angefangen hat zu Drucken, d.h. er hat gerade mit Seite 1 begonnen, windows liefert mir jedoch bereits, dass er bereits 2 Seiten gedruckt hat.</p>
</blockquote>
<p>Ich denke, das liegt am Drucker-Spooler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Ja, das denke ich auch, jedoch muss es doch eine Möglichkeit geben, mein Vorhaben umzusetzen ohne gleich einen virtuellen Drucker zu programmieren.</p>
<p>Gruss<br />
Marc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/699974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/699974</guid><dc:creator><![CDATA[MarcA]]></dc:creator><pubDate>Wed, 19 Jan 2005 08:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to FindNextPrinterChangeNotification &#x2F;&#x2F; JOB_NOTIFY_FIELD_PAGES_PRINTED bzw. JOB_NOTIFY_FIELD_TOTAL_PAGES on Wed, 19 Jan 2005 12:27:27 GMT]]></title><description><![CDATA[<p>Willst du jetzt den Drucker-Spooler umgehen und direkt drucken?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/700189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/700189</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Wed, 19 Jan 2005 12:27:27 GMT</pubDate></item></channel></rss>