Screenshot-Ersteller

  • Hallo,

    ich habe ein kleines Programm zum erstellen von Screenshots erstellt.

    Update 1.1 :)
    Update 1.2 Funktionen:

    • Screenshots von einem Teilbereich des Desktops erstellen. Auswahl mit Vorschau.
    • Screenshots von einem Fenster erstellen. Auswahl über bequeme Liste.

    Update 1.3 Verbesserungen:

    • Screenshot von einem Fenster erstellen Funktion korrigiert.

    Update 1.4 Verbesserungen:

    • Mann kann den Bilderorder per Tray-Menü öffnen
    • "Nummer der letzten Datei auslesen"-Funktion (Startvorgang) verbessert

    Update 1.5 Verbesserungen:

    • Verbesserung der _foto() Funktion.
    • Korrektur des Startvorgangs
    Bedinung
    • F2: Neuer Screenshot von einem Teilbereich des Desktops.
    • F3: Neuer Screenshot von einem Fenster.
    • F4: Ende
    Quellentext
    [autoit]

    #Region ---Include---
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <ScreenCapture.au3>
    #include <Misc.au3>
    #include <GuiListBox.au3>
    #include <Array.au3>
    #EndRegion ---Include---

    [/autoit] [autoit][/autoit] [autoit]

    #Region ---Optionen---
    Opt("TrayAutoPause", 0)
    Opt("TrayIconDebug", 0)
    Opt("TrayIconHide", 0)
    Opt("TrayMenuMode", 1)
    Opt("TrayOnEventMode", 0)
    #EndRegion ---Optionen---

    [/autoit] [autoit][/autoit] [autoit]

    #Region ---Veriablendekleration---
    Global $Nummer = 1
    #EndRegion ---Veriablendekleration---

    [/autoit] [autoit][/autoit] [autoit]

    #Region ---Systray---
    TraySetIcon(@SystemDir & "\shell32.dll", -142)
    TraySetToolTip("Screenhot ersteller")
    TraySetClick(17)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ MenuItems:
    $TrayMenu_FotoAlles = TrayCreateItem("Screenshot erstellen")
    $TrayMenu_FotoFenster = TrayCreateItem("Screenshot von einem Fenster")
    TrayCreateItem("")
    $TrayMenu_OrdnerOffnen = TrayCreateItem("Bilderordner öffnen")
    TrayCreateItem("")
    $TrayMenu_Exit = TrayCreateItem("Beenden")
    #EndRegion ---Systray---

    [/autoit] [autoit][/autoit] [autoit]

    #Region ---Startup---
    $Pfad = @ScriptDir & "\Bilder\" & @MDAY & "." & @MON & "." & @YEAR
    If FileExists($Pfad) = 1 Then ;~ Es gibt schon Bilder von heute
    $Grossse = DirGetSize($Pfad, 1)
    If $Grossse[1] > 0 Then ;~ Wenn es eine Datei gibt
    $Frage = MsgBox(262468, "Scrennhot ersteller", "Willst du die alten Bilder löschen?")
    If $Frage = 6 Then ;~ Alte Bilder überschreiben
    DirRemove($Pfad, 1)
    DirCreate($Pfad)
    Else
    ;~ Nummer des letten Bildes herausfinden:
    $Durchlauf = 1
    While 1
    If FileExists($Pfad & "\BildNr." & $Durchlauf & ".jpg") = 0 Then
    $Nummer = $Durchlauf
    ExitLoop
    EndIf
    $Durchlauf += 1
    WEnd
    EndIf
    EndIf
    Else
    DirCreate($Pfad)
    EndIf
    #EndRegion ---Startup---

    [/autoit] [autoit][/autoit] [autoit]

    #Region ---Hotkeys---
    HotKeySet("{F2}", "_foto")
    HotKeySet("{F3}", "_foto_von_Fenster")
    HotKeySet("{F4}", "_exit")
    #EndRegion ---Hotkeys---

    [/autoit] [autoit][/autoit] [autoit]

    #Region ---While---
    While 1
    Switch TrayGetMsg()
    Case $TrayMenu_FotoAlles
    _foto()
    Case $TrayMenu_FotoFenster
    _foto_von_Fenster()
    Case $TrayMenu_Exit
    _exit()
    Case $TrayMenu_OrdnerOffnen
    _bilderordner_offnen()
    EndSwitch
    WEnd
    #EndRegion ---While---

    [/autoit] [autoit][/autoit] [autoit]

    #Region ---Funktionen---
    Func _bilderordner_offnen() ;~ Ordner mit den Bildern öffnen
    Run("explorer.exe " & $Pfad)
    EndFunc ;==>_bilderordner_offnen

    [/autoit] [autoit][/autoit] [autoit]

    Func _foto_von_Fenster() ;~ Screenshot von einem Fenster erstellen
    ;~ Fensterauswahl-Gui erstellen:
    $FensterAuswahl = GUICreate("Screenshots-Creator - Fensterauswahl", 731, 423, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_SYSMENU, $WS_CAPTION, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_POPUP, $WS_POPUPWINDOW, $WS_GROUP, $WS_TABSTOP, $WS_BORDER, $WS_CLIPSIBLINGS), BitOR($WS_EX_APPWINDOW, $WS_EX_OVERLAPPEDWINDOW, $WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
    GUISetBkColor(0xFFFF00)
    $Label1 = GUICtrlCreateLabel("Wähl ein Fenster aus, das du fotographieren willst:", 8, 8, 709, 38)
    GUICtrlSetFont(-1, 22, 800, 0, "Arial")
    GUICtrlSetColor(-1, 0xFF0000)
    $List1 = GUICtrlCreateList("", 8, 56, 713, 298, BitOR($WS_VSCROLL, $WS_BORDER), BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
    GUICtrlSetFont(-1, 18, 400, 0, "Arial Narrow")
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlSetBkColor(-1, 0xA6CAF0)
    $Button1 = GUICtrlCreateButton("OK", 12, 360, 375, 57, 0)
    GUICtrlSetFont(-1, 22, 800, 0, "Arial Narrow")
    $Button2 = GUICtrlCreateButton("Abrechen", 396, 360, 327, 57, 0)
    GUICtrlSetFont(-1, 22, 800, 0, "Arial Narrow")
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Fensterliste erstellen:
    Local $WinList = WinList()
    Local $FensterHandls[1]
    For $Durchlauf = 1 To $WinList[0][0]
    If IniRead($Pfad, "Einstellungen", "GadgetsInBildFensterFunktion", "Nein") = "Nein" Then
    If $WinList[$Durchlauf][0] <> "" And IsVisible($WinList[$Durchlauf][1]) And $WinList[$Durchlauf][0] <> "Program manager" And $WinList[$Durchlauf][0] <> "Screenshots-Creator - Fensterauswahl" And $WinList[$Durchlauf][0] <> "Start" And ProcessExists("sidebar.exe") <> WinGetProcess($WinList[$Durchlauf][0]) Then
    _GUICtrlListBox_AddString($List1, $WinList[$Durchlauf][0])
    _ArrayAdd($FensterHandls, $WinList[$Durchlauf][1])
    EndIf
    Else
    If $WinList[$Durchlauf][0] <> "" And IsVisible($WinList[$Durchlauf][1]) And $WinList[$Durchlauf][0] <> "Program manager" And $WinList[$Durchlauf][0] <> "Screenshots-Creator - Fensterauswahl" And $WinList[$Durchlauf][0] <> "Start" Then
    _GUICtrlListBox_AddString($List1, $WinList[$Durchlauf][0])
    _ArrayAdd($FensterHandls, $WinList[$Durchlauf][1])
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Variablen:
    Local $FotoFenster = ""
    ;~ While:
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    GUIDelete($FensterAuswahl)
    ExitLoop
    Case $Button1
    Local $FotoFenster = _GUICtrlListBox_FindString($List1, GUICtrlRead($List1), True)
    GUIDelete($FensterAuswahl)
    ExitLoop
    Case $Button2
    GUIDelete($FensterAuswahl)
    ExitLoop
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    If $FotoFenster <> "" Then
    ;~ Alle anderen Fensteer verstecken:
    Local $FensterListe[1]
    $WinList = WinList()
    For $Durchlauf = 1 To $WinList[0][0]
    If $WinList[$Durchlauf][0] <> "" And IsVisible($WinList[$Durchlauf][1]) And $WinList[$Durchlauf][0] <> "Program manager" And $WinList[$Durchlauf][1] <> $FensterHandls[$FotoFenster + 1] And $WinList[$Durchlauf][0] <> "Start" And ProcessExists("sidebar.exe") <> WinGetProcess($WinList[$Durchlauf][0]) Then
    WinSetState($WinList[$Durchlauf][0], "", @SW_HIDE)
    _ArrayAdd($FensterListe, $WinList[$Durchlauf][0])
    EndIf
    Next
    ;~ Fenster fotographieren:
    _ScreenCapture_CaptureWnd($Pfad & "\BildNr." & $Nummer & ".jpg", $FensterHandls[$FotoFenster + 1], 0, 0, -1, -1, False) ;~ Foto machen
    ;~ Alle anderen Fenster einblenden
    For $b In $FensterListe
    WinSetState($b, "", @SW_SHOW)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    TrayTip("", "Foto erfolgreich erstellt.", 2, 1) ;~ Erfolgreich erstellt Info anzeigen

    [/autoit] [autoit][/autoit] [autoit]

    $Nummer += 1 ;~ Nummer hochsetztn für das nächste Bild
    EndIf
    EndFunc ;==>_foto_von_Fenster

    [/autoit] [autoit][/autoit] [autoit]

    Func _foto() ;~ Screenshot eines Teilausschnittes erstellen
    ;~ Variablendeklaration:
    Dim $Foto[4]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Verdunklungs-Gui erstellen
    Local $VerdunklungsGui = GUICreate("", @DesktopWidth * @DesktopWidth + 50, @DesktopHeight + 50, -15, -25, -1, 0x00000080)
    GUISetBkColor(0xFFFFFF) ;~ Farbe: Weiß
    GUISetCursor(3) ;~ + Kurser
    GUISetState(@SW_SHOW, $VerdunklungsGui)
    WinSetTrans($VerdunklungsGui, "", 50) ;~ Transparent: 50
    WinSetOnTop($VerdunklungsGui, "", 1) ;~ On top

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Linke obere Kante:
    TrayTip("", "Verschieb die Maus zur linken oberen Kante, und klicke.", 5, 1) ;~ Info anzeigen
    While Not _IsPressed(01) ;~ Warten bid die linke Maustaste gedrückt wird
    Sleep(50)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Mausposition als obere linke Kante speichern
    $Maus = MouseGetPos()
    $Foto[0] = $Maus[0]
    $Foto[1] = $Maus[1]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Fotobereich-Markierungs-Gui erstellen:
    Local $MarkierungsGui = GUICreate("", 1, 1, $Foto[0], $Foto[1], 0x80000000 + 0x00800000, 0x00000008)
    GUISetBkColor(0xFFC600) ;~ Farbe: Weiß
    GUISetCursor(3) ;~ + Kurser
    GUISetState(@SW_SHOW, $MarkierungsGui)
    WinSetTrans($MarkierungsGui, "", 140) ;~ Transparent: 140
    WinSetOnTop($MarkierungsGui, "", 1) ;~ On top

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Mauskordinaten einschränken:
    _MouseTrap($Foto[0], $Foto[1], @DesktopWidth, @DesktopHeight)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Rechte untere Kante:
    TrayTip("", "Lasse die Maustaste los, wenn du an der unteren rechten Kante bist.", 5, 1) ;~ Info anzeigen

    [/autoit] [autoit][/autoit] [autoit]

    While _IsPressed(01) ;~ Warten bid die linke Maustaste losgelassen wird
    Sleep(25)
    $Maus = MouseGetPos()
    WinMove($MarkierungsGui, "", $Foto[0], $Foto[1], $Maus[0] - $Foto[0], $Maus[1] - $Foto[1])
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    TrayTip("", "", 0) ;~ Info ausbelden

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Mausposition als unteren rechten Kante speichern
    $Maus = MouseGetPos()
    $Foto[2] = $Maus[0]
    $Foto[3] = $Maus[1]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Guis ausbelden
    WinSetOnTop($VerdunklungsGui, "", 0)
    GUIDelete($VerdunklungsGui)
    WinSetOnTop($MarkierungsGui, "", 0)
    GUIDelete($MarkierungsGui)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Foto erstellen:
    _ScreenCapture_Capture($Pfad & "\BildNr." & $Nummer & ".jpg", $Foto[0], $Foto[1], $Foto[2], $Foto[3], False) ;~ Foto machen
    ;~ Mausposition entschränken
    _MouseTrap()

    [/autoit] [autoit][/autoit] [autoit]

    TrayTip("", "Foto erfolgreich erstellt.", 2, 1) ;~ Erfolgreich erstellt Info anzeigen

    [/autoit] [autoit][/autoit] [autoit]

    $Nummer += 1 ;~ Nummer hochsetztn für das nächste Bild
    EndFunc ;==>_foto

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit() ;~ Programm beeden
    Exit
    EndFunc ;==>_exit

    [/autoit] [autoit][/autoit] [autoit]

    Func IsVisible($handle)
    If BitAND(WinGetState($handle), 2) Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc ;==>IsVisible
    #EndRegion ---Funktionen---

    [/autoit]

    Magnus

  • gut gelungen, wäre vlt schön wenn man die erste position noch ändern könnte, also zb ein kreuz dort machen, welches sich verschieben lässt

  • so ne funktion hab ich in meinem script auch untergebracht, vielleicht kann dir ja
    folgender codeschnipsel helfen deine version zu erweitern:

    Spoiler anzeigen
    [autoit]


    #Include <Misc.au3>
    $var = WinList()
    For $i = 1 to $var[0][0]
    If $var[$i][0] <> "" AND $var[$i][0] <> "start" AND IsVisible($var[$i][1]) Then WinSetState ( $var[$i][0], "", @SW_DISABLE )
    Next
    $GUI_2 = GUICreate("", 1, 1, -1, -1, 0x80000000 + 0x00800000, 0x00000008)
    GUISetBkColor(0x0c6eec)
    WinSetTrans($GUI_2, "", 130)
    local $s_left = "", $s_top = "", $s_width = "", $s_height = "", $mgp[2]
    Local $hGUI = GUICreate("", @DesktopWidth*@DesktopWidth+50, @DesktopHeight+50, -15, -25, -1, 0x00000080)
    GUISetBkColor(0xffffff)
    WinSetTrans($hGUI, "", 50)
    WinSetOnTop($hGUI, "", 1)
    GUISetCursor(3)
    GUISetState(@SW_SHOW, $hGUI)
    While Not _IsPressed(01)
    $mgp = MouseGetPos( )
    Sleep(50)
    WEnd
    WinMove($GUI_2, "", $mgp[0], $mgp[1], 1, 1)
    GUISetState(@SW_SHOW, $GUI_2)
    While _IsPressed(01)
    $mgp_2 = MouseGetPos( )
    If $mgp_2[0] > $mgp[0] And $mgp_2[1] > $mgp[1] Then
    local $s_left = $mgp[0], $s_top = $mgp[1], $s_width = $mgp_2[0] - $mgp[0], $s_height = $mgp_2[1] - $mgp[1]
    ElseIf $mgp_2[0] > $mgp[0] And $mgp_2[1] < $mgp[1] Then
    Local $s_left = $mgp[0], $s_top = $mgp_2[1], $s_width = $mgp_2[0] - $mgp[0], $s_height = $mgp[1] - $mgp_2[1]
    ElseIf $mgp_2[0] < $mgp[0] And $mgp_2[1] > $mgp[1] Then
    Local $s_left = $mgp_2[0], $s_top = $mgp[1], $s_width = $mgp[0] - $mgp_2[0], $s_height = $mgp_2[1] - $mgp[1]
    ElseIf $mgp_2[0] < $mgp[0] And $mgp_2[1] < $mgp[1] Then
    Local $s_left = $mgp_2[0], $s_top = $mgp_2[1], $s_width = $mgp[0] - $mgp_2[0], $s_height = $mgp[1] - $mgp_2[1]
    EndIf
    WinMove($GUI_2, "", $s_left, $s_top, $s_width, $s_height)
    WinSetOnTop($hGUI, "", 1)
    ToolTip($s_width & "x" & $s_height)
    sleep(50)
    WEnd
    ToolTip("")
    GLOBAL $s_left = $s_left, $s_top = $s_top, $s_width = $s_width, $s_height = $s_height
    GUIDelete($hGUI)
    $var = WinList()
    For $i = 1 to $var[0][0]
    If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then WinSetState ( $var[$i][0], "", @SW_ENABLE )
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Func IsVisible($handle)
    If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
    Else
    Return 0
    EndIf
    EndFunc

    [/autoit]

    bei gedrückter maustaste kannste den bereich "ziehen".
    ist ne art nachbau des microsoft-snipping-tools was seit vista bei windows dabei ist.
    der codeschnipsel läuft auch als stand-alone-script.

    Einmal editiert, zuletzt von andygo (6. Dezember 2009 um 20:25)

  • Andygo: Hab ich gemacht
    Man kann die Maus aber nicht inherhalb der oberen linken Bildschirmecke und der oberen linken Ecke des Screenshots bewegen.

    Update sie Post 1 :)

    Magnus

  • Du könntest ein GUi dazupasteln, in dem man auch auswählen kann, ob man ein Windows fotografieren möchte.
    Einfach dann das aktuelle Fenster nehmen und mit

    [autoit]

    _ScreenCapture_CaptureWnd

    [/autoit]

    schießen :)

  • Kennt jemand eine Möglichkeit mit der man aus der Fensterliste:

    [autoit]

    Local $WinList = WinList()
    For $Durchlauf = 1 To $WinList[0][0]
    If $WinList[$Durchlauf][0] <> "" And IsVisible($WinList[$Durchlauf][1]) And $WinList[$Durchlauf][0] <> "Program manager" Then
    EndIf
    Next

    [/autoit]


    alle Gadgets aussortieren kann?

    Magnus

  • Was möchtest du erreichen? Wenn du nur das aktuelle Fenster haben willst, dann geht das auch einfacher.

  • Neue Version! :)
    siehe Post 1!

    Mit Kommentaren damit es leslicher ist.:)

    Faweyr: Hast du Vista/7? Wenn ja: Schau dir die neue Version an, und geh mal auf die "Screenshot von Fenster erstellen"-Funktion.
    Dort sind auch die Gadgats aufgelistet, das will ich entfernen, ?(

    Magnus

    2 Mal editiert, zuletzt von Magnus (7. Dezember 2009 um 18:12)

  • Neue Version! :)
    siehe Post 1!

    Mit Kommentaren damit es leslicher ist.:)

    Faweyr: Hast du Vista/7? Wenn ja: Schau dir die neue Version an, und geh mal auf die "Screenshot von Fenster erstellen"-Funktion.
    Dort sind auch die Gadgats aufgelistet, das will ich entfernen, ?(

    vielleicht will ja einer blos ein shot vom wetter-gadget machen, ich finds nich schlimm.
    blos den startknopf (start) würd ich rausmachen, der wird bei win7 zumindest bei meiner 64bit auch als fenster erkannt.

  • vielleicht will ja einer blos ein shot vom wetter-gadget machen, ich finds nich schlimm.
    blos den startknopf (start) würd ich rausmachen, der wird bei win7 zumindest bei meiner 64bit auch als fenster erkannt.

    Oh, hatte ich vergessen :cursing: , er wird nämlich auch unter Windows 7 32bit angezeigt.

    Magnus