1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • Suche alte Grafikkarte

    • Oscar
    • 31. Oktober 2021 um 07:34

    Ich suche noch eine alte Grafikkarte, um einen ebenso alten Rechner etwas aufzurüsten.

    Voraussetzungen:

    - Funktioniert noch

    - PCIexpress (x16)

    - schmal und kurz (keine über 2 Slots und/oder überlang)

    - max. 25W Leistung

    - DVI- und/oder HDMI-Anschluss

    Es gab damals so 256 oder 512 MB Karten, die diese Bedingungen erfüllten. Leider habe ich keine mehr davon.

    Falls jemand noch so etwas rumliegen hat und nicht mehr braucht, ich wäre interessiert.

    Ich biete im Austausch einen 20 € Schein. :)

  • Mauszeiger soll auf OK-Button in MSGBox "springen"

    • Oscar
    • 19. Oktober 2021 um 17:18
    Zitat von hipfzwirgel

    Fall somit erledigt

    Nur um mal zu zeigen, dass man das auch mit der Standard-MsgBox machen kann (_Timer-UDF missbrauchen):

    AutoIt
    #include <StructureConstants.au3>
    #include <Timers.au3>
    #include <WinAPIConv.au3>
    
    Global $hDummy = GUICreate('dummy')
    Global $iTimer =  _Timer_SetTimer($hDummy, 100, '_TimerFunc')
    MsgBox(0, 'Messagebox', 'Infotext')
    
    Func _TimerFunc($hWnd, $iMsg, $iIDTimer, $iTime)
        Local $hWin = WinGetHandle('Messagebox')
        If Not IsHWnd($hWin) Then Return
        Local $aCtrlPos = ControlGetPos($hWin, '', '[CLASS:Button; INSTANCE:1]')
        If @error Then Return
        Local $tPoint = DllStructCreate($tagPOINT)
        $tPoint.x = $aCtrlPos[0] + $aCtrlPos[2] / 2
        $tPoint.y = $aCtrlPos[1] + $aCtrlPos[3] / 2
        _WinAPI_ClientToScreen($hWin, $tPoint)
        MouseMove($tPoint.x, $tPoint.y, 0)
        _Timer_KillAllTimers($hDummy)
    EndFunc
    Alles anzeigen
  • CalcFontSize

    • Oscar
    • 7. Oktober 2021 um 15:08

    Neue Version (in Post #1).

  • CalcFontSize

    • Oscar
    • 30. September 2021 um 16:23

    Diese Funktion berechnet und setzt die optimale Fontgröße für ein Gui-Element.

    Gerade, wenn man eine größenveränderbare GUI erstellt, hat man beim Resizing immer das Problem, dass sich die Fontgröße nicht mit ändert.

    Meine Funktion ermöglicht genau das (siehe Beispiel).

    Edit 07.10.2021:

    - Die Funktionen zu einer UDF ("CalcFontSize.au3") zusammengefasst. Diese kann jetzt per #include 'CalcFontSize.au3' in eigene Projekte eingebunden werden.

    - Um ein Label/Button für die automatische Fontgrößen-Anpassung zu registrieren, reicht nun ein _CalcFontSizeRegister($idCtrl) (siehe Example).

    - Die Anpassung geschieht jetzt in der Window-Procedur (Callback-Funktion). Damit ist GuiRegisterMsg wieder frei und das Maximieren/Wiederherstellen muss nicht mehr extra behandelt werden.

    Edit 09.10.2021:

    - Ich habe die UDF noch um eine Funktion erweitert _CalcFontSize. So eine Funktion kann ganz hilfreich sein, wenn man ein mehrsprachiges Programm schreibt und die Übersetzungen unterschiedlich lang sind. Dann kann man mit dieser Funktion die Anpassung einmalig (ohne Registrierung) aufrufen.

    - Das Beispielscript habe ich mal um ein zusätzliches Label erweitert, damit man den Unterschied sehen kann.

    - Einen kleinen Fehler beseitigt. In der WindowProc wurde die Fontgroesse erst nach dem ausmessen um eins verringert. Behoben!

    Dateien

    CalcFontSize.au3 9,78 kB – 335 Downloads CalcFontSize_Example.au3 1,99 kB – 398 Downloads
  • Problem beim Dateidownload mit "InetGet" ( ANFÄNGER )

    • Oscar
    • 29. September 2021 um 09:34
    Zitat von Musashi

    Ob ein abschließender Vergleich von InetGetSize mit der lokalen Dateigröße sinnvoll wäre muss Oscar entscheiden.

    Wenn InetGetSize vom Server eine falsche Dateigröße geliefert bekommt, macht ein anschließender Vergleich keinen Sinn, weil der dann eine Übereinstimmung ergibt und die Datei mit der falschen Größe trotzdem nicht gelöscht wird.

    Zitat von Musashi

    In der Version von 2014 gab es noch den (achten) optionalen Parameter :

    Gibt es einen Grund, warum Du den aus der aktuellen Version entfernt hast ?

    Gute Frage...

    Ich befinde mich derzeit im Urlaub (Helgoland) und habe nur den "kleinen" Rechner hier. Ich weiß gar nicht mehr, warum ich den entfernt hatte.

    Vielleicht hielt ich das für überflüssig. Findest Du den Parameter wichtig?

  • Text im Label dynamisch darstellen

    • Oscar
    • 27. September 2021 um 17:58
    Zitat von Oscar

    Mit GDI+ und dem Befehl _GDIPlus_GraphicsMeasureString kann man die Fontgröße experimentell ermitteln.

    Das funktioniert zwar nicht ganz perfekt, weil teilweise angezeigte Zeilen auch mit gerechnet werden, aber zumindest sieht es schonmal ganz gut aus:

    Ich zitiere mich mal.

    Wenn man mein Script noch etwas abwandelt, funktioniert es perfekt.

    Man muss nur zusätzlich die Zeilenhöhe einrechnen:

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPISysInternals.au3>
    #include <WindowsConstants.au3>
    
    Global $sText = 'When a GUI window is resized the controls within react - how they react is determined by this function. To be able to resize a GUI window it needs to have been created with the $WS_SIZEBOX and $WS_SYSMENU styles. See GUICreate().'
    
    Global $hGui = GUICreate('Test', 640, 110, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)
    Global $idLabel = GUICtrlCreateLabel($sText, 10, 10, 620, 60)
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
    GUICtrlSetFont($idLabel, _GetFontSize($idLabel, $sText, 'Arial'))
    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_SIZING, '_WM_SIZING')
    While 1
        Local $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
    
    Func _WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
        GUICtrlSetFont($idLabel, _GetFontSize($idLabel, $sText, 'Arial'))
        Return $GUI_RUNDEFMSG
    EndFunc
    
    Func _GetFontSize($idCtrl, $sText, $sFont)
        Local $hWnd, $tRect, $iW, $iH, $hGraphic, $hFormat, $hFamily, $iFontSize, $hFont, $tLayout
        $hWnd = GUICtrlGetHandle($idCtrl)
        If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)
        $tRect = _WinAPI_GetWindowRect($hWnd)
        $iW = $tRect.right - $tRect.left
        $iH = $tRect.bottom - $tRect.top
        _GDIPlus_Startup()
        $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
        $hFormat = _GDIPlus_StringFormatCreate()
        $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        $iFontSize = 200
        Do
            $iFontSize -= 1
            $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize)
            $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
            $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sText, $hFont, $tLayout, $hFormat)
            _GDIPlus_FontDispose($hFont)
        Until ($aInfo[1] >= StringLen($sText)) and ($aInfo[2] * $iFontSize * 1.6 < $iH)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_GraphicsDispose($hGraphic)
        _GDIPlus_Shutdown()
        Return $iFontSize
    EndFunc
    Alles anzeigen
  • Text im Label dynamisch darstellen

    • Oscar
    • 25. September 2021 um 10:41

    Mit GDI+ und dem Befehl _GDIPlus_GraphicsMeasureString kann man die Fontgröße experimentell ermitteln.

    Das funktioniert zwar nicht ganz perfekt, weil teilweise angezeigte Zeilen auch mit gerechnet werden, aber zumindest sieht es schonmal ganz gut aus:

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPISysInternals.au3>
    #include <WindowsConstants.au3>
    
    Global $sText = 'When a GUI window is resized the controls within react - how they react is determined by this function. To be able to resize a GUI window it needs to have been created with the $WS_SIZEBOX and $WS_SYSMENU styles. See GUICreate().'
    
    Global $hGui = GUICreate('Test', 640, 110, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)
    Global $idLabel = GUICtrlCreateLabel($sText, 10, 10, 620, 60)
    GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
    GUICtrlSetFont($idLabel, _GetFontSize($idLabel, $sText, 'Arial'))
    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_SIZING, '_WM_SIZING')
    While 1
        Local $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
    
    Func _WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
        GUICtrlSetFont($idLabel, _GetFontSize($idLabel, $sText, 'Arial'))
        Return $GUI_RUNDEFMSG
    EndFunc
    
    Func _GetFontSize($idCtrl, $sText, $sFont)
        Local $hWnd, $hParent, $aPos, $hGraphic, $hFormat, $hFamily, $iFontSize, $hFont, $tLayout
        $hWnd = GUICtrlGetHandle($idCtrl)
        If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)
        $hParent = _WinAPI_GetParent($hWnd)
        $aPos = ControlGetPos($hParent, '', $hWnd)
        If @error Then Return SetError(2, 0, 0)
        _GDIPlus_Startup()
        $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
        $hFormat = _GDIPlus_StringFormatCreate()
        $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        $iFontSize = 100
        Do
            $iFontSize -= 1
            $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize)
            $tLayout = _GDIPlus_RectFCreate(0, 0, $aPos[2], $aPos[3])
            $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sText, $hFont, $tLayout, $hFormat)
            _GDIPlus_FontDispose($hFont)
        Until $aInfo[1] >= StringLen($sText)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_GraphicsDispose($hGraphic)
        _GDIPlus_Shutdown()
        Return $iFontSize
    EndFunc
    Alles anzeigen
  • _DownloadWithProgress

    • Oscar
    • 19. September 2021 um 11:48

    Ich habe meine UDF mal auf den aktuellen Stand gebracht (siehe Post #1).

  • Problem beim Dateidownload mit "InetGet" ( ANFÄNGER )

    • Oscar
    • 19. September 2021 um 08:43
    Zitat von oh-ha

    @Musashi

    Bekomme diese Fehlermeldung:

    Code
    >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\mein\Desktop\Neuer Ordner\555555.au3"
    "C:\Users\mein\Desktop\Neuer Ordner\_DownloadWithProgress.au3" (258) : ==> Variable used without being declared.:
    $hLineBrush = DllCall($__g_hGDIPDll, 'uint', 'GdipCreateLineBrush', 'struct*', $tPoint1, 'struct*', $tPoint2, 'uint', 0xB0FFFFFF, 'uint', 0x00FFFFFF, 'int', 0, 'int*', 0)
    $hLineBrush = DllCall(^ ERROR
    >Exit code: 1    Time: 0.478

    Du benutzt eine veraltete Version von AutoIt.

    Ich weiß nicht genau, ab welcher Version die GDI+ Variable geändert wurde, aber aktuell ist jedenfalls: $__g_hGDIPDll.

  • emulierte Tastatureingabe eines RFID-Scanners in Variable schreiben

    • Oscar
    • 17. September 2021 um 11:19
    Zitat von hipfzwirgel

    Es sollte doch mit Autoit möglich sein den Stream(Keyboard-Eingabe) direkt und ohne grafische Controls zu verarbeiten?

    Hier mal die Version mit dem Tastatur-Hook:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <StructureConstants.au3>
    #include <WinAPIConstants.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISys.au3>
    #include <WinAPISysInternals.au3>
    #include <WindowsConstants.au3>
    
    OnAutoItExitRegister('OnAutoItExit')
    
    Global $hKeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam')
    Global $hmod = _WinAPI_GetModuleHandle(0)
    Global $hKeyHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), $hmod)
    
    Global $hGui = GUICreate('Barcodescanner', 300, 100)
    Global $idCode = GUICtrlCreateLabel('', 10, 30, 280, 30, $SS_CENTER)
    GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
    GUISetState()
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit
    
    ; ACHTUNG! Callback-Funktion!
    ; In dieser Funktion darf es keinen blockierenden Code (z.B. MsgBox, Sleep, etc.) geben!
    ; Hier werden direkt die virtuellen Keycodes der Tastatur ausgewertet:
    ; https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
    Func _KeyProc($nCode, $wParam, $lParam)
        Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
        Local $iKeyCode = DllStructGetData($tKEYHOOKS, 'vkCode')
        Local Static $sBuffer = ''
        If $nCode >= 0 Then
            If $wParam = $WM_KEYDOWN Then
                Switch $iKeyCode ; Keycode auswerten
                    Case 0x0D ; RETURN
                        ConsoleWrite(StringFormat('Barcode = "%s"\r\n', $sBuffer))
                        GUICtrlSetData($idCode, $sBuffer)
                        $sBuffer = ''
                    Case 0x30 To 0x39, 0x41 To 0x5A ; 0 - 9, A - Z
                        $sBuffer &= Chr($iKeyCode)
                EndSwitch
            EndIf
        EndIf
        Return _WinAPI_CallNextHookEx($hKeyHook, $nCode, $wParam, $lParam)
    EndFunc   ;==>_KeyProc
    
    ; Wichtig! Beim Programmende den Hook wieder entfernen.
    Func OnAutoItExit()
        _WinAPI_UnhookWindowsHookEx($hKeyHook)
        DllCallbackFree($hKeyProc)
    EndFunc   ;==>OnAutoItExit
    Alles anzeigen
  • emulierte Tastatureingabe eines RFID-Scanners in Variable schreiben

    • Oscar
    • 16. September 2021 um 18:19
    Zitat von funkey

    Ein anderer Weg, wäre ein Low-Level Tastatur-Hook, der aber wahrscheinlich in leicht abgewandelter Form als Keylogger verwendet werden könnte. Somit kannst du in diese Richtung von uns keine Hilfe erwarten, sorry.

    Ich möchte das mal als Anlass nehmen, euch zu fragen, ob wir das Thema "Keylogger" etwas lockerer handhaben wollen?

    Gerade solche Anwendungsgebiete (RFID-Reader, Barcode-Scanner) sind ja eigentlich mit einem Tastatur-Hook viel besser zu handhaben.

    Für meinen Barcode-Scanner verwende ich hier bei mir sowieso einen Tastatur-Hook und nicht ein verstecktes Input-Control.

    In anderen Programmiersprachen sind die Hooks auch ausführlich dokumentiert und genau genommen gibt es auch in AutoIt bereits ein Script-Beispiel in der Hilfe (wenn man weiss, wo man suchen muss).

    Ich denke, zu einem Keylogger gehört ja schon etwas mehr als nur der Tastatur-Hook.

    Wenn Fragen konkret zu einem Keylogger gestellt werden, dann abwürgen, aber so...

    Was meint ihr dazu?

  • Kleines AutoIt-Capture Programm

    • Oscar
    • 15. September 2021 um 18:25
    Zitat von BugFix

    GUI mit 1x1 Pixel Größe OnTop in eine Ecke setzen und mit GuiSetAcceletator arbeiten, dann gibt es keine Hotkey-Probleme.

    Das funktioniert nur, wenn das Accelerator-Fenster aktiv ist. Und das ist etwas kontraproduktiv, wenn ich ja das aktive Fenster capturen will.


    Zitat von Bitnugger

    Tasten begrenzt... weniger geht ja nicht... was mache ich, wenn ich z. B. Strg + Shift + F4 benötige?

    Naja, das ist ja kein Programm zum starten von dutzenden von Funktionen.

    Es geht hier doch nur darum, einen Hotkey zum capturen festzulegen und IMHO sollten die 64 Möglichkeiten doch wohl ausreichen.

    Das Problem mit dem bereits registrierten Hotkey habe ich jetzt nochmal überarbeitet. So sollte das jetzt funktionieren. Neue Version in Post #1.

  • Kleines AutoIt-Capture Programm

    • Oscar
    • 14. September 2021 um 16:29
    Zitat von Bitnugger

    Bei HotKeySet prüfe ich übrigens mittlerweile immer, ob es funktioniert hat... PRINTSCREEN ist bei mir schon vergeben und ich hatte beim ersten Start min. 5 min gebraucht, bis ich das geschnallt habe.

    Ich habe das Programm jetzt dahingehend geändert, dass der Anwender den Hotkey selbst festlegen kann (Tasten begrenzt).

    Neue Version in Post #1.

  • Servus vom Robbytobi

    • Oscar
    • 13. September 2021 um 18:36

    Herzlich willkommen hier im Forum!

    Wenn Du Fragen zu AutoIt hast, dann nur raus damit. Wir versuchen unser Bestes. :)

  • Kleines AutoIt-Capture Programm

    • Oscar
    • 13. September 2021 um 07:26
    Zitat von Bitnugger

    Anscheinend wohl doch... stelle ich es bei mir so um, dass Anzeige 1 auf der rechten Seite ist (was ja nicht der Fall ist), klappt es auch bei mir. Du kannst die Anordnung der Bildschirme ja mal temporär bei dir umstellen... dann wirst du es selbst sehen.

    Stimmt! So tritt der Fehler auch bei mir auf.

    Das Problem sind die Defaultwerte ("-1") bei den Funktionen.

    Man kann nicht "-1" benutzen, wenn dieser Wert eine korrekte Position darstellt.

    Ich lasse also _ScreenCapture_CaptureWnd jetzt ganz weg und benutze _ScreenCapture_Capture mit den ermittelten Koordinaten.

    Zitat von Bitnugger

    Im Else-Zweig machst du $hCapture zu einer lokalen Variable... warum?

    Das war ein Fehler, weil ich zum testen das in einer Funktion kopiert hatte und beim zurückkopieren vergessen habe, das Local zu entfernen.

    Neue Version in Post #1.

  • Kleines AutoIt-Capture Programm

    • Oscar
    • 12. September 2021 um 09:35
    Zitat von Bitnugger

    Nein, auch jetzt funktioniert es nicht mit mehreren Monitoren und an den _ScreenCapture-Funktionen hast du ja auch nichts geändert.

    Das ist ja das Problem!

    Bei mir funktioniert das mit dem aktiven Fenster. Egal auf welchem Monitor und egal ob maximiert oder nicht.

    Wie soll ich einen "Fehler" beheben, der bei mir gar nicht auftritt?

    Bei mir ist zwar der primäre Bildschirm links, aber das sollte wohl keine Rolle spielen.

  • Kleines AutoIt-Capture Programm

    • Oscar
    • 11. September 2021 um 12:51
    Zitat von Oscar

    _ScreenCapture_Capture hingegen benutzt immer nur den "Haupt"-Monitor (Desktop).

    Die Funktion müsste man mal umschreiben.

    Das habe ich mal geändert. Die neue Version (Post #1) funktioniert jetzt auch mit mehreren Monitoren.

  • Kleines AutoIt-Capture Programm

    • Oscar
    • 4. September 2021 um 10:27
    Zitat von Bitnugger

    die Funktion _ScreenCapture_CaptureWnd scheint bei mehreren Monitoren jedoch fehlerhaft zu sein, denn bei mir werden dann zwei Fenster nebeneinander angezeigt. Ziehe ich min. 16 Pixel von der tatsächlichen Breite des aktiven Windows ab, dann funktioniert es.

    Das kann ich bei mir nicht bestätigen.

    _ScreenCapture_Capture hingegen benutzt immer nur den "Haupt"-Monitor (Desktop).

    Die Funktion müsste man mal umschreiben.

  • Kleines AutoIt-Capture Programm

    • Oscar
    • 1. September 2021 um 07:33

    Um mal zu zeigen, wie man mit der _ScreenCapture-UDF ein kleines Capture-Programm in AutoIt schreiben kann, habe ich hier mal die wichtigsten Funktionen in einem Programm zusammengefasst:

    Edit 11.09.2021:

    - Die "Ganzer Bildschirm"-Funktion funktioniert jetzt auch mit mehreren Monitoren korrekt.

    - Außerdem kann man jetzt auswählen, ob der Mauszeiger mit aufgenommen werden soll oder nicht.

    Edit 13.09.2021:

    - Die Capture-Funktion umgeschrieben, weil die Funktionen "_ScreenCapture_Capture" und "_ScreenCapture_CaptureWnd" nicht korrekt mit negativen Screenkoordinaten umgehen ("-1" als Defaultwert).

    Edit 14.09.2021:

    - Der Anwender kann jetzt den Hotkey selbst im Programm registrieren (Tasten begrenzt). Die Tastenkombination wird in der Registry gespeichert.

    - Die Capture-Funktion noch etwas umgeschrieben.

    - Statuszeile hinzugefügt.

    - Icon für das Fenster hinzugefügt.

    Edit 15.09.2021:

    - Hotkey-Funktion nochmal überarbeitet, damit bereits registrierte Hotkeys erkannt werden.

    - Icon (rotes X / grüner Haken) für (nicht) registrierten Hotkey hinzugefügt.

    AutoIt
    #include <APIGdiConstants.au3>
    #include <APISysConstants.au3>
    #include <ComboConstants.au3>
    #include <FileConstants.au3>
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <GuiComboBox.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <ScreenCapture.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <StructureConstants.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPIGdiDC.au3>
    #include <WinAPIGdiInternals.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIIcons.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPIMisc.au3>
    #include <WinAPIRes.au3>
    #include <WinAPISysInternals.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    Opt('TrayMenuMode', 1)
    Opt('TrayIconHide', 1)
    
    _GDIPlus_Startup()
    
    Global $aIconNr[6] = [117, 296, 221, 244, 8, 10], $ahIcon[UBound($aIconNr)]
    For $i = 0 To UBound($aIconNr) - 1
        If $i < 4 Then
            $ahIcon[$i] = _WinAPI_ExtractIcon('shell32.dll', $aIconNr[$i])
        Else
            $ahIcon[$i] = _WinAPI_ExtractIcon('comres.dll', $aIconNr[$i])
        EndIf
    Next
    Global $iGuiWidth = 1024, $iGuiHeight = 600
    Global $iImgWidth = $iGuiWidth - 180, $iImgHeight = $iGuiHeight - 36
    Global $hCapture = 0
    OnAutoItExitRegister('_Exit')
    
    Global $hGui = GUICreate('AutoIt-ScreenCapture v2.1', $iGuiWidth, $iGuiHeight)
    GUISetBkColor(0xC0C0C0)
    GUISetFont(10, 400, 0, 'Verdana')
    
    GUICtrlCreateGroup('Capture-Auswahl', 10, 10, 160, 130)
    Global $idSelectScreen = GUICtrlCreateRadio('Ganzer Bildschirm', 25, 35, 130, 20)
    Global $idSelectWindow = GUICtrlCreateRadio('Aktives Fenster', 25, 55, 130, 20)
    GUICtrlSetState($idSelectWindow, $GUI_CHECKED)
    Global $idWithCursor = GUICtrlCreateCheckbox('Incl. Mauszeiger', 25, 100, 130, 20)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    
    GUICtrlCreateGroup('Capture-Hotkey', 10, 150, 160, 140)
    Global $idRegIcon = GUICtrlCreateIcon('', 0, 136, 162, 32, 32) ; -297
    Global $hRegIcon = GUICtrlGetHandle($idRegIcon)
    Global $idHotkeyMod = GUICtrlCreateCombo(' ', 25, 180, 80, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
    GUICtrlSetData(-1, '{Alt}|{Ctrl}|{Shift}|{Win}')
    GUICtrlCreateLabel('&&', 120, 183, 20, 22)
    Global $idHotkey = GUICtrlCreateCombo('{PRINTSCREEN}', 25, 210, 130, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $WS_VSCROLL))
    GUICtrlSetData(-1, '{F1}|{F2}|{F3}|{F4}|{F5}|{F6}|{F7}|{F8}|{F9}|{F10}|{F11}|{F12}')
    Global $idRegister = GUICtrlCreateButton('Registrieren', 25, 250, 130, 25)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    
    Global $idSaveAs = GUICtrlCreateButton('Bild speichern...', 10, 320, 160, 35)
    GUICtrlSetFont(-1, 12, 400, 0, 'Verdana')
    GUICtrlSetState($idSaveAs, $GUI_DISABLE)
    
    Global $idPic = GUICtrlCreatePic('', $iGuiWidth - $iImgWidth, 0, $iImgWidth, $iImgHeight)
    
    Global $hStatus = _GUICtrlStatusBar_Create($hGui)
    _GUICtrlStatusBar_SetParts($hStatus, 2, 180)
    _GUICtrlStatusBar_SetMinHeight($hStatus, 34)
    
    Global $sHotkey = ''
    _SetHotkey()
    _WinAPI_SetClassLongEx($hGui, $GCL_HICON, $ahIcon[0]) ; das Icon in der Taskleiste ersetzen
    _WinAPI_SetClassLongEx($hGui, $GCL_HICONSM, $ahIcon[0]) ; das Icon oben/links im Fenster ersetzen
    
    GUISetState()
    _GUICtrlStatusBar_SetText($hStatus, 'Bereit.', 0)
    _GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcon[1])
    
    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $idSaveAs
                _SaveAs()
            Case $idRegister
                _SetHotkey()
        EndSwitch
    WEnd
    
    Func _Exit()
        HotKeySet($sHotkey)
        If $hCapture Then _WinAPI_DeleteObject($hCapture)
        For $hIcon In $ahIcon
            _WinAPI_DestroyIcon($hIcon)
        Next
        _GDIPlus_Shutdown()
    EndFunc   ;==>_Exit
    
    Func _SetRegHotkey()
        Local $sReg, $sMod = ' '
        $sReg = RegRead('HKCU\Software\AutoIt-ScreenCapture', 'Hotkey')
        If @error Then $sReg = '{PRINTSCREEN}'
        Switch StringLeft($sReg, 1)
            Case '!'
                $sMod = '{Alt}'
            Case '^'
                $sMod = '{Ctrl}'
            Case '+'
                $sMod = '{Shift}'
            Case '#'
                $sMod = '{Win}'
        EndSwitch
        _GUICtrlComboBox_SelectString($idHotkeyMod, $sMod)
        _GUICtrlComboBox_SelectString($idHotkey, StringRegExpReplace($sReg, '.*({.+})', '$1'))
    EndFunc   ;==>_SetRegHotkey
    
    Func _SetHotkey()
        Local $sNew, $sMod
        If $sHotkey = '' Then _SetRegHotkey()
        $sMod = StringStripWS(GUICtrlRead($idHotkeyMod), 1)
        Switch $sMod
            Case '{Alt}'
                $sNew = '!'
            Case '{Ctrl}'
                $sNew = '^'
            Case '{Shift}'
                $sNew = '+'
            Case '{Win}'
                $sNew = '#'
        EndSwitch
        $sNew &= GUICtrlRead($idHotkey)
        If $sNew <> $sHotkey And HotKeySet($sNew, '_Capture') Then
            HotKeySet($sHotkey)
            $sHotkey = $sNew
            RegWrite('HKCU\Software\AutoIt-ScreenCapture', 'Hotkey', 'REG_SZ', $sHotkey)
            _SendMessage($hRegIcon, $STM_SETIMAGE, 1, $ahIcon[4])
        Else
            _SetRegHotkey()
            $sHotkey = $sNew
            _SendMessage($hRegIcon, $STM_SETIMAGE, 1, $ahIcon[5])
        EndIf
    EndFunc   ;==>_SetHotkey
    
    Func _Capture()
        Local $bCursor, $tRECT, $bRet, $hWnd, $tPos, $hMonitor, $aData
        If $hCapture Then _WinAPI_DeleteObject($hCapture)
        $bCursor = BitAND(GUICtrlRead($idWithCursor), $GUI_CHECKED) == $GUI_CHECKED
        $tRECT = DllStructCreate($tagRECT)
        If BitAND(GUICtrlRead($idSelectWindow), $GUI_CHECKED) Then
            $hWnd = _WinAPI_GetForegroundWindow()
            If Not IsHWnd($hWnd) Then Return
            $tRECT = _WinAPI_DwmGetWindowAttribute($hWnd, $DWMWA_EXTENDED_FRAME_BOUNDS)
            If @error Then
                $tRECT = _WinAPI_GetWindowRect($hWnd)
                If @error Then Return
            EndIf
        Else
            $tPos = _WinAPI_GetMousePos()
            $hMonitor = _WinAPI_MonitorFromPoint($tPos)
            $aData = _WinAPI_GetMonitorInfo($hMonitor)
            If @error Then Return
            $tRECT = $aData[0]
        EndIf
        $hCapture = _CaptureScreenWnd($tRECT.left, $tRECT.top, $tRECT.right, $tRECT.bottom, $bCursor)
        If @error Then
            $hCapture = 0
            Return
        EndIf
        _GUICtrlStatusBar_SetText($hStatus, StringFormat('Breite x Höhe:  %i x %i px', _
                $tRECT.right - $tRECT.left, $tRECT.bottom - $tRECT.top), 1)
        _GUICtrlStatusBar_SetIcon($hStatus, 1, $ahIcon[2])
        _ShowScaledPic($idPic, $hCapture)
        _WinAPI_SetForegroundWindow($hGui)
        _GUICtrlStatusBar_SetText($hStatus, 'Bild nicht gespeichert.', 0)
        _GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcon[3])
        GUICtrlSetState($idSaveAs, $GUI_ENABLE)
    EndFunc   ;==>_Capture
    
    Func _CaptureScreenWnd($iLeft, $iTop, $iRight, $iBottom, $bCursor)
        Local $iW = $iRight - $iLeft
        Local $iH = $iBottom - $iTop
        Local $hWnd = _WinAPI_GetDesktopWindow()
        Local $hDDC = _WinAPI_GetDC($hWnd)
        Local $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
        Local $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iW, $iH)
        _WinAPI_SelectObject($hCDC, $hBMP)
        _WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, $SRCCOPY)
        If $bCursor Then
            Local $aCursor = _WinAPI_GetCursorInfo()
            If Not @error And $aCursor[1] Then
                Local $hIcon = _WinAPI_CopyIcon($aCursor[2])
                Local $aIcon = _WinAPI_GetIconInfo($hIcon)
                If Not @error Then
                    _WinAPI_DeleteObject($aIcon[4])
                    If $aIcon[5] <> 0 Then _WinAPI_DeleteObject($aIcon[5])
                    _WinAPI_DrawIcon($hCDC, $aCursor[3] - $aIcon[2] - $iLeft, $aCursor[4] - $aIcon[3] - $iTop, $hIcon)
                EndIf
                _WinAPI_DestroyIcon($hIcon)
            EndIf
        EndIf
        _WinAPI_ReleaseDC($hWnd, $hDDC)
        _WinAPI_DeleteDC($hCDC)
        Return $hBMP
    EndFunc   ;==>_CaptureScreenWnd
    
    Func _SaveAs()
        Local $sFilename = FileSaveDialog('Capture speichern unter', '', 'PNG-Bild (*.png)', $FD_PROMPTOVERWRITE)
        If @error Then Return
        If StringRight($sFilename, 4) <> '.png' Then $sFilename &= '.png'
        _ScreenCapture_SaveImage($sFilename, $hCapture, False)
        _GUICtrlStatusBar_SetText($hStatus, 'Bild gespeichert.', 0)
        _GUICtrlStatusBar_SetIcon($hStatus, 0, $ahIcon[1])
    EndFunc   ;==>_SaveAs
    
    Func _ShowScaledPic($idCtrl, $hHBitmap)
        Local $hCtrl, $hParent, $hBitmap, $hGfx, $hImage, $hResize, $hBMP, $hPrevImage
        Local $aDim, $iW, $iH, $iScaleW, $iScaleH, $iScaleF = 1
        $hCtrl = GUICtrlGetHandle($idCtrl)
        $hParent = _WinAPI_GetParent($hCtrl)
        $aCtrlPos = ControlGetPos($hParent, '', $idCtrl)
        $iW = $aCtrlPos[2]
        $iH = $aCtrlPos[3]
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsClear($hGfx, 0xff888888)
        _GDIPlus_GraphicsSetInterpolationMode($hGfx, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
        $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
        $aDim = _GDIPlus_ImageGetDimension($hImage)
        If ($iW < $aDim[0] Or $iH < $aDim[1]) Then
            $iScaleW = $iW / $aDim[0]
            $iScaleH = $iH / $aDim[1]
            $iScaleF = ($iScaleW > $iScaleH ? $iScaleH : $iScaleW)
        EndIf
        $hResize = _GDIPlus_ImageScale($hImage, $iScaleF, $iScaleF)
        $aDim = _GDIPlus_ImageGetDimension($hResize)
        _GDIPlus_GraphicsDrawImage($hGfx, $hResize, $iW / 2 - $aDim[0] / 2, $iH / 2 - $aDim[1] / 2)
        $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
        $hPrevImage = _SendMessage($hCtrl, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
        If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage)
        _GDIPlus_BitmapDispose($hResize)
        _GDIPlus_BitmapDispose($hImage)
        _GDIPlus_GraphicsDispose($hGfx)
        _GDIPlus_BitmapDispose($hBitmap)
    EndFunc   ;==>_ShowScaledPic
    Alles anzeigen

    Dateien

    AutoIt-ScreenCapture.au3 9,04 kB – 388 Downloads
  • Shellexecute kann Grafikdatei wegen fehlendem Programm nicht starten

    • Oscar
    • 30. August 2021 um 14:40
    Zitat von hipfzwirgel

    In unserer WinPE-Umgebung gibt es kein Programm mit dem
    man den erzeugten Screenshot(*.png-File im selben Verzeichnis wie das Autoit-Proggi) öffnen könnte. Im Übrigen lässt Shellexecute nicht-ausführbare Dateien mit dem dazu assoziierten Programm öffnen, dass es unter WINPE aber eben nicht gibt und auch nicht geben wird(gem unserem zuständigen Admin!).

    Wenn das AutoIt-Script laufen darf, warum zeigst Du den Screenshot nicht damit an?

    Edit:

    Hier mal ein Beispiel:

    AutoIt
    #include <ScreenCapture.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIIcons.au3>
    #include <WinAPIInternals.au3>
    _GDIPlus_Startup()
    Sleep(2000)
    Global $iGuiWidth = 1600, $iGuiHeight = 800
    Global $hGui = GUICreate('Pic-View', $iGuiWidth, $iGuiHeight)
    Global $idPic = GUICtrlCreatePic('', 0, 0, $iGuiWidth, $iGuiHeight)
    
    Global $hCapture = _ScreenCapture_Capture('', 0, 0, -1, -1, False)
    _ShowScaledPic($idPic, $hCapture)
    _WinAPI_DeleteObject($hCapture)
    GUISetState()
    
    While GUIGetMsg() <> -3
    WEnd
    _GDIPlus_Shutdown()
    
    Func _ShowScaledPic($idCtrl, $hHBitmap)
        Local $hCtrl, $hParent, $hBitmap, $hGfx, $hImage, $hResize, $hBMP, $hPrevImage
        Local $aDim, $iW, $iH, $iScaleW, $iScaleH, $iScaleF
        $hCtrl = GUICtrlGetHandle($idCtrl)
        $hParent = _WinAPI_GetParent($hCtrl)
        $aCtrlPos = ControlGetPos($hParent, '', $idCtrl)
        $iW = $aCtrlPos[2]
        $iH = $aCtrlPos[3]
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsClear($hGfx)
        _GDIPlus_GraphicsSetInterpolationMode($hGfx, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
        $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
        $aDim = _GDIPlus_ImageGetDimension($hImage)
        If ($iW < $aDim[0] Or $iH < $aDim[1]) Then
            $iScaleW = $iW / $aDim[0]
            $iScaleH = $iH / $aDim[1]
            $iScaleF = ($iScaleW > $iScaleH ? $iScaleH : $iScaleW)
        EndIf
        $hResize = _GDIPlus_ImageScale($hImage, $iScaleF, $iScaleF)
        $aDim = _GDIPlus_ImageGetDimension($hResize) ; die Breite und Hoehe der skalierten Grafikdatei holen
        _GDIPlus_GraphicsDrawImage($hGfx, $hResize, $iW / 2 - $aDim[0] / 2, $iH / 2 - $aDim[1] / 2)
        $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
        $hPrevImage = _SendMessage($hCtrl, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
        If $hPrevImage Then
            If Not _WinAPI_DeleteObject($hPrevImage) Then _WinAPI_DestroyIcon($hPrevImage)
        EndIf
        _GDIPlus_BitmapDispose($hResize)
        _GDIPlus_BitmapDispose($hImage)
        _GDIPlus_GraphicsDispose($hGfx)
        _GDIPlus_BitmapDispose($hBitmap)
    EndFunc
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™