Screenshots [Erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Screenshots [Erledigt]

Beitrag von Jan »

Hallo,

mein Kunde hat sich ein Kommunikationssystem in seine Software gebaut. Alle Reklamationen, Fragen, etc. sollen darüber abgewickelt werden, es ist eine Rückverfolgung, Temrineinhaltung, etc. da eingebaut. Jetzt fehlt ihm nur noch eines: Screenshots. Es ist grob angedacht das diese in einer dbf gespeichert werden (V-Felder in FOXCDX eigenen sich hervorragend dafür), und dann aus dem Kommunikationssystem per Link o. ä. aufgerufen werden können.

Nur: Wie mache ich das am besten? Wie erstelle ich einen Screenshot, der dann automatisch gespeichert werden kann? Ich habe schon mit Übergabe aus Xbase++ in die Zwischenablage bzw. Auslesen der Zwischenablage gearbeitet, das wäre nicht das Problem. Ich muß nur erstmal einen für den Mitarbeiter frei markierbaren Bereich des Bildschirms in die Zwischenablage rein bekommen.

Hat jemand da eine gute Idee für mich?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Screnshots

Beitrag von AUGE_OHR »

Jan hat geschrieben:Ich muß nur erstmal einen für den Mitarbeiter frei markierbaren Bereich des Bildschirms in die Zwischenablage rein bekommen.
kannst du das genauer definieren ...

wenn du z.b. ein Browse meinst wäre das "einfach" ( :rowPos / :colPos )
wenn du eine Static (Groupbox) als Parent hast könnte man alle Childs "erfassen"

wenn das nun völlig frei sein soll müsstest du die Maus auf :LbDown / : LbUp prüfen und die Positionen ermitteln.
das ganze ist wie beim DragDrop , hier ein Beispiel

Code: Alles auswählen

METHOD DDCal:LbDown( aPos )
LOCAL lTT
LOCAL nEvent, mp1, mp2, oXbp

   ::lDragDrop  := .F.

   DO WHILE .T.

      // Timer simulieren
      //
      nEvent := APPEVENT( @mp1, @mp2, @oXbp, 20 )
      DO CASE
            // noch eine Aktion mit der Maus
            //
         CASE nEvent == xbeM_LbDblClick
            ::_LbDblClick( aPos )
            EXIT

            // hier "up"
            //
         CASE nEvent == xbeM_LbUp
            EXIT

            // ist dann kein Dragdrop
            //
         CASE nEvent == xbeM_LbDown
            EXIT

            // mit verzögerrung !!!
            //
         CASE nEvent == xbe_None                            // Timeout 0.500 sec
            ::lDragDrop := .T.
            EXIT
         OTHERWISE
            oXbp:handleEvent( nEvent, mp1, mp2 )
      ENDCASE
   ENDDO

   IF ::lDragDrop = .T.
      IF !::StartDragDrop( aPos )
         ::LbDown( aPos ) :LbUp( aPos )
      ENDIF
   ENDIF

RETURN self
wenn du das Rechteck hast kannst du den Teil aus dem ganzen Bild mit GraBitBlt() "ausschneiden" und damit dein Bitmap erstellen.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Screnshots

Beitrag von brandelh »

wir nutzen für Hardcopys (komplett oder Bildschirmteile - auch in Dateien) dieses Programm:

http://www.info.hardcopy.de/

Ob man es fernsteuern kann weiß ich nicht, aber für SAP werben sie mit Integration.
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Screnshots

Beitrag von Herbert »

Die PrintScreen-Taste bringt nicht viel (ganzer Bildschirm)? Kann man aber die Alt-PrintScreen-Taste abfangen? (aktuelles Fenster)? Da hast du ja den Printscreen-Inhalt bereits in der Zwischenablage und müsstes dies nur noch selber dann Zwischenspeichern und in das Tabellenfeld ablegen...

Für einen dynamisch gegebenen Bereich brauchst du aber ein Tool, z.B. Snagit oder das von Windows mitgegebene Snipping-Tool. So muss eben der User das Ablegen in die Zwischenablage selber auslösen und dein Programm weiss davon dann nichts...
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Screnshots

Beitrag von Herbert »

brandelh hat geschrieben:wir nutzen für Hardcopys (komplett oder Bildschirmteile - auch in Dateien) dieses Programm:
http://www.info.hardcopy.de/
Ob man es fernsteuern kann weiß ich nicht, aber für SAP werben sie mit Integration.
Wuah, ist das eine katastophale Webseite (past zu SAP)...
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Screnshots

Beitrag von Tom »

Dafür gibt es die Beispielfunktion "GraSaveScreen" in der Alaska-Installation. Die Rückgabe ist eine XbpBitmap. Die kann man in allen möglichen Formaten speichern. Alles kein Ding. Schwierig wird eher der "frei wählbare Bereich". Dafür müsste man die Software in einen Capture-Modus umschalten und mit GRA_Funktionen ein bewegliches Rechteck auf den gesamten Desktop malen, das sich mit der Maus ändert, bis irgendeine Taste gedrückt wird. Aber auch kein Ding.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Screnshots

Beitrag von Jan »

Danke für eure Tipps. Mein Kunde ist jetzt mit einem erweiterten Gedanken um die Ecke gekommen, der das Ganze einfacher gestaltet/gestalten könnte. Wir verwenden einfach ein Screenshot-Programm, weil man da dann auch gleich farbige Markierungen oder Textkommentare einfügen kann. Das ganze dann in die Zwischenablage setzen, und die kann ich ja locker auslesen.

Mein Problem: Das Programm wird mit DRUCK gestartet. Irgendwie biegen die die Taste um. Damit ich das automatisch steuern kann müßte ich jetzt ein keyboard Chr(drucktaste) oder einen PostAppEvent(drucktaste) starten. Ich finde für beides aber keinen Code, immer nur STRG+DRUCK. Geht das wirklich nicht?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Screnshots

Beitrag von Herbert »

Die Print-Taste ist Hex 2A (dec=42). Zum Vergleich, Enter ist 0D, also 13. Eventuell kannst du damit eine Variable definieren...
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Screnshots

Beitrag von AUGE_OHR »

Jan hat geschrieben:... müßte ich jetzt ein keyboard Chr(drucktaste) oder einen PostAppEvent(drucktaste) starten.
Ich finde für beides aber keinen Code, immer nur STRG+DRUCK. Geht das wirklich nicht?
Nein es geht "so" nicht. Man nimmt dafür die "virtuellen" Key-Codes

Code: Alles auswählen

#include "dll.ch"

#define KEYEVENTF_KEYUP 0x02
#define VK_MENU         0x12
#define VK_SNAPSHOT     0x2C

PROC main
    wait "Press any key to copy the whole screen"
    keybd_event(VK_SNAPSHOT, 1, 0, 0)

    wait "Press any key to copy the focused window"
    keybd_event(VK_MENU, 0, 0, 0)
    keybd_event(VK_SNAPSHOT, 0, 0, 0)
    keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0)
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0)
    wait
RETURN

DLLFUNCTION keybd_event(mvkey, nscan, flags, xtra) USING STDCALL FROM USER32.DLL
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Screenshots [Erledigt]

Beitrag von Jan »

Hallo Jimmy,

ja, das klappt sauber. Vielen Dank für den Code.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten