C++ Screenshot vom Teilbereich des Bildschirms machen

0ahnung

Cadet 3rd Year
Registriert
Nov. 2012
Beiträge
37
Hallo Zusammen,
ich habe ein "kleines" Projektchen, wo ich nicht weiter komme und eure Hilfe brauche.
Ich möchte gerne ein Screenshot vom Teilbereich des Bildschirms machen und diese fürs erste auf der HDD abspeichern.
Und das ganze 30 mal pro sekunde.
Später soll es so sein dass man den Teilbereich festlegen kann. Und nicht mehr auf HDD speichert sondern im Programm weiter verarbeitet.

Im Anhang habe ich mein Projekt angeheftet (VS 2010).
Wenn ich das Programm laufen lasse tut sich etwas und im Projektordner wird ein BMP Datei erstellt, aber ist nichts drauf, nur 1KB groß.

Damit das Programm laufen konnte, musste ich ein paar Sachen in Extras -> Optionen und in Projekt Optionen einstellen (siehe bitte Anhang).

Was ist da faul ? Könnte ihr mir Bitte Helfen.
Gruß
 

Anhänge

  • ScreenShot.zip
    ScreenShot.zip
    10 MB · Aufrufe: 280
  • Extras Optionen Debugging Systemeigen.PNG
    Extras Optionen Debugging Systemeigen.PNG
    26,6 KB · Aufrufe: 301
  • Konfigurationseigenschaften Allgemein.png
    Konfigurationseigenschaften Allgemein.png
    44,7 KB · Aufrufe: 291
Dein Projekt habe ich mir gerade nicht angeschaut, aber schon in der Beschreibung von dir ein paar Punkte bemerkt:
1.) Kannst du ein Debugger verwenden? (Also vom Können her, VS 2010 hat definitiv einen)
2.) 1 kB ist nicht "nichts"
3.) High Performance screen capture geht am Besten über Schnittstellen wie https://docs.microsoft.com/de-de/wi...i1_5/nf-dxgi1_5-idxgioutput5-duplicateoutput1
4.) Warum nicht VS 2017?
5.) Ich hab den Verdacht, dass du mglw. etwas überfordert von deinem kleinen Programm sein könntest.

Hab mir deine Zip mal angeschaut:
6.) Die .sdf wird von VS erstellt, die kannst du weglassen in ner ZIP
7.) Der relevante Code ist nur 80 Zeilen lang, das wäre auch direkt in Code -Tags hier im Forum gegangen.
8.) Du willst wirklich mit emulierten Printscrn 30 FPS erreichen?
9.) Meine Vermutung: hdc und h sind nicht kompatibel, prüf mal von GetDIBits (und von allen anderen Funktionen) den Rückgabewert.
 
Hallo, vielen Dank für die schnelle Antwort.

1.) Debugger starten und einzelschritte machen, aber verstehe nicht was die Schritte machen und machen sollten. Diesen Sourcecode habe ich aus dem Internet.
3.) Gibt es dafür Beispielcode ?
4.) Inwiefern ist VS 2017 besser als VS 2010 ? Ist es für mein Projekt relevant? Ich komm mit der Oberfläche der neueren VS nicht klar, ist irgendwie überfüllt.
5.) Da ist was dran. Deshalb bin ich ja hier und wollte eure Hilfe, wenn möglich.
6.) Okay mach ich
7.) Es war mir wichtig, dass ihr auch die Projekteinstellungen bekommt.
8.) Okay wenn du es so schreibst, denke ich dass es so nicht geht.
9.) okay schaue ich mir an
 
1.) Du kannst den Wert von Variablen anschauen, das gibt dir den Hinweis, was falsch ist. (Mit der Maus drüberfahren bzw. unter dem "Auto" oder "Lokal" Fenster, oder eigene Ausdrücke verwenden ("Überwachen 1")).
3.) Keine Ahnung, das lässt sich gut mit DirectX kombinieren, also hilft ein kleiner Überblick über DirectX. Allerdings ist das schon eher kompliziert (COM-Objekte, Factories, insgesamt DirectX).
4.) Ist nicht zwingend nötig, viele praktische Funktionen gibt es halt mit den neuen Versionen.

Zu 3.)
C++:
#include <iostream>
#include <fstream>
#include <d3d11.h>
#include <dxgi1_2.h>
using namespace std;
#pragma comment (lib,"d3d11.lib")
#pragma comment (lib,"dxgi.lib")
#include <Windows.h>
void check_result(HRESULT hr,const char*msg) {
if (hr != S_OK) {
  cerr<<"Error occured: "<<msg<<"\n";
}
}
#define CHECK(a) check_result(a,#a)
int main(void)
{
IDXGIFactory1 *pfac;
CHECK(CreateDXGIFactory1(__uuidof(pfac),(void**)&pfac));
IDXGIAdapter1 *pad;
CHECK(pfac->EnumAdapters1(0, &pad));
IDXGIAdapter2 *pad2;
CHECK(pad->QueryInterface(&pad2));
IDXGIOutput *pOut;
CHECK(pad2->EnumOutputs(0, &pOut));
IDXGIOutput1 *pOut1;
CHECK(pOut->QueryInterface(&pOut1));

ID3D11Device*pDev;
ID3D11DeviceContext*pCtx;
D3D_FEATURE_LEVEL flevel;
CHECK(D3D11CreateDevice(pad, D3D_DRIVER_TYPE_UNKNOWN, 0, 0, nullptr, 0, D3D11_SDK_VERSION, &pDev, &flevel, &pCtx));
IDXGIOutputDuplication*pDup;
pOut1->DuplicateOutput(pDev,&pDup);

//for(;;)
{
  DXGI_MAPPED_RECT rect;
  CHECK(pDup->MapDesktopSurface(&rect));//Only possible, when pDup->GetDesc DesktopInSystemMemory true
  ofstream f("desktop.bin");
  f.write((char*)rect.pBits, 3840 * 2160 * 4);
  CHECK(pDup->UnMapDesktopSurface());
}
}
 
so jetzt habe ich auch VS 2017.
Wenn ich das obige Programm comiliere dann bekomme ich folgende Fehlermeldung: siehe bitte Anhang.
Ergänzung ()

Und Ausgabefenster wird das angezeigt, siehe bitte Anhang, weil hier einfügen ist es zu lang. Oder sollte ich doch hier einfügen, damit man es in der Suche finden kann, ich bin mir nicht sicher.
 

Anhänge

  • Zugriffsverletzung.JPG
    Zugriffsverletzung.JPG
    44,5 KB · Aufrufe: 254
  • DOS Ausgabe.JPG
    DOS Ausgabe.JPG
    19 KB · Aufrufe: 238
  • Ausgabe.txt
    Ausgabe.txt
    5,7 KB · Aufrufe: 282
  • Variablen.JPG
    Variablen.JPG
    101,2 KB · Aufrufe: 238
Zuletzt bearbeitet:
Lesen ja, verstehen leider sehr schwer. Mir fehlt einfach viel zu viel know-how. Ich krieg nicht mal einfache Screenshot hin mit Beispielcode :(. Und das ist nur ein Teil meines Projektes.
Vielen Dank dass du versuchst mir zu Helfen, aber ich glaube das hat so kein Wert.
Kennst du dich mit OpenCV und Mustererkennung gut aus ?
 
Zuletzt bearbeitet:
Ich kann nur C, Mikrocontroller ein bischen.
VS C++, DirectX,... ist viel komplexer mit all den fertigen Klassen und Bibliotheken und OOP usw.

Wenn ich dir mein Projekt erkläre, würdest du es für relativ kleines Geld programmieren?
 
okay, schade.
Kannst du jemanden empfehlen, der es machen könnte und würde ?
 
Zurück
Oben