Screenshot machen?! - Fehler :-(



  • Was habe ich falsch gemacht?? Ich möchte ein Screenshot programm machen. Mir ist klar, dass es im Load steht.

    Helft mir bitte!

    #Anfänger#

    Danke!

    #pragma once
    
    namespace fgjfgjfgjrj {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	/// <summary>
    	/// Zusammenfassung für Form1
    	///
    	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    	///          arbeiten, die diesem Formular zugewiesen sind.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->SuspendLayout();
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 262);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    
    				 //Hook einbauen, um F7 Taste abzufangen
    				 // Hook fehlt
    
    				 //Bitmap erstellen
    
    void ScreenShotDesktop() {
      int     nWidth  = GetSystemMetrics(SM_CXSCREEN);
      int     nHeight = GetSystemMetrics(SM_CYSCREEN);
      HWND    hWnd    = ::"C:\ordner\";
      HDC     hdc     = ::GetDC(hWnd);
      HDC     memDC   = ::CreateCompatibleDC(hdc);
      HBITMAP hbm     = ::CreateCompatibleBitmap(hdc, nWidth, nHeight);
      HBITMAP hbmOld  = (HBITMAP)::SelectObject(memDC, hbm);
      char sError[128];
    
      if(!::BitBlt(memDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY)) {
            //ERROR
        }
    
      BITMAPINFO bmi;
      ZeroMemory(&bmi, sizeof(bmi));
      bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
      bmi.bmiHeader.biWidth        = nWidth;
      bmi.bmiHeader.biHeight       = nHeight;
      bmi.bmiHeader.biBitCount     = 24;
      bmi.bmiHeader.biPlanes       = 1;
      bmi.bmiHeader.biCompression  = BI_RGB;
      bmi.bmiHeader.biSizeImage    = 32 * nWidth * nHeight / 8;
    
        BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage];
    
        if(!::GetDIBits( memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS)) {
            //ERROR
        }
    
        BITMAPFILEHEADER bfh;
      bfh.bfType      = ('M' << 8) + 'B';
      bfh.bfSize      = sizeof(BITMAPFILEHEADER)  +
                        bmi.bmiHeader.biSizeImage +
                        sizeof(BITMAPINFOHEADER);
      bfh.bfReserved1 = 0;
      bfh.bfReserved2 = 0;
      bfh.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
        if(!SetDIBits(memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS)) {
        wsprintf(sError,"Error: SetDIBits (Code %i)\r\n",GetLastError());
        OutputDebugString(sError);
      }
    
    //  BitBlt(*hDC, 0, 0, GetSystemMetrics(SM_CXSCREEN)-1,GetSystemMetrics(SM_CYSCREEN)-1,memDC, 0, 0, SRCCOPY);
    
      HANDLE hfile = CreateFile( "__TMP__SCRNSHOT__2357__.BMP",
                                 GENERIC_WRITE,
                                 0,
                                 0,
                                 CREATE_ALWAYS,
                                 0,
                                 0 );
    
      if(hfile==INVALID_HANDLE_VALUE) {
        //ERROR
      }
      DWORD dwWritten;
      WriteFile(hfile,&bfh,           sizeof(bfh),               &dwWritten, NULL);
      WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER),  &dwWritten, NULL);
      WriteFile(hfile,pbBits,         bmi.bmiHeader.biSizeImage, &dwWritten, NULL);
    
      CloseHandle(hfile);
      ::SelectObject(memDC, hbmOld);
      ::DeleteDC(memDC);
      ::ReleaseDC(hWnd,hdc);
      ::DeleteDC(hdc);
      ::DeleteObject(hbm);
      ::DeleteObject(hbmOld);
      ::DeleteObject(hWnd);
      hbm=NULL;
      hbmOld=NULL;
      delete[] pbBits;
    } 
    
    				 // Ende im Gelände
    			 }
    	};
    }
    


  • Mischung von C++/CLI und C++ -> Also mindestens falsches Unterforum
    ~OT: Endlich mal ein Ausgleich für die ganzen C++ Posts in C++/CLI~

    Nach dem Syntaxhighlighting solltest du nochmal nachscauen was Escapesequenzen sind.
    ' ::"C:\ordner\" ' geht glaube ich nicht - bzw. sollte man so nicht schreiben.
    Außerdem ist es nicht möglich funktionen zu verschalteln.

    Außerdem: "Geht nicht - gibts nicht"
    Was sind deine Fehlermeldungen - was passiert genau - genau nicht? "Geht nicht" ist keine genaue Fehlerbeschreibung.

    Außerdem hast du vermutlich nicht die Header eingebunden.

    Edit: +++Du brauchst nicht extra darauf hinweisen, dass du Anfänger bist, das demotiviert einen potentiellen Helfer.



  • Falsch:

    HWND    hWnd    = ::"C:\ordner\";
    

    Besser:

    HWND    hWnd    = ::"C:\\ordner\\";
    

    Ob es richtiger in dem Sinne ist, weiß ich nicht. Du bist im falschen Unterforum. Wir sprechen nur reines C++ ohne CLI-Zeugs.



  • Danke,

    ich möchte hier nicht alle 130 Fehler posten, da es Stunden dauern würde, alle zu übertragen und sauber zu schreiben.

    Ich möchte auch nicht den Forenmitliedern den Mut nehmen zu schreiben. Es sollte nur als Hinweis gedacht sein, dass ich nicht 30000 Fachbegriffe brauche, da reichen mir auch simple Erklärungen (müssen aber nicht alzuweit ausgeholt werden, da ich andere Programmiersprachen auch kann).

    Gruß

    PS: Ich hoffe, dass irgendein Mod oder auch Admin den Thread verschieben könnte.

    Schon mal Danke dafür 😉 🙂



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du musst nicht alle Fehler posten. Wenn du so viele hast, sind das meist nur Folgefehler des ersten.
    Und abschreiben musst du die Fehler auch nicht - Copy & Paste ist eine nette Erfindung.



  • - grundlagen -

    keyboard-freak schrieb:

    ich möchte hier nicht alle 130 Fehler posten, da es Stunden dauern würde, alle zu übertragen und sauber zu schreiben.

    davon sind ca. 20% brauchbar - der Rest sind Folgefehler weil sich der Compiler verrannt hat

    • ersten Fehler nehmen
    • analysieren
    • korregieren
    • compilieren

    das Ganze so lange wiederholen bis kein Fehler mehr da ist



  • hi,

    lokale Funktionen sind nicht zulässig (in dieser Konstellation), diese müssen (sollten) in der Form als "public" generiert werden

    dazu würde ich mal auf ein Mischung von MFC und CLI tippen


Anmelden zum Antworten