Der Screenshot sieht gut aus, aber hast du dazu auch noch lauffähigen Code übrig?
Ich mag mir jetzt nicht alles selber zusammenstöpseln.
Beiträge von funkey
-
-
Danke bollen, das werde ich gleich mal probieren! Das ich _ArrayMaxIndex() zu oft ausführe hätte ich selber erkennen können. Die Frage ist nur, braucht man das um besser Ergebnisse zu erzielen, oder führt ein anderer Weg nach Rom.
UEZ: Mit der GDIP.au3 habe ich leider noch überhaupt keine Erfahrung. Ich lese da immer nur was von Paths, hab aber keine Ahnung was ein Path sein soll und hab es mir auch noch nie angeschaut.
-
Danke Bugfix.
Aber bei mir unter WinXP - Klassische Ansicht, da wird der Button beim Klicken rot, dann aber nicht mehr blau. erst wenn ich ein Fenster drüberlege oder die Gui aus dem Desktopbereich und wieder herein bewege isst er wieder blau.
Beim ersten Beispiel, wenn man klickt die Maus gedrückt lässt und dann neben dem Button loslässt, dann bleibt der Button optisch 'gedrückt'. -
Hallo,
meine Kamera hat den Effektfilter 'Selektive Farbe'. Ich habe nun versucht das ganze nachzubauen, bin aber noch nicht wirklich zufrieden.
Vielleicht hat jemand eine Idee, wie man das besser und schneller lösen könnte. Schneller kann ich es bestimmt mit einer DLL machen, aber vor allem sollte der Effekt besser funktionieren. Am besten erst mit kleinen Bildern probieren.
Vielen Dank für jede Hilfe von den Grafik-Profis hier!Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <Color.au3>
#include <WinAPI.au3>
#include <Array.au3>Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global $sPath = FileOpenDialog("Choose Picture", @ScriptDir, "Pictures (*.bmp;*.jpg;*.png)", 1)
[/autoit] [autoit][/autoit] [autoit]
If @error Then ExitGlobal $iCol = -1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $hImage = _GDIPlus_ImageLoadFromFile($sPath)
Global $iWidth = _GDIPlus_ImageGetWidth($hImage)
Global $iHeight = _GDIPlus_ImageGetHeight($hImage)
;~ _GDIPlus_ImageGetPixelFormat
_GDIPlus_ImageDispose($hImage)Global $hGui = GUICreate("Color effect - Click to choose color", $iWidth, $iHeight);, -1, -1, 0x80000000)
[/autoit] [autoit][/autoit] [autoit]
Global $nPic = GUICtrlCreatePic($sPath, 0, 0, $iWidth, $iHeight)
GUICtrlSetOnEvent(-1, "_GetColor")
GUISetState(@SW_SHOW, $hGui)Do
[/autoit] [autoit][/autoit] [autoit]
Until $iCol <> -1
Opt("GUIOnEventMode", 0)WinSetTitle("Color effect", "", "Color effect - Please wait")
[/autoit] [autoit][/autoit] [autoit]Global $hBitmap = _GDIPlus_BitmapCreateFromFile($sPath)
[/autoit] [autoit][/autoit] [autoit]
Global $tBitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iWidth, $iHeight, $GDIP_ILMREAD + $GDIP_ILMWRITE, $GDIP_PXF32RGB);Stride - Offset, in bytes, between consecutive scan lines of the bitmap.
[/autoit] [autoit][/autoit] [autoit]
;If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up.
Global $iStride = DllStructGetData($tBitmapData, "Stride")
;Pixel format - Integer that specifies the pixel format of the bitmap
Global $iPixelFormat = DllStructGetData($tBitmapData, "Format")
;Scan0 - Pointer to the first (index 0) scan line of the bitmap.
Global $pScan0 = DllStructGetData($tBitmapData, "Scan0")Global $tPixel
[/autoit] [autoit][/autoit] [autoit]Global $iColPixel, $aCol[3], $aSetCol = _ColorGetRGB($iCol)
[/autoit] [autoit][/autoit] [autoit]
Global $iTol = 80, $LumaFor $row = 0 To $iHeight - 1
[/autoit] [autoit][/autoit] [autoit]
For $col = 0 To $iWidth - 1
$tPixel = DllStructCreate("dword", $pScan0 + $row * $iStride + $col * 4)
$iColPixel = DllStructGetData($tPixel, 1)
$aCol[0] = BitAND(BitShift($iColPixel, 16), 0xFF)
$aCol[1] = BitAND(BitShift($iColPixel, 8), 0xFF)
$aCol[2] = BitAND($iColPixel, 0xFF)If Not _ColorInTolerance($aSetCol, $aCol, $iTol) Then
[/autoit] [autoit][/autoit] [autoit]
$Luma = $aCol[0] * 0.3 + $aCol[1] * 0.59 + $aCol[2] * 0.11
DllStructSetData($tPixel, 1, BitOR($Luma, BitShift($Luma, -8), BitShift($Luma, -16)))
EndIf
Next
Next_GDIPlus_BitmapUnlockBits($hBitmap, $tBitmapData)
[/autoit] [autoit][/autoit] [autoit]Global $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteObject(GUICtrlSendMsg($nPic, 370, 0, $hHBitmap))WinSetTitle("Color effect", "", "Color effect - Finished")
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3Global $sFileName = FileSaveDialog("Save picture", @ScriptDir, "JPG mage (*.jpg)", 16, "Bitmap_" & Hex($iCol, 6) & ".JPG")
[/autoit] [autoit][/autoit] [autoit]
If Not @error Then
If StringRight($sFileName, 4) <> ".JPG" Then $sFileName &= ".JPG"
Global $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
_GDIPlus_ImageSaveToFile($hImage, $sFileName)
_WinAPI_DeleteObject($hImage)
EndIf_WinAPI_DeleteObject($hBitmap)
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteObject($hHBitmap)
_GDIPlus_Shutdown()Func _ColorInTolerance($aSetCol, $aCol, $iTol)
[/autoit] [autoit][/autoit] [autoit]
Global $aTol[3] = [$iTol, $iTol, $iTol]
$aTol[_ArrayMaxIndex($aSetCol)] = $iTolIf ($aSetCol[0] - $aTol[0]) < $aCol[0] And ($aSetCol[0] + $aTol[0]) > $aCol[0] And _
[/autoit] [autoit][/autoit] [autoit]
($aSetCol[1] - $aTol[1]) < $aCol[1] And ($aSetCol[1] + $aTol[1]) > $aCol[1] And _
($aSetCol[2] - $aTol[2]) < $aCol[2] And ($aSetCol[2] + $aTol[2]) > $aCol[2] Then
Return 1
Else
Return 0
EndIf
EndFunc ;==>_ColorInToleranceFunc _GetColor()
[/autoit]
$iCol = PixelGetColor(MouseGetPos(0), MouseGetPos(1))
EndFunc ;==>_GetColor -
Cool!
Das kann ich sicher mal brauchen, da lassen sich ganz tolle Effekte erzielen. -
UEZ: Ich denke, das hat er bereits auch gelesen, denn ich glaube dass Neklor hier im Forum Matrix112 im englischen Forum ist
trancexx hat uns da wohl einiges verschwiegen, was sie da in ObjCreate() eingebaut hat (3.Parameter = $hDLL ?) Schade, dass sie nicht mehr im Dev-Team ist. -
Die DLL muss auf jeden Fall registriert werden, aber einige haben es so gelöst, dass das Programm die DLL beim Start registriert und beim Beenden wieder unregistriert.
Edit: Einfach regsvr32 ohne Pfad angeben, dass musste überall funktionieren.
-
Es muss so heißen:
[autoit]Send(GuiCtrlRead($input1))
[/autoit] -
Danke Leute!
Hab die zusätzlichen Funktionen in die UDF eingefügt, noch einige weitere gewrappt und im Post#1 angehängt.
Nun sind wir bei ca. 70 von 200 fertigen Funktionen.Falls jemand Lust hat ein weiteres Beispiel zu machen, dann am bestem gleich loslegen
-
Für mich ist der grafische Schnick-Schnack, den du, Eukalyptus, Andy und ein paar andere machen cool.
-
Danke!
Cool ist für mich zwar was anderes, aber manchmal könnte es ganz nützlich sein. -
Hallo,
ich habe mich nun endlich entschlossen die LibHaru-DLL (http://libharu.org/) in AutoIt zu wrappen. Damit können sehr schnell mittels Code PDF-Dateien erstellt werden. Anbei die UDF, ein Beispiel und die DLL. Bisher habe ich ca. 40% der 200 Funktionen gewrappt. Jeder ist eingeladen daran weiterzuarbeiten, damit die Bibliothek vollständig in AutoIt genutzt werden kann. Ich habe die DLL bereits genutzt, um einen CSV2PDF-Generator zu machen. Es gibt zwar bereits eine PDF-UDF komplett in AutoIt (http://www.autoitscript.com/forum/topic/11…ur-application/), aber die konnte ich aufgrund der langsamen Geschwindigkeit nicht nutzen.Happy Coding!
-
Hallo,
hab gerade für das englische Hilfeforum folgenden Code geschrieben, um verschiedene Farben für die einzelnen Parts einer Statusbar anzuzeigen.
Das kann sicher auch hier der/die eine oder andere gebrauchen.mfg
funkeySpoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiStatusBar.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>Global $hGUI, $hStatus
[/autoit] [autoit][/autoit] [autoit]
Global $aParts[3] = [75, 150, -1]$hGUI = GUICreate("StatusBar Set BkColor", 400, 300)
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_DRAWITEM, "_WM_DRAWITEM")
$hStatus = _GUICtrlStatusBar_Create($hGUI)
GUISetState();~ _GUICtrlStatusBar_SetBkColor($hStatus, 0x5555DD)
[/autoit] [autoit][/autoit] [autoit]_GUICtrlStatusBar_SetParts($hStatus, $aParts)
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlStatusBar_SetText($hStatus, "Part 1", 0, $SBT_OWNERDRAW)
_GUICtrlStatusBar_SetText($hStatus, "Part 2", 1, $SBT_OWNERDRAW)
_GUICtrlStatusBar_SetText($hStatus, "Part 3", 2, $SBT_OWNERDRAW)Do
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()Func _WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
#forceref $Msg, $wParam, $lParam
Local $tDRAWITEMSTRUCT = DllStructCreate("uint CtlType;uint CtlID;uint itemID;uint itemAction;uint itemState;HWND hwndItem;HANDLE hDC;long rcItem[4];ULONG_PTR itemData", $lParam)
Local $itemID = DllStructGetData($tDRAWITEMSTRUCT, "itemID") ;part number
Local $hDC = DllStructGetData($tDRAWITEMSTRUCT, "hDC")
Local $tRect = DllStructCreate("long left;long top;long right; long bottom", DllStructGetPtr($tDRAWITEMSTRUCT, "rcItem"))
Local $iTop = DllStructGetData($tRect, "top")
Local $iLeft = DllStructGetData($tRect, "left")
Local $hBrushSwitch $itemID
[/autoit] [autoit][/autoit] [autoit]
Case 0
$hBrush = _WinAPI_CreateSolidBrush(0x555500)
_WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
DllStructSetData($tRect, "top", $iTop + 1)
DllStructSetData($tRect, "left", $iLeft + 1)
_WinAPI_SetTextColor($hDC, 0x00FFFF)
_WinAPI_DrawText($hDC, "Part 1", $tRect, $DT_LEFT)
_WinAPI_DeleteObject($hBrush)
Case 1
$hBrush = _WinAPI_CreateSolidBrush(0x00FF00)
_WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
DllStructSetData($tRect, "top", $iTop + 1)
DllStructSetData($tRect, "left", $iLeft + 1)
_WinAPI_DrawText($hDC, "Part 2", $tRect, $DT_LEFT)
_WinAPI_DeleteObject($hBrush)
Case 2
$hBrush = _WinAPI_CreateSolidBrush(0xABCDEF)
_WinAPI_FillRect($hDC, DllStructGetPtr($tRect), $hBrush)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
DllStructSetData($tRect, "top", $iTop + 1)
DllStructSetData($tRect, "left", $iLeft + 1)
_WinAPI_DrawText($hDC, "Part 3", $tRect, $DT_LEFT)
_WinAPI_DeleteObject($hBrush)
EndSwitch$tDRAWITEMSTRUCT = 0
[/autoit] [autoit][/autoit] [autoit][/autoit]
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_DRAWITEM -
[autoit]
;Version will be 0x20yx for winamp 2.yx. versions previous to Winamp 2.0,
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
;typically (but not always) use 0x1zyx for 1.zx versions. Weird, I know.Global $Version = 20579
[/autoit][autoit][/autoit][autoit]MsgBox(0, "Version", Hex($Version, 4))
[/autoit][autoit][/autoit][autoit][/autoit] -
Hat wahrschenlich was mit dem WorkingDir zu tun. wenn du Exe2 von Exe1 aus startest solltest du bei Run() auch den 2.Parameter "workingdir" mit dem Pfad der Exe2 befüllen.
-
Hallo!
Aufgrund des Threads [ offen ] Ausgehende IP erzwingen / ForceBindIP habe ich mich wieder mit einem alten Thema von mir beschäftigt und damit auch gelöst.
Anbei der Source-Code um alle Siemens Sentron Geräte im Netzwerk über UDP-Broadcast zu ermitteln.Spoiler anzeigen
[autoit]#region ;**** Directives created by AutoIt3Wrapper_GUI ****
[/autoit] [autoit][/autoit] [autoit]
#AutoIt3Wrapper_Icon=PAC.ico
#AutoIt3Wrapper_Res_Comment=Siemens Sentron-Geräte auflisten
#AutoIt3Wrapper_Res_Description=Siemens Sentron-Geräte auflisten
#AutoIt3Wrapper_Res_Fileversion=0.9
#AutoIt3Wrapper_Res_LegalCopyright=funkey 2013
#AutoIt3Wrapper_Res_Language=3079
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/striponly
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include "socket_UDF.au3"TCPStartup() ; WSAStartup
[/autoit] [autoit][/autoit] [autoit]
Global $iSock = _socket($AF_INET, $SOCK_DGRAM, $IPPROTO_UDP)
;~ ConsoleWrite("Socket: " & $iSock & @CRLF)Global $tBroadCast = DllStructCreate("int broadcast")
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tBroadCast, "broadcast", 1)Global $iSockError = _setsockopt($iSock, $SOL_SOCKET, $SO_BROADCAST, $tBroadCast) ; Broadcast erlauben
[/autoit] [autoit][/autoit] [autoit]
If $iSockError Then
ConsoleWrite("SetSockOpt error setting broadcast!. Windows Sockets Error Codes: " & _WSAGetLastError() & @CRLF)
_closesocket($iSock)
TCPShutdown() ; WSACleanup
EndIfGlobal $tTimeVal = DllStructCreate("DWORD timeout")
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tTimeVal, "timeout", 200) ; Timeout von 200ms$iSockError = _setsockopt($iSock, $SOL_SOCKET, $SO_RCVTIMEO, $tTimeVal) ; Timeout für recv einstellen
[/autoit] [autoit][/autoit] [autoit]
If $iSockError Then
ConsoleWrite("SetSockOpt error setting recv timeout!. Windows Sockets Error Codes: " & _WSAGetLastError() & @CRLF)
_closesocket($iSock)
TCPShutdown() ; WSACleanup
EndIfGlobal $iBind = _bind($iSock, @IPAddress1, 17009) ; Lokale IP-Adresse und Port zu verwenden
[/autoit] [autoit][/autoit] [autoit]
If $iBind Then
ConsoleWrite("Bind error: " & $iBind & @CRLF) ; 0 ist OK
_closesocket($iSock)
TCPShutdown() ; WSACleanup
EndIf;~ ConsoleWrite("Lokaler Port: " & _Ws2_GetLocalPort($iSock) & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Global $iConnect = _connect($iSock, "255.255.255.255", 17008) ;Broadcast auf Port 17008
[/autoit] [autoit][/autoit] [autoit]
If $iConnect Then
ConsoleWrite("Connect Error! Windows Sockets Error Codes: " & _WSAGetLastError() & @CRLF)
_closesocket($iSock)
TCPShutdown() ; WSACleanup
EndIfGlobal $bToSend = Binary("0x3101FFFFFFFFFFFF") ; Sentron-Geräte meldet euch!!
[/autoit] [autoit][/autoit] [autoit]
Global $tSendBuffer = DllStructCreate("byte[" & BinaryLen($bToSend) & "]")
DllStructSetData($tSendBuffer, 1, $bToSend)Global $iSend = _send($iSock, $tSendBuffer)
[/autoit] [autoit][/autoit] [autoit]Global $tRecvBuffer = DllStructCreate("byte[512]")
[/autoit] [autoit][/autoit] [autoit]
Global $iRecv
Global $aData[1][6] = [["MAC", "IP", "Subnetmask", "Gateway", "Bestellnummer", "Infotext"]]
Global $iDevices = 0While 1
[/autoit] [autoit][/autoit] [autoit]
$iRecv = _recv($iSock, $tRecvBuffer)
If $iRecv = -1 Then ExitLoop ; Timeout$iDevices += 1
[/autoit] [autoit][/autoit] [autoit]
ReDim $aData[$iDevices + 1][6]$aData[$iDevices][5] = DllStructGetData($tRecvBuffer, 1)
[/autoit] [autoit][/autoit] [autoit]
$aData[$iDevices][0] = _BytesRecvToMAC($aData[$iDevices][5])
$aData[$iDevices][1] = _BytesRecvToIP($aData[$iDevices][5], 9)
$aData[$iDevices][2] = _BytesRecvToIP($aData[$iDevices][5], 13)
$aData[$iDevices][3] = _BytesRecvToIP($aData[$iDevices][5], 17)
$aData[$iDevices][4] = _BytesRecvToString($aData[$iDevices][5], 21, 18)
$aData[$iDevices][5] = _BytesRecvToString($aData[$iDevices][5], 41, $iRecv - 41)
WEnd_closesocket($iSock)
[/autoit] [autoit][/autoit] [autoit]
TCPShutdown() ; WSACleanup_ArraySort($aData, 0, 1, 0, 1) ; Anhand der IP-Adresse sortieren
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aData, "Gefundene Geräte")Func _BytesRecvToIP($bBytes, $iOffset)
[/autoit] [autoit][/autoit] [autoit]
Return StringFormat("%i.%i.%i.%i", BinaryMid($bBytes, $iOffset, 1), BinaryMid($bBytes, $iOffset + 1, 1), BinaryMid($bBytes, $iOffset + 2, 1), BinaryMid($bBytes, $iOffset + 3, 1))
EndFunc ;==>_BytesRecvToIPFunc _BytesRecvToMAC($bBytes)
[/autoit] [autoit][/autoit] [autoit]
Return StringFormat("%02X-%02X-%02X-%02X-%02X-%02X", BinaryMid($bBytes, 3, 1), BinaryMid($bBytes, 4, 1), BinaryMid($bBytes, 5, 1), BinaryMid($bBytes, 6, 1), BinaryMid($bBytes, 7, 1), BinaryMid($bBytes, 8, 1))
EndFunc ;==>_BytesRecvToMACFunc _BytesRecvToString($bBytes, $iStart, $iLen)
[/autoit]
Return BinaryToString(BinaryMid($bBytes, $iStart, $iLen))
EndFunc ;==>_BytesRecvToString -
Ich werde mir keines dieser Programme anschauen, aleine schon wenn ich die Größe der Programme mit minimalem Nutzen sehe, weiß ich, dass da einiges an nicht gewünschtem Zeug mitkommt.
Außerdem ist das wie bereits gesagt das falsche Forum und auch der Titel des Threads sollte SchrotterChwebnode's Programmsammlung oder so heißen. -
Du kannst das über verschiedene Varianten lösen.
Z.B über TCP-Funktionen, oder über eine temporäre Datei (Das Hauptprogramm überprüft ob die Datei vorhanden ist, löscht sie und beendet sich)
oder auch über ein verstecktes Control im Hautprogramm (Updater schreibt 'Exit' in Control, Hauptprogramm überprüft den Text des Controls, wenn es z.B. 'Exit' enthält, beendet es sich).Ich habe z.B. auch folgendes bei mir im Einsatz: Hauptprogramm.exe überprüft das Vorhandensein von Hauptprogramm.exe.update.exe. Falls vorhanden beendet es sich, benennt sich selbst über einen Batch-Befehl in Hauptprogramm.exe.old.exe um und Hauptprogramm.exe.update.exe in Hauptprogramm.exe und startet diese.
-
-
Ich habe den Fehler schon gefunden!
Aber: Wie legal ist es denn, diese API zu benützen??