Am einfachsten gehts wahrscheinlich mit _GDIPlus_BitmapCloneArea(). Den damit erzeugten Clone einfach mit _GDIPlus_ImageSaveToFile abspeichern und mit _GDIPlus_BitmapDispose den Clone wieder löschen (Also Speicher freigeben).
Beiträge von SEuBo
-
-
@AutoItExe ... Funktioniert das auch von Computern aus, die kein Autoit drauf haben? Oder muss ich die Exe mitinstallieren?
Wie AntiSpeed schon gesagt hat: Ja.Zitat
Allerdings gibt mit Run eine 0 zurück. Was habe ich falsch gemacht?
Probier es mal so rum:Hauptskript:
[autoit]$sScriptPath = @DesktopDir & '\someplugin.au3'
[/autoit]
$sParameters = '... das sind willkürliche informationen ... '
Run(StringFormat('"%s" /AutoIt3ExecuteScript "%s" "%s"', @AutoItExe, $sScriptPath, $sParameters), @ScriptDir, @SW_HIDE)someplugin.au3:
[autoit]MsgBox(0,'',$CmdLine[1])
[/autoit]/Edit
[autoit]
Achso: Das ganze muss nicht mit Stringformat gelöst werden. Wenn dir das lieber ist, dann mach es so:Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & $sScriptPath & '" "' & $sParameters & '"', @ScriptDir, @SW_HIDE)
[/autoit] -
Du kannst, von dem Server-Script aus, auch einfach andere AutoIt Scripte direkt aufrufen (diese müssen nicht einmal als .exe vorliegen).
[autoit]
[/autoit]
; $sScriptPath = Pfad zu der .au3 Datei, die du ausführen möchtest.
Run(StringFormat('"%s" /AutoIt3ExecuteScript "%s"', @AutoItExe, $sScriptPath), @ScriptDir, @SW_HIDE, 4 + 2) -
Problem ist der CPU auslastung
Bei der CPU Auslastung ist mir jetzt nichts aufgefallen - allerdings beim Reservierten Arbeitsspeicher schon.
Das kommt einfach daher, dass im ganzen Script teilweise Ressourcen nicht wieder freigegeben werden.Als Beispiel sei hier nur mal $hFont in _GDIPlusAnimateAlphaLabel() gegeben, das in manchen Fällen 2x erstellt, aber nur 1x freigegeben wird. (z.B. wenn $AnType = 1 oder 2 ist).
Ein _GDIPlus_FontDispose($hFont) vor den jeweiligen Stellen (z. 91 & 108) hilft da etwas.Außerdem wird das in _CreateGraphic erstellte Graphics-Objekt (_GDIPLus_ImageGetGraphicsContext) in _SetCleanGraphic nicht gelöscht (_GDIPlus_GraphicsDispose !).
Das scheint aber noch nicht alles gewesen zu sein - der RAM Verbrauch steigt weiterhin - wenn auch langsamer.Ich hab allerdings keine Lust und Muße mehr, mich da noch weiter reinzuarbeiten.
Ich hoffe ich hab jedenfalls schonmal einen Schubser in die richtige Richtung geben können. -
-
Hat sich hier mittlerweile eigentlich etwas getan?
Ich wäre definitiv auch an einer XING Gruppe interessiert. -
Nebenbei: Ich suche eine gute Regex tutorial. Alleine Autoithandbuch reicht nicht.
Schonmal versucht, nach einem StringRegExp Tutorial zu googlen? -
In SciTE auf Tools -> SciTE Config (Alternativ Strg + 1 in SciTE).
Im Reiter 'Color Settings' Klickst du auf den 'Fore' Button in der ersten Zeile, und wählst deine Farbe. Mit 'Update' anschließend die Änderungen übernehmen, und fertig. -
Kann mehrzeiligen AutoIt Code ausführen
[autoit]
Wäre so jedenfalls besser als mit einem Loop über alle Zeilen einzelnd, die dann mit Execute ausgeführt werden:
[/autoit]
FileWrite(@TempDir & '\au3code.au3', $Code)
RunWait(StringFormat('"%s" /AutoIt3ExecuteScript "%s"', @AutoItExe, @TempDir & '\au3code.au3'))
FileDelete(@TempDir & '\au3code.au3')Weil
Spoiler anzeigen
[autoit]$Code = ''
[/autoit] [autoit][/autoit] [autoit]
$Code &= '$sText = "Hallo"' & @CRLF
$Code &= '$sText &= " " & @UserName' & @CRLF
$Code &= 'MsgBox(0, "", $sText)'; Funktioniert:
[/autoit] [autoit][/autoit] [autoit]
FileWrite(@TempDir & '\au3code.au3', $Code)
RunWait(StringFormat('"%s" /AutoIt3ExecuteScript "%s"', @AutoItExe, @TempDir & '\au3code.au3'))
FileDelete(@TempDir & '\au3code.au3'); Funktioniert nicht:
[/autoit]
$aCode = StringSplit($Code, @CRLF, 3)
For $i = 0 To UBound($aCode) - 1
Execute($aCode[$i])
Next -
Ich spiele ja nur zu ungern den Spielverderber, aber Konstantenbezeichnungen werden überlicherweise GROß geschrieben.
-
aber ich würde/sollte das ohne externe programme mache wenn es geht.
Darf man fragen warum? Ich persönlich hätte dir auch zu den PSTools geraten, PSExex sollte mit seinen 373kb den Braten nicht all zu fett machen. -
/OT: Ich liebe Crossposts sooo sehr
-
Les dir mal diesen Thread ab Post 4 durch
https://autoit.de/index.php?page=Thread&postID=215008 -
[autoit]
$Anzahl = InputBox("Stahlbarren Herstellung", "Bitte gib hier ein, wieviel Stahlbarren du herstellen möchtest!")
[/autoit][autoit][/autoit][autoit]
Local $Holzkohle = 5, $Feineseisenerz = 10, $Steinkohle = 20MsgBox(0, "Ergebnisse", _
[/autoit][autoit][/autoit][autoit][/autoit]
'Holzkohle: ' & $Holzkohle * $Anzahl & @CRLF & _
'Feines Eisenerz: ' & $Feineseisenerz * $Anzahl & @CRLF & _
'Steinkohle: ' & $Steinkohle * $Anzahl) -
Ob dieses Problem auch bei SEuBo besteht weiss ich nicht, das hab ich mir noch nicht angesehn und auf den ersten Blick auch nicht 100% verstanden.
Höchstwahrscheinlich.
Mein Script macht so ziemlich das selbe - es ruft auch mit AdlibRegister die Funktion mit der Schleife auf, nachdem die OnEvent Funktion beendet wurde.Der einzige unterschied zu Großvaters Script ist wohl, dass ich das ganze über die Funktion _CallFunc() mache, damit man nicht in jeder Funktion, die man aufruft, ein AdlibUnRegister braucht. Die _CallFuncHelper ist nur dafür da, um die Variablen $iAdlib und $sCallFunc zu speichern. Scheinbar funktionieren Static-Variablen in Adlib-Funktionen nicht so wie Sie sollten. Deswegen brauchte ich da eine Zweite Funktion, die die Static's speichert.
-
Zitat
. Guigetmsg() innerhalb der fraglichen Funktion/Schleife ist im OnEvent Mode ja nicht möglich, da dort guigetmsg immer 0 als return wert besitzt,
[autoit]
Einfach OnEvent-Mode bei der Nutzung von GUIGetMsg kurzzeitig deaktivieren..
[/autoit][autoit][/autoit][autoit]
; Some Code for OnEvent here...Func OnEventFunc()
[/autoit]
Local $iOpt = Opt("GUIOnEventMode", 0) ; turn off On-Event
While GUIGetMsg() <> $cButtonWeiter ; use GuiGetMsg()
WEnd
Opt("GUIOnEventMode", $iOpt) ; Set On-Event to the old state.
EndFuncÜbrigens: Wenn du es mit AdlibRegister machst, kannst du jede Funktion mit jedem Inhalt zu jedem Zeitpunkt deiner Wahl ausführen - und das ohne nervige Beschränkungen. Hab das Script von misterspeed mal angepasst:
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]Global $stop = 0
[/autoit] [autoit][/autoit] [autoit]Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
[/autoit] [autoit][/autoit] [autoit]
$mainwindow = GUICreate("Hallo Welt", 200, 100)
$counter = GUICtrlCreateLabel("Ich mache nix!", 30, 10)
$okbutton = GUICtrlCreateButton("Start", 70, 50, 60)GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetOnEvent($okbutton, "OKButton")GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(1000) ; Im Leerlauf bummeln
WEndFunc OKButton()
[/autoit] [autoit][/autoit] [autoit]
If $stop = 0 Then
ConsoleWrite(@CRLF & "Es wurde start gedrückt" & @CRLF)
GUICtrlSetData($okbutton, "Stop")
$stop = 1
_CallFunc("endlosschleife")
Else
ConsoleWrite(@CRLF & "Es wurde stop gedrückt" & @CRLF)
GUICtrlSetData($okbutton, "Start")
GUICtrlSetData($counter, "Ich mache nix!")
$stop = 0
EndIf
EndFunc ;==>OKButtonFunc CLOSEClicked()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc ;==>CLOSEClickedFunc endlosschleife()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $i = 1
ConsoleWrite("Funktion endlosschleife wurde aufgerufen" & @CRLF)
While $stop = 1
GUICtrlSetData($counter, $i)
If $i = 10 Then
ConsoleWrite(@CRLF & "Schleife wurde nach 10 sekunden automatisch verlassen, nicht über den button!" & @CRLF)
ExitLoop
EndIf
$i += 1
Sleep(1000)
WEnd
ConsoleWrite(@CRLF & "Schleife wurde verlassen, funktion endlosschleife wird nun beendet..." & @CRLF)
EndFunc ;==>endlosschleifeFunc _CallFunc($sFunc = "")
[/autoit] [autoit][/autoit] [autoit]
; Calls a function using AdlibRegister
Local $iAdlib = 0, $sCallFunc
_CallFuncHelper('GET', $iAdlib, $sCallFunc)If $iAdlib = 0 Then
[/autoit] [autoit][/autoit] [autoit]
$sCallFunc = $sFunc
$iAdlib = 1
AdlibRegister('_CallFunc', 15)
AdlibRegister($sCallFunc, 10)
_CallFuncHelper('SET', $iAdlib, $sCallFunc)
Else
AdlibUnRegister('_CallFunc')
AdlibUnRegister($sCallFunc)
$iAdlib = 0
$sCallFunc = ''
_CallFuncHelper('SET', $iAdlib, $sCallFunc)
EndIf
EndFunc ;==>_CallFuncFunc _CallFuncHelper($sWhat, ByRef $iAdlib, ByRef $sCallFunc)
[/autoit] [autoit][/autoit] [autoit][/autoit]
Local Static $iState = 0, $sFunc = ''
If $sWhat = 'SET' Then
$iState = Number($iAdlib)
$sFunc = $sCallFunc
Else
$iAdlib = Number($iState)
$sCallFunc = $sFunc
EndIf
EndFunc ;==>_CallFuncHelperZitat
jemand anders noch eine Idee?Ja, GUIRegisterMsg()
Spoiler anzeigen
[autoit]#include <WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit]; Create GUI
[/autoit] [autoit][/autoit] [autoit]
$hGUI = GUICreate("",240,90)
$hButtonGo = GUICtrlCreateButton("Starte Funktion + Schleife", 20, 20, 200, 20)
$hButtonHey = GUICtrlCreateButton("Führe Befehl aus während Schleife", 20, 50, 200, 20); Get Handles of Buttons & Register Window-Messages.
[/autoit] [autoit][/autoit] [autoit]
$hButtonGo = GUICtrlGetHandle($hButtonGo)
$hButtonHey = GUICtrlGetHandle($hButtonHey)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND"); Show GUI an become idle.
[/autoit] [autoit][/autoit] [autoit]
GUISetState()
While 1
Sleep(1000)
WEndFunc Funktion()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $x = 10, $y
ToolTip("Beginne Funktion", Default, Default, "Arbeite...")
Sleep(1000)
For $i = 1 To 1000
$x += $i
$y = Mod($x, $i)
ToolTip("Durchgang #" & $i & @CRLF & "Wert: " & $y, Default, Default, "Arbeite...")
Sleep(25)
Next
ToolTip("Beende Funktion", Default, Default, "Arbeite...")
Sleep(1000)
EndFunc ;==>FunktionFunc WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
; Fängt u.a. 'Button-Clicks' ab.
;
; Sent when the user selects a command item from a menu, when a control sends a notification
; message to its parent window, or when an accelerator keystroke is translated.
; -> http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
Switch $lParam
Case $hButtonGo
; Ein normaler Funktionsaufruf würde nicht funktionieren - hier müssen wir etwas rumtricksen.
_CallFunc('Funktion')
Case $hButtonHey
MsgBox(0, "", "Hallo :)")
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc ;==>WM_COMMANDFunc WM_SYSCOMMAND($hWnd, $nMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
; Fängt Minimieren, Maximieren, Close etc. ab.
;
; A window receives this message when the user chooses a command from the Window menu
; (formerly known as the system or control menu) or when the user chooses the maximize button,
; minimize button, restore button, or close button.
; -> http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
Local Const $SC_CLOSE = 0xF060
If $wParam = $SC_CLOSE Then Exit
EndFunc ;==>WM_SYSCOMMANDFunc _CallFunc($sFunc = "")
[/autoit] [autoit][/autoit] [autoit]
; Calls a function using AdlibRegister
Local $iAdlib = 0, $sCallFunc
_CallFuncHelper('GET', $iAdlib, $sCallFunc)If $iAdlib = 0 Then
[/autoit] [autoit][/autoit] [autoit]
$sCallFunc = $sFunc
$iAdlib = 1
AdlibRegister('_CallFunc', 15)
AdlibRegister($sCallFunc, 10)
_CallFuncHelper('SET', $iAdlib, $sCallFunc)
Else
AdlibUnRegister('_CallFunc')
AdlibUnRegister($sCallFunc)
$iAdlib = 0
$sCallFunc = ''
_CallFuncHelper('SET', $iAdlib, $sCallFunc)
EndIf
EndFunc ;==>_CallFuncFunc _CallFuncHelper($sWhat, ByRef $iAdlib, ByRef $sCallFunc)
[/autoit]
Local Static $iState = 0, $sFunc = ''
If $sWhat = 'SET' Then
$iState = Number($iAdlib)
$sFunc = $sCallFunc
Else
$iAdlib = Number($iState)
$sCallFunc = $sFunc
EndIf
EndFunc ;==>_CallFuncHelper -
Vielleicht hilft dieses kurze Scriptbeispiel noch, um das, was BugFix schrieb, zu verdeutlichen:
[autoit]#include <Array.au3>
[/autoit][autoit][/autoit][autoit]
$sString = _
"Key='ABC' Value='DEF'" & @CRLF & _
"Key='GHI' Value='JKL'" & @CRLF & _
"Key='MNO' Value='PQR'" & @CRLF$aArray = StringRegExp($sString, "Key='(.*?)' Value='(.*?)'", 3)
[/autoit][autoit][/autoit][autoit]
_ArrayDisplay($aArray, 'Gesamter Array')For $i = 0 To UBound($aArray) - 1 Step 2
[/autoit]
MsgBox(0, "", _
"$i = " & $i & @CRLF & _
"$aArray[" & $i & "] = " & $aArray[$i] & @CRLF & _
"$aArray[" & $i + 1 & "] = " & $aArray[$i + 1] _
)
Next -
Ups, nein. Tut mir leid. Ich habe es getestet, aber es startet mir auch leider nur die alte XP-Tastatur.
Dann lösch die XP Tastatur die du runtergeladen hast mal aus dem Scriptverzeichnis. (Denn Standardmäßig, kann die XP Bildschirmtastatur nicht unter Windows 7 starten - die gibt es da nämlich nicht) -
Wird meine Antwort hier bewusst ignoriert?! Ich WEIß nämlich zufällig, dass die Lösung funktioniert...
Hier nochmal für die ganz faulen...
[autoit]Local $iState
[/autoit][autoit][/autoit][autoit]
If @CPUArch = "X64" And Not @AutoItX64 Then
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "ptr", $iState)
EndIfShellExecute("osk")
[/autoit][autoit][/autoit][autoit]If @CPUArch = "X64" And Not @AutoItX64 Then
[/autoit]
DllCall("kernel32.dll", "int", "Wow64RevertWow64FsRedirection", "dword", $iState)
EndIf -