Hmm, da bringst du mich auf eine Idee. Ist es möglich ein 1bit Bild mit GDI+ und den Pathes schneller auszulesen und in der GUI darzustellen anstelle des Arrays?
Gruß,
UEZ
Hmm, da bringst du mich auf eine Idee. Ist es möglich ein 1bit Bild mit GDI+ und den Pathes schneller auszulesen und in der GUI darzustellen anstelle des Arrays?
Gruß,
UEZ
Hi Leute,
hat jemand eine Idee, wie ich den Code beschleunigen kann. Ich dachte z.B. an ASM oder FreeBasic!
Und zwar gibt es in der _WinAPI_GuiImageHole() Funktion eine Schleife, die relativ lange braucht, das Bild zu erstellen.
Hier der Code:
Danke und Gruß,
UEZ
Probiere es mal damit: GDI+ Show Histogram v0.97 beta build 2013-02-05
Gruß,
UEZ
DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGfxContext, "int", 5)
ist dein Freund, wobei $hGfxContext dein GraphicContext sein sollte.
Gruß,
UEZ
Teste mal dies:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ScreenCapture.au3>
Opt("GUIOnEventMode", 1)
Global $iW = 500, $iH = 500
$hGUI = GUICreate("test", $iW, $iH,-1,-1, $WS_SIZEBOX)
GUISetState()
GUISetOnEvent ($GUI_EVENT_CLOSE, "_Exit", $hGUI)
GUIRegisterMsg ($WM_SIZE, "WM_SIZE")
_GDIPlus_Startup()
$hHBitmap = _ScreenCapture_Capture("", 0, 0, $iW, $iH)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
Global Const $iYCaption = _WinAPI_GetSystemMetrics($SM_CYSIZE), $iYFixedFrame = _WinAPI_GetSystemMetrics(8) ;8 = $SM_CYFIXEDFRAME
$iDHeight = $iYCaption + $iYFixedFrame
GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND")
_WinAPI_RedrawWindow($hGUI)
While (1)
Sleep (1000)
WEnd
Func WM_SIZE()
Local $aWidth = WinGetClientSize($hGUI)
$iW = $aWidth[0]
$iH = $aWidth[1] + $iDHeight
Return "GUI_RUNDEFMSG"
EndFunc
Func WM_ERASEBKGND($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg, $lParam
Local $hGraphicsTemp = _GDIPlus_GraphicsCreateFromHDC($wParam)
DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGraphicsTemp, "int", 1)
_GDIPlus_GraphicsDrawImageRect($hGraphicsTemp, $hBitmap, 0, 0, $iW, $iH)
_GDIPlus_GraphicsDispose($hGraphicsTemp)
Return True
EndFunc ;==>_WM_ERASEBKGND
Func _Exit()
GUIRegisterMsg($WM_ERASEBKGND, "")
_GDIPlus_GraphicsDispose($hBitmap)
_WinAPI_DeleteObject($hHBitmap)
_GDIPlus_Shutdown ()
GUIDelete()
Exit
EndFunc
Gruß,
UEZ
Probiere es mal damit:
#include <GuiConstantsEx.au3>
$Form2 = GUICreate("Form", 405, 294, 287, 167)
GUISetBkColor(0x000000)
$Group1 = GUICtrlCreateGroup("Gruppe", 40, 40, 241, 193)
GUICtrlSetColor(-1, 0x00FF00)
$Radio1 = GUICtrlCreateRadio("Radio1", 64, 88, 113, 17)
GUICtrlSetColor(-1, 0x00FF00)
$Radio2 = GUICtrlCreateRadio("Radio2", 64, 120, 113, 17)
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlCreateGroup("", -99, -99, 1, 1)
DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($Group1), "wstr", 0, "wstr", 0)
DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($Radio1), "wstr", 0, "wstr", 0)
DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($Radio2), "wstr", 0, "wstr", 0)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Gruß,
UEZ
@m-obi: viele Wege führen nach Rom und das es mit WM_COMMAND nicht geht, wollte ich nicht glauben.
Und außerdem wo bleibt da der Spaß?
Dass es mit EM_SETCUEBANNER einfacher geht, wusste ich nicht.
Jetzt weiß ich's.
Gruß,
UEZ
Probiere dieses mal aus:
;coded by UEZ 2013
#include <EditConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Opt("MustDeclareVars", 1)
Global $sInputText = "Bitte Passwort eingeben"
Global $sInputIP = "IP Adresse"
Global Const $hGUI = GUICreate("Password", 329, 116)
Global Const $idLabelHeadline = GUICtrlCreateLabel("VNC Starter", 110, 10, 150)
GUICtrlSetFont(-1, 18, 400, 0, "Arial", 4)
Global Const $idLabelIP = GUICtrlCreateLabel("IP Adr.", 30, 54, 44, 29)
Global Const $idInputIP = GUICtrlCreateInput($sInputIP, 68, 52, 151, 21)
GUICtrlSetColor(-1, 0xA0A0A0)
Global Const $hInputIP = GUICtrlGetHandle($idInputIP)
Global Const $idLabelPWD = GUICtrlCreateLabel("Passwort:", 18, 84, 44, 19)
Global Const $idInputPWD = GUICtrlCreateInput($sInputText, 68, 82, 151, 21)
GUICtrlSetColor(-1, 0xA0A0A0)
Global Const $hInputPWD = GUICtrlGetHandle($idInputPWD)
Global Const $idButtonGO = GUICtrlCreateButton("Start VNC", 241, 80, 75, 25)
ControlFocus($hGUI, "", $idLabelPWD)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
[/autoit] [autoit][/autoit] [autoit]While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
GUIRegisterMsg($WM_COMMAND, "")
GUIDelete()
Exit
Case $idButtonGO
If Not IPChk(GUICtrlRead($idInputIP)) Then
MsgBox(16, "FEHLER", "Bitte IP Adresse überprüfen!", 30)
ContinueLoop
EndIf
If GUICtrlRead($idInputPWD) = "" Or GUICtrlRead($idInputPWD) = $sInputText Then
MsgBox(16, "FEHLER", "Passwort ist gleich '" & $sInputText & "'", 30)
ContinueLoop
EndIf
GUIRegisterMsg($WM_COMMAND, "")
vncstart(GUICtrlRead($idInputIP), GUICtrlRead($idInputPWD))
GUIDelete()
Exit
EndSwitch
WEnd
Func IPChk($sIP)
Local $sRegExPattern = _
"^([01]?\d\d?|2[0-4]\d|25[0-5])\." & _
"([01]?\d\d?|2[0-4]\d|25[0-5])\." & _
"([01]?\d\d?|2[0-4]\d|25[0-5])\." & _
"([01]?\d\d?|2[0-4]\d|25[0-5])$"
Local $a = StringRegExp($sIP, $sRegExPattern, 3)
If @error Then Return 0
Return 1
EndFunc
Func vncstart($sIP, $sPwd)
ShellExecute("C:\Programme\RealVNC\VNC Viewer\vncviewer.exe")
WinActivate("VNC Viewer")
Sleep(200)
Send($sIP & "{Enter}")
WinWaitActive("VNC Viewer - Authentication")
Sleep(150)
Send($sPwd & "{Enter}")
EndFunc ;==>vncstart
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg
Local $iIDFrom = _WinAPI_LoWord($iwParam)
Local $iCode = _WinAPI_HiWord($iwParam)
Switch $ilParam
Case $hInputPWD
Switch $iCode
Case $EN_KILLFOCUS
If GUICtrlRead($iIDFrom) = "" Then
GUICtrlSendMsg($iIDFrom, $EM_SETPASSWORDCHAR, 0, 0)
GUICtrlSetData($iIDFrom, $sInputText)
GUICtrlSetColor($iIDFrom, 0xA0A0A0)
EndIf
Case $EN_SETFOCUS
GUICtrlSetColor($iIDFrom, 0)
GUICtrlSetData($iIDFrom, "")
GUICtrlSendMsg($iIDFrom, $EM_SETPASSWORDCHAR, 9679, 0)
EndSwitch
Case $hInputIP
Switch $iCode
Case $EN_KILLFOCUS
If GUICtrlRead($iIDFrom) = "" Then
GUICtrlSetData($iIDFrom, $sInputIP)
GUICtrlSetColor($iIDFrom, 0xA0A0A0)
EndIf
Case $EN_SETFOCUS
GUICtrlSetColor($iIDFrom, 0)
If GUICtrlRead($iIDFrom) = "" Or GUICtrlRead($iIDFrom) = $sInputIP Then GUICtrlSetData($iIDFrom, "")
EndSwitch
EndSwitch
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_COMMAND
Gruß,
UEZ
Das hört sich nicht "rosig" an.
Ich komme auch nicht drauf!
Gruß,
UEZ
Am besten du zeigt uns dein Skript und wir können dann nach einer Lösung suchen.
Gruß,
UEZ
Probiere es mal damit:
;coded by UEZ 2013
#include <EditConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Opt("MustDeclareVars", 1)
Global $sInputText = "Bitte Passwort eingeben"
Global Const $hGUI = GUICreate("Password", 369, 46)
Global Const $idInputPWD = GUICtrlCreateInput($sInputText, 68, 12, 151, 21)
GUICtrlSetColor(-1, 0xA0A0A0)
Global Const $hInputPWD = GUICtrlGetHandle($idInputPWD)
Global Const $idLabelPWD = GUICtrlCreateLabel("Passwort:", 18, 14, 44, 19)
Global Const $idButtonGO = GUICtrlCreateButton("GO", 286, 10, 75, 25)
ControlFocus($hGUI, "", $idLabelPWD)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
[/autoit] [autoit][/autoit] [autoit]While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $idButtonGO
GUIRegisterMsg($WM_COMMAND, "")
Exit
EndSwitch
WEnd
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg
Local $iIDFrom = _WinAPI_LoWord($iwParam)
Local $iCode = _WinAPI_HiWord($iwParam)
Switch $ilParam
Case $hInputPWD
Switch $iCode
Case $EN_KILLFOCUS
If GUICtrlRead($iIDFrom) = "" Then
GUICtrlSendMsg($iIDFrom, $EM_SETPASSWORDCHAR, 0, 0)
GUICtrlSetData($iIDFrom, $sInputText)
GUICtrlSetColor($iIDFrom, 0xA0A0A0)
EndIf
Case $EN_SETFOCUS
GUICtrlSetColor($iIDFrom, 0)
GUICtrlSetData($iIDFrom, "")
GUICtrlSendMsg($iIDFrom, $EM_SETPASSWORDCHAR, 9679, 0)
EndSwitch
EndSwitch
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_COMMAND
Gruß,
UEZ
Herzlichen Glückwunsch und alles Gute!
@GDI+ Meister: lange nicht mehr aktiv!?!?!?
Gruß,
UEZ
Schaue mal hier nach: http://www.autoitscript.com/forum/topic/14…20#entry1045221
Füllt eine Farbe in einem Bild iterativ. Kannst es ja entsprechend umbauen.
Gruß,
UEZ
Ich bin völlig bei dir, wenn es darum geht, den Reiz am Coden zu erhalten! Aber in diesem Fall fand ich die Idee GDI+ zum Komprimieren zu benutzen, einfach genial. Erst mal auf diese Idee zu kommen, denn mir war die Idee noch "fremd".
Ich würde diese Art (GDI+) zum komprimieren nicht benutzen, doch die Möglichkeit zu haben ist einfach faszinierend.
Gruß,
UEZ
Ich finde die Idee einfach cool, wobei die Idee vielleicht nicht neu ist, aber die Implementierung ist sehr ansehnlich.
Die Idee ist einfach, dass man nicht den "lahmen" AutoIt Interpreter nimmt, sondern Built-In Funktionen.
Oben von mir das Beispiel mit der ntdll.dll und von trancexx die gdiplus.dll als Alternativen.
Natürlich ist der Königsweg zum Komprimieren der von die genannte Weg, aber manchmal sind die alternativ Wege einfach nur genial...
Gruß,
UEZ
Ein interessanter Ansatz ist hier zu sehen (von trancexx): http://www.autoitscript.com/forum/topic/14…ata-compression
Und zwar wird die PNG Komprimierung benutzt, um Daten zu komprimieren. Clever!
Gruß,
UEZ
was ist eigentlich der genaue Unterschied zwischen
[autoit]_GDIPlus_BitmapCreateFromFile
[/autoit]
_GDIPlus_ImageLoadFromFile
?
Bei meinen bisherigen Projekten funktioniert beides
Schaue mal hier nach: http://www.autoitscript.com/forum/topic/14…e/#entry1032804
Gruß,
UEZ
Wer Lust hat, kann ja mal hier rein schauen (siehe Anhang) - ist vom 7-Zip Entwickler.
Zitat
UEZ komprimiert in seinem Script übrigens bei LZNT in der höchsten Stufe, und das ist kompressionstechnisch kein Stück besser als das AutoIt-Pendant!!!
Ist eben "nur" Built-In.
Gruß,
UEZ
Happy Birthday und alles Gute.
Gruß,
Ünal
Haben die Städte was mit Politik zu tun?
Gruß,
UEZ