<?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[Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen]]></title><description><![CDATA[<p>Hallo liebe Gemeinde.</p>
<p>Ich stehe gerade vor einem Problem.<br />
Ich möchte mir eine Funktion schreiben,welches mir etwa jede Sekunde ein Screenshot eines Desktopbereichs macht.</p>
<p>Das Funktioniert auch. Nur das Programm beendet mit einem Fehler nach x Durchläufen (je nach Rechner(Speicher))</p>
<p>Hier der Code</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;cstdint&gt;
#include &lt;cassert&gt;

#include &lt;Windows.h&gt;

void capture();
char c;

void main (){

	int i =0;
	while(1){
	i++;

	std::cout&lt;&lt;i&lt;&lt;std::endl;
	Sleep(1000);
	capture();
	remove(&quot;file.bmp&quot;);
	}

}
void capture()
{
    HDC screen = GetDC(NULL);
    HDC target = CreateCompatibleDC(screen);

    /*uint32_t width = GetSystemMetrics(SM_CXSCREEN);
    uint32_t height = GetSystemMetrics(SM_CYSCREEN);*/

	uint32_t width = 640;
	uint32_t height= 480;

    HBITMAP bmp = CreateCompatibleBitmap(screen, width, height);

    SelectObject(target, bmp);

    int x = 0;
    x = BitBlt(target, 0, 0, width, height, screen, 10,10, SRCCOPY | CAPTUREBLT);
    assert(x);

	BITMAPINFO bminfo;
    bminfo.bmiHeader.biBitCount = 16;
    bminfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bminfo.bmiHeader.biCompression = BI_RGB;
    bminfo.bmiHeader.biPlanes = 1;
    bminfo.bmiHeader.biWidth = width;
    bminfo.bmiHeader.biHeight = height;
    bminfo.bmiHeader.biSizeImage = width * 4 * height; // must be DWORD aligned
    bminfo.bmiHeader.biXPelsPerMeter = 0;
    bminfo.bmiHeader.biYPelsPerMeter = 0;
    bminfo.bmiHeader.biClrUsed = 0;
    bminfo.bmiHeader.biClrImportant = 0;

    uint8_t *bmpBuffer = new uint8_t[bminfo.bmiHeader.biSizeImage];

	x = GetDIBits(target, bmp, 0, height, bmpBuffer, &amp;bminfo, DIB_RGB_COLORS);
    assert(x);

    BITMAPFILEHEADER fheader;
    fheader.bfType = 0x4D42;
    fheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bminfo.bmiHeader.biSizeImage;
    fheader.bfReserved1 = 0;
    fheader.bfReserved2 = 0;
    fheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    std::ofstream bmp_file(&quot;file.bmp&quot;, std::ios_base::binary);

    bmp_file.write((const char *) &amp;fheader, sizeof(fheader));
    bmp_file.write((const char *) &amp;(bminfo.bmiHeader), sizeof(bminfo.bmiHeader));
    bmp_file.write((const char *) bmpBuffer, bminfo.bmiHeader.biSizeImage);
    bmp_file.close();

}
</code></pre>
<p>Ich vermute, dass ich irgendwie den Speicher wieder zurücksetzen muss.</p>
<p>Nur leider geht</p>
<pre><code class="language-cpp">free(&amp;bminfo);
</code></pre>
<p>nicht</p>
<p>Evtl habt Ihr eine Idee.</p>
<p>Das Programm soll idealerweise 24h laufen.</p>
<p>VG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305682/screenshot-mit-gdi-in-endlosschleife-beendet-sich-nach-x-durchläufen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 19:59:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305682.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Jul 2012 11:19:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 11:21:07 GMT]]></title><description><![CDATA[<p>Hallo liebe Gemeinde.</p>
<p>Ich stehe gerade vor einem Problem.<br />
Ich möchte mir eine Funktion schreiben,welches mir etwa jede Sekunde ein Screenshot eines Desktopbereichs macht.</p>
<p>Das Funktioniert auch. Nur das Programm beendet mit einem Fehler nach x Durchläufen (je nach Rechner(Speicher))</p>
<p>Hier der Code</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;cstdint&gt;
#include &lt;cassert&gt;

#include &lt;Windows.h&gt;

void capture();
char c;

void main (){

	int i =0;
	while(1){
	i++;

	std::cout&lt;&lt;i&lt;&lt;std::endl;
	Sleep(1000);
	capture();
	remove(&quot;file.bmp&quot;);
	}

}
void capture()
{
    HDC screen = GetDC(NULL);
    HDC target = CreateCompatibleDC(screen);

    /*uint32_t width = GetSystemMetrics(SM_CXSCREEN);
    uint32_t height = GetSystemMetrics(SM_CYSCREEN);*/

	uint32_t width = 640;
	uint32_t height= 480;

    HBITMAP bmp = CreateCompatibleBitmap(screen, width, height);

    SelectObject(target, bmp);

    int x = 0;
    x = BitBlt(target, 0, 0, width, height, screen, 10,10, SRCCOPY | CAPTUREBLT);
    assert(x);

	BITMAPINFO bminfo;
    bminfo.bmiHeader.biBitCount = 16;
    bminfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bminfo.bmiHeader.biCompression = BI_RGB;
    bminfo.bmiHeader.biPlanes = 1;
    bminfo.bmiHeader.biWidth = width;
    bminfo.bmiHeader.biHeight = height;
    bminfo.bmiHeader.biSizeImage = width * 4 * height; // must be DWORD aligned
    bminfo.bmiHeader.biXPelsPerMeter = 0;
    bminfo.bmiHeader.biYPelsPerMeter = 0;
    bminfo.bmiHeader.biClrUsed = 0;
    bminfo.bmiHeader.biClrImportant = 0;

    uint8_t *bmpBuffer = new uint8_t[bminfo.bmiHeader.biSizeImage];

	x = GetDIBits(target, bmp, 0, height, bmpBuffer, &amp;bminfo, DIB_RGB_COLORS);
    assert(x);

    BITMAPFILEHEADER fheader;
    fheader.bfType = 0x4D42;
    fheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bminfo.bmiHeader.biSizeImage;
    fheader.bfReserved1 = 0;
    fheader.bfReserved2 = 0;
    fheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    std::ofstream bmp_file(&quot;file.bmp&quot;, std::ios_base::binary);

    bmp_file.write((const char *) &amp;fheader, sizeof(fheader));
    bmp_file.write((const char *) &amp;(bminfo.bmiHeader), sizeof(bminfo.bmiHeader));
    bmp_file.write((const char *) bmpBuffer, bminfo.bmiHeader.biSizeImage);
    bmp_file.close();

}
</code></pre>
<p>Ich vermute, dass ich irgendwie den Speicher wieder zurücksetzen muss.</p>
<p>Nur leider geht</p>
<pre><code class="language-cpp">free(&amp;bminfo);
</code></pre>
<p>nicht</p>
<p>Evtl habt Ihr eine Idee.</p>
<p>Das Programm soll idealerweise 24h laufen.</p>
<p>VG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230276</guid><dc:creator><![CDATA[rufux]]></dc:creator><pubDate>Thu, 05 Jul 2012 11:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 11:32:25 GMT]]></title><description><![CDATA[<p>Überleg doch mal an welcher Stelle Du Speicher allokierst. Den musst Du auch wieder freigeben. (Tipp: Sollte nicht so schwer sein, Du verwendest nur einmal eine Allokation)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230279</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 05 Jul 2012 11:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 11:34:55 GMT]]></title><description><![CDATA[<p>Mit vector wär das nicht passiert<br />
[/heisetrollmodus]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230280</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 05 Jul 2012 11:34:55 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 11:41:26 GMT]]></title><description><![CDATA[<p>Wärs wohl doch. Auch die von Windows angeforderten Ressourcen (via GetDC, CreateCompatibleBitmap usw.) müssen wieder freigegeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230282</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 05 Jul 2012 11:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 11:42:17 GMT]]></title><description><![CDATA[<p>Ich glaube, dass die Anzahl der GDI-Objekte hier eher zum Absturz führt. Es fehlen ReleaseDC und DeleteDC.<br />
Natürlich muss das Erwähnte auch behoben werden (std::vector!).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230283</guid><dc:creator><![CDATA[mapper]]></dc:creator><pubDate>Thu, 05 Jul 2012 11:42:17 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 11:45:08 GMT]]></title><description><![CDATA[<p>Nachtrag: Wie Belli geschrieben hat, fehlt auch noch DeleteObject für die Bitmap.</p>
<p>Das Beste wäre wohl, wenn du dir kleine Wrapperklassen schreiben würdest, die das automatisch erledigen (RAII).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230284</guid><dc:creator><![CDATA[mapper]]></dc:creator><pubDate>Thu, 05 Jul 2012 11:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 12:28:19 GMT]]></title><description><![CDATA[<p>Danke schonmal für die Antworten. So schnell hatte ich garnicht mit gerechnet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Also den Speicher löschen bringt nix.</p>
<p>Also ist es sicher das was mapper und Belli sagen.</p>
<p>Leider ist es das erste Programm was ich mit GDI versuche.<br />
Demzufolge weiß ich jetzt nicht ganz wie die Syntax aussehen sollte ReleaseDC erwartet ganz andere Datenstrukturen als die meinen.</p>
<p>das ist mein aktueller code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;cstdint&gt;
#include &lt;cassert&gt;

#include &lt;Windows.h&gt;

void capture();
char c;

void main (){

	int i =0;
	while(1){
	i++;

	std::cout&lt;&lt;i&lt;&lt;std::endl;

	capture();
	remove(&quot;file.bmp&quot;);
	}

}
void capture()
{
	HWND hWnd = FindWindow(NULL, NULL);
    HDC screen = GetDC(NULL);
    HDC target = CreateCompatibleDC(screen);

    /*uint32_t width = GetSystemMetrics(SM_CXSCREEN);
    uint32_t height = GetSystemMetrics(SM_CYSCREEN);*/

	uint32_t width = 640;
	uint32_t height= 480;

    HBITMAP bmp = CreateCompatibleBitmap(screen, width, height);

    SelectObject(target, bmp);

    int x = 0;
    x = BitBlt(target, 0, 0, width, height, screen, 10,10, SRCCOPY | CAPTUREBLT);
    assert(x);

	BITMAPINFO bminfo;
    bminfo.bmiHeader.biBitCount = 16;
    bminfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bminfo.bmiHeader.biCompression = BI_RGB;
    bminfo.bmiHeader.biPlanes = 1;
    bminfo.bmiHeader.biWidth = width;
    bminfo.bmiHeader.biHeight = height;
    bminfo.bmiHeader.biSizeImage = width * 4 * height; // must be DWORD aligned
    bminfo.bmiHeader.biXPelsPerMeter = 0;
    bminfo.bmiHeader.biYPelsPerMeter = 0;
    bminfo.bmiHeader.biClrUsed = 0;
    bminfo.bmiHeader.biClrImportant = 0;

    uint8_t *bmpBuffer = new uint8_t[bminfo.bmiHeader.biSizeImage];

	x = GetDIBits(target, bmp, 0, height, bmpBuffer, &amp;bminfo, DIB_RGB_COLORS);
    assert(x);

    BITMAPFILEHEADER fheader;
    fheader.bfType = 0x4D42;
    fheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bminfo.bmiHeader.biSizeImage;
    fheader.bfReserved1 = 0;
    fheader.bfReserved2 = 0;
    fheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    std::ofstream bmp_file(&quot;file.bmp&quot;, std::ios_base::binary);

    bmp_file.write((const char *) &amp;fheader, sizeof(fheader));
    bmp_file.write((const char *) &amp;(bminfo.bmiHeader), sizeof(bminfo.bmiHeader));
    bmp_file.write((const char *) bmpBuffer, bminfo.bmiHeader.biSizeImage);
    bmp_file.close();
	DeleteObject(bmp_file);

	DeleteDC(target);
	DeleteDC(screen);
	ReleaseDC(hWnd, target);
	ReleaseDC(hWnd, screen);
}
</code></pre>
<p>Evtl kann sich jemand die mühe mache und kurz ein Bsp posten.</p>
<p>mit dem hier</p>
<pre><code class="language-cpp">free(&amp;fheader);
</code></pre>
<p>stürzt das Programm nach dem ersten Schleifendurchlauf ab</p>
<p>vielen Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230287</guid><dc:creator><![CDATA[rufux]]></dc:creator><pubDate>Thu, 05 Jul 2012 12:28:19 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 12:36:54 GMT]]></title><description><![CDATA[<p>uint8_t *bmpBuffer = new uint8_t<br />
hast du wohl vergessen...</p>
<p>free brauchst du in C++ nicht, dafür gibts delete. Außerdem kannst du keine Stackobjekte free'n. Du solltest dir nochmal genau anschauen, wie die Speicherverwaltung bei C++ funktioniert.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230293</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Thu, 05 Jul 2012 12:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 12:42:32 GMT]]></title><description><![CDATA[<p>Du brauchst auf jeden Fall <strong>mindestens</strong> (hab nur flüchtig drübergeschaut) an geeigneter Stelle:</p>
<p>ReleaseDC(0, screen);<br />
DeleteObject(bmp);<br />
DeleteDC(target);<br />
delete []bmpBuffer;</p>
<p>Die ersten drei sind für Windows-Ressourcen, die Du anforderst (dazu empfiehlt sich immer ein Blick in die MSDN!), das letzte für dynamisch via new angeforderten Speicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230294</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 05 Jul 2012 12:42:32 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 12:47:42 GMT]]></title><description><![CDATA[<p>Also entweder ReleaseDC (auf das Handle, das du per GetDC erhalten hast) oder DeleteDC (CreateCompatibleDC).<br />
Mit vector ist es auch nicht komplizierter:</p>
<pre><code class="language-cpp">// ab deiner Zeile, die zu ersetzen ist:
//uint8_t *bmpBuffer = new uint8_t[bminfo.bmiHeader.biSizeImage];
vector&lt;uint8_t&gt; bmpBuffer(bminfo.bmiHeader.biSizeImage); 

x = GetDIBits(target, bmp, 0, height, &amp;bmpBuffer[0], &amp;bminfo, DIB_RGB_COLORS); 
assert(x); 

BITMAPFILEHEADER fheader; 
fheader.bfType = 0x4D42; 
fheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bminfo.bmiHeader.biSizeImage; 
fheader.bfReserved1 = 0; 
fheader.bfReserved2 = 0; 
fheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 

std::ofstream bmp_file(&quot;file.bmp&quot;, std::ios_base::binary); 

bmp_file.write((const char *) &amp;fheader, sizeof(fheader)); 
bmp_file.write((const char *) &amp;(bminfo.bmiHeader), sizeof(bminfo.bmiHeader)); 
bmp_file.write((const char *) &amp;bmpBuffer[0], bminfo.bmiHeader.biSizeImage); 

DeleteObject(bmp);
DeleteDC(target);
ReleaseDC(NULL, screen);
</code></pre>
<p>Aber wie geschrieben, kleine Wrapperklassen sind dem vorzuziehen und schnell geschrieben:</p>
<pre><code class="language-cpp">struct HBitmapWrapper
{
	HBitmapWrapper(HBITMAP bm) : bm(bm) {}
	~HBitmapWrapper() {DeleteObject(bm);}
	operator HBITMAP() {return bm;} 
private:
	HBITMAP bm;
	HBitmapWrapper(const HBitmapWrapper&amp;);
	HBitmapWrapper&amp; operator=(const HBitmapWrapper&amp; b);
};
</code></pre>
<p>Und im Code</p>
<pre><code class="language-cpp">HBitmapWrapper bmp=CreateCompatibleBitmap(screen, width, height);
</code></pre>
<p>Natürlich kann das noch weiter ausgebaut werden: Template um auch andere Handles zu verwalten (HFONT, HBRUSH, HPEn usf.), Funktion zum Freigeben mitliefern etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230298</guid><dc:creator><![CDATA[mapper]]></dc:creator><pubDate>Thu, 05 Jul 2012 12:47:42 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 12:53:31 GMT]]></title><description><![CDATA[<p>Nachtrag:<br />
Da Deine Funktion ja dann jede Sekunde aufgerufen wird, solltest Du im Taskmanager beobachten können, ob die Anzahl der benötigten GDI-Objekte immer größer wird. Falls nicht, gibst Du sie wohl alle säuberlich wieder frei, falls doch, hast Du entweder eins vergessen, oder beim Freigeben etwas falsch gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230299</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 05 Jul 2012 12:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 12:53:43 GMT]]></title><description><![CDATA[<p>Und, nicht vergessen: Bei voneinander abhängigen Windows-Ressourcen immer in umgekehrter Reihenfolge löschen: Wenn du eine Bitmap mit einem HDC verknüpfst, dann muss am Ende erst der HDC gelöscht werden, dann die Bitmap.</p>
<p>Und der Screen wird nicht gelöscht, sondern muss freigegeben werden:<br />
CreateCompatibleDC &lt;--&gt; DeleteDC<br />
GetDC &lt;--&gt; ReleaseDC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230301</guid><dc:creator><![CDATA[Not forgetting]]></dc:creator><pubDate>Thu, 05 Jul 2012 12:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Thu, 05 Jul 2012 13:25:04 GMT]]></title><description><![CDATA[<p>Auf gültige Rückgabewerte zu prüfen ist auch immer eine gute Idee...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230309</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 05 Jul 2012 13:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Sat, 07 Jul 2012 22:09:31 GMT]]></title><description><![CDATA[<p>Danke erstmal für die Hinweise.</p>
<p>Das mit dem Wrapper und dem vector hat nicht funktioniert.</p>
<p>Scheinbar bin ich zu unwissend was das ganze angeht.</p>
<p>In Java hat das alles funktioniert <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="😉"
    /> (wahrscheinlich darf man das Wort hier nicht nennen)</p>
<p>so sieht mein Code aus</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;cstdint&gt;
#include &lt;cassert&gt;

#include &lt;Windows.h&gt;

void capture();
char c;

void main (){

	int i =0;
	while(1){
	i++;

	std::cout&lt;&lt;i&lt;&lt;std::endl;

	capture();
	remove(&quot;file.bmp&quot;);
	}

}
void capture()
{
	HWND hWnd = FindWindow(NULL, NULL);
    HDC screen = GetDC(NULL);
    HDC target = CreateCompatibleDC(screen);

    /*uint32_t width = GetSystemMetrics(SM_CXSCREEN);
    uint32_t height = GetSystemMetrics(SM_CYSCREEN);*/

	uint32_t width = 640;
	uint32_t height= 480;

    HBITMAP bmp = CreateCompatibleBitmap(screen, width, height);

    SelectObject(target, bmp);

    int x = 0;
    x = BitBlt(target, 0, 0, width, height, screen, 10,10, SRCCOPY | CAPTUREBLT);
    assert(x);

	BITMAPINFO bminfo;
    bminfo.bmiHeader.biBitCount = 16;
    bminfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bminfo.bmiHeader.biCompression = BI_RGB;
    bminfo.bmiHeader.biPlanes = 1;
    bminfo.bmiHeader.biWidth = width;
    bminfo.bmiHeader.biHeight = height;
    bminfo.bmiHeader.biSizeImage = width * 4 * height; // must be DWORD aligned
    bminfo.bmiHeader.biXPelsPerMeter = 0;
    bminfo.bmiHeader.biYPelsPerMeter = 0;
    bminfo.bmiHeader.biClrUsed = 0;
    bminfo.bmiHeader.biClrImportant = 0;

    uint8_t *bmpBuffer = new uint8_t[bminfo.bmiHeader.biSizeImage];

	x = GetDIBits(target, bmp, 0, height, bmpBuffer, &amp;bminfo, DIB_RGB_COLORS);
    assert(x);

    BITMAPFILEHEADER fheader;
    fheader.bfType = 0x4D42;
    fheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bminfo.bmiHeader.biSizeImage;
    fheader.bfReserved1 = 0;
    fheader.bfReserved2 = 0;
    fheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    std::ofstream bmp_file(&quot;file.bmp&quot;, std::ios_base::binary);

    bmp_file.write((const char *) &amp;fheader, sizeof(fheader));
    bmp_file.write((const char *) &amp;(bminfo.bmiHeader), sizeof(bminfo.bmiHeader));
    bmp_file.write((const char *) bmpBuffer, bminfo.bmiHeader.biSizeImage);
    bmp_file.close();
	ReleaseDC(NULL, screen);
	DeleteDC(target); 
	DeleteObject(bmp);

}
</code></pre>
<p>So habe ich es jetzt.<br />
Er läuft jetzt schon deutlich länger.</p>
<p>Nur ich kann quasi zusehen, wie er den RAM voll schreibt und nicht mehr entleert.</p>
<p>Evtl. kann mir jemand noch einen Hint geben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Danke schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230939</guid><dc:creator><![CDATA[rufux]]></dc:creator><pubDate>Sat, 07 Jul 2012 22:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Sat, 07 Jul 2012 22:15:35 GMT]]></title><description><![CDATA[<p>Es fehlt immer noch<br />
delete [] bmpBuffer;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230941</guid><dc:creator><![CDATA[Belli_off]]></dc:creator><pubDate>Sat, 07 Jul 2012 22:15:35 GMT</pubDate></item><item><title><![CDATA[Reply to Screenshot mit GDI in Endlosschleife beendet sich nach x durchläufen on Sat, 07 Jul 2012 23:00:12 GMT]]></title><description><![CDATA[<p>das sieht gut aus...<br />
danke...</p>
<p>ich werde jetzt die nacht über testen;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230947</guid><dc:creator><![CDATA[rufux]]></dc:creator><pubDate>Sat, 07 Jul 2012 23:00:12 GMT</pubDate></item></channel></rss>