Screenshot



  • Hallo,

    Ich habe folgendes Problem. Die Aufgabe einer Semsterarbeit beseht darin, eine Anleitung für ein DOS Programm zuschreiben. Nun wäre es sehr angenehm, wenn es eine Möglichkeit gäbe Screenshots zu erstellen. Da die Taste deaktiviert ist, habe ich ein kleines Programm geschrieben in dem ich die Methoden der FAQ ausprobiert habe, funktioniert im Normalfall auch. Nur wenn ich das DOS Programm am laufen habe, von dem ich die Screenshots benötige, wird nur ein schwarzes Bitmap abgespeichert. Hat da jemand einen Lösungsvorschlag?



  • Hallo

    Wenn ich die Eingabeaufforderung (cmd) offen habe, kann ich mit der Druck-Taste sehr wohl einen vollständigen Screenshot machen, also sollte auch die FAQ-Lösung laufen.
    Schau doch mal im Netz nach Freeware-Programm für Screenshots.

    bis bald
    akari



  • Erstmal Danke für die schnelle Antwort.

    Wenn ich nur das cmd ausführe, dann funktioniert die Methode einwandfrei, blos bei dem zu dokumtierenden Programm nicht. Wenn ich das Prgramm starte wird es im Vollbildmodus gestartet. Ich habe auch scho versucht mit ALT+ENTER das Programm in den Fenstermodus zu bringen, doch dann wird es leider nur minimiert, aber ich bringe es nicht in den Fenstermodus. Freeware Screenshot Programme habe ich auch schon versucht, doch der Shortcut um den Screenshot auzulösen ist deaktiviert, sobald mein Programm den Focus hat. Ich habe auch ein anders gefunden das ohne Shortcut funktioniert, doch leider war auch da das Erbegins ein schwarzes Viereck.

    [Edit]
    Ich habe mir gedacht, ob es ne Möglichkeit gibt direkt den Speicherinhalt der Grafikkarte auszulesen und dann in einem bmp abzuspeichern?



  • Sieh dir dazu doch mal aus der FAQ nochmal die Sache mit Tasten Systemweit abfangen an (Am besten Version 2 RegisterHotkey).
    Dann fängst du das Drücken von z.B. einer F-Taste ab, und erzeugst deinen Screenshot.



  • @ScShooter

    Wenn ich die Taste abfange, müsste ich sie ja anschliessend an das Screenshot Programm weiter leiten, die Möglichkeit die ich kenne um dies zu bewerkstelligen wäre folgende:

    HWND hwnd = ScreenshotHandle;
    if(IsWindow(hwnd))
    {
       SetForegroundWindow(hwnd);
       keybd_event(VK_F3, 0, 0, 0);
       keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0);
    }
    

    Das Problem ist nun, dass mit SetForegroundWindow das Screenshot Programm zum aktiven Fenster würde, wodurch sich das zu dokumentierende Programm minimiert, und der Screenshot würde von allem anderen, nur nicht vom gewünschten erzeugt werden...

    Ich denke ich werde dann doch die primitive Lösung mit der Digicam nehmen. Diese ist zwar nicht befriedigend, funktioniert dafür 100%





  • Okay, werde das mal genauer betrachten, obwohl ich nicht sehr optimistisch bin, dass die freeware Screenshots Porgramme, den Screenshot erstellen können und nicht auch ein schwarzes Fenster zurückgebe...



  • Entweder stehe ich Momentan ziemlich auf dem Schlauch, oder aber der Link beschreibt nur wie ich die Hotkeys abfange und nicht an eine externe Anwendung weiterleite?



  • http://www.marquardtnet.info/cecke/dlls.3/3_chhook.html

    probier das, wenn du mit dem anderen nicht klar kommst



  • Was willst du an eine externe Anwendung leiten ?
    Innerhalb von 2 Minuten aus der FAQ zusammenkopiert.
    Brauchst nurnoch das Speichern bzw. Drucken des Bildes einfügen und fertig.

    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Dialogs.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
       TScrollBox *ScrollBox1;
       TImage *Image1;
       TSaveDialog *SaveDialog1;
       void __fastcall FormCreate(TObject *Sender);
       void __fastcall FormDestroy(TObject *Sender);
    private:	// Anwender-Deklarationen
    unsigned int HotKeyIdentifier_uint;
    unsigned int HotKeyModifier_uint;
    void __fastcall WMHotKey(TMessage &Msg);
    public:		// Anwender-Deklarationen
       __fastcall TForm1(TComponent* Owner);
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_HOTKEY, TMessage, WMHotKey)
    END_MESSAGE_MAP(TForm)
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    HotKeyIdentifier_uint = GlobalAddAtom("F3-Hotkey");
    HotKeyModifier_uint = 0; 
    RegisterHotKey(Handle, HotKeyIdentifier_uint, HotKeyModifier_uint, VK_F3); //Hotkey registrieren.   
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    UnregisterHotKey(Handle, HotKeyIdentifier_uint); //HotKey löschen 
    GlobalDeleteAtom(HotKeyIdentifier_uint);         //HotKey Identifier löschen
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::WMHotKey(TMessage &Msg) 
    { 
        TForm::Dispatch(&Msg);
        TCanvas* canvas = new TCanvas(); 
        canvas->Handle = GetWindowDC(GetDesktopWindow());
        TRect Dest = Image1->ClientRect;
        TRect Source; 
        GetWindowRect(GetDesktopWindow(), (LPRECT)&Source);
        Source = Rect(0, 0, Source.Right - Source.Left, Source.Bottom - Source.Top);
        Image1->Canvas->CopyRect(Dest, canvas, Source);
        delete canvas;
    }
    


  • Okay, wie ich sehe haben wir nun ein verständnis Problem. Das Problem liegt grundsätzlich darin, dass ich einen Screenshot erzeugen muss, von einem MS-DOS Programm, welches sich nicht im Fenstermodus starten lässt. Wenn ich mit den in der FAQ beschriebenen Methoden einen Screenshot erzeuge erhalte ich nur ein schwarzes Rechteck. Es geht hier nicht darum Tasten systemweit abzufangen. Dies wäre bloss eine Alternative gewesen, um ein Freeware Screenshot Programm einzusätzen und den Shortcat an dieses weiterzuleiten, da bei den Screenshot bis Programm die ich bis jetzt versucht habe, der shortcut durch das DOS Programm deaktiviert wird.
    Kurz: es geht hier um das erzeugen eines Screenshots, der bei einer MS-DOS Anwendung nicht nur eine bildschirmgrosses schwarz gefülltes Rechteck liefert.


Anmelden zum Antworten