Seite 1 von 1

Screenshots [Erledigt]

Verfasst: Mo, 07. Mär 2016 10:24
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

Re: Screnshots

Verfasst: Mo, 07. Mär 2016 11:01
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.

Re: Screnshots

Verfasst: Mo, 07. Mär 2016 11:23
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.

Re: Screnshots

Verfasst: Mo, 07. Mär 2016 11:49
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...

Re: Screnshots

Verfasst: Mo, 07. Mär 2016 11:51
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)...

Re: Screnshots

Verfasst: Mo, 07. Mär 2016 13:32
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.

Re: Screnshots

Verfasst: Mo, 07. Mär 2016 14:02
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

Re: Screnshots

Verfasst: Mo, 07. Mär 2016 14:45
von Herbert
Die Print-Taste ist Hex 2A (dec=42). Zum Vergleich, Enter ist 0D, also 13. Eventuell kannst du damit eine Variable definieren...

Re: Screnshots

Verfasst: Mo, 07. Mär 2016 21:15
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

Re: Screenshots [Erledigt]

Verfasst: Di, 08. Mär 2016 8:49
von Jan
Hallo Jimmy,

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

Jan