Hallo AutoIt.de,
lange habe ich gesucht nach einer UDF, um Applets für meine G19 zu schreiben. Leider habe ich dazu nichts gefunden, woraufhin ich beschlossen habe, mir meine eigene UDF zu schreiben.
Die UDF läuft mit AdvanceLcd, eine DLL um Applets für Logitech Produkte zu erstellen, da mir das normale Logitech SDK zu umständlich erscheint und ich nicht dahinter gekommen bin, wie ich die DLLs mit AutoIt verwende. Des Weiteren ist AdvanceLcd vielseitiger, das heißt, man kann damit nicht nur die G19, sondern auch die G15 und andere Geräte ansprechen.
Nun aber zur UDF.
Funktionen:
Spoiler anzeigen
UDF Rev. 1:
Spoiler anzeigen
; Logitech G19 UDF
; Autor: Carsten Schneider aka Carsten8
; Datum: 24.07.2010
; Veröffentlichung: 31.07.2010
; Diese UDF benötigt die AdvanceLcd (http://www.blitzforum.de/forum/viewtopic.php?p=362484) DLL
; sowie installierte Gerätetreiber. Das Copyright von AdvanceLcd besitzt ChristianK von blitzforum.de.
; #CONSTANTS# ===================================================================================================================
Global Const $LCD_OK = 0
Global Const $LCD_ERROR = 1
Global Const $LCD_ERROR_NOT_INITIALIZED = 2
Global Const $LCD_ERROR_INVALID_PARAMETER = 3
Global Const $LCD_ERROR_NOT_FOUND = 4
Global Const $LCD_DEVICE_INVALID = -1
Global Const $LCD_DEVICE_MONO = 1
Global Const $LCD_DEVICE_COLOR = 2
Global Const $LCD_EVENT_CONFIGURE = 1
Global Const $LCD_EVENT_BUTTON = 2
Global Const $LCD_BUTTON_1 = 0x0001
Global Const $LCD_BUTTON_2 = 0x0002
Global Const $LCD_BUTTON_3 = 0x0004
Global Const $LCD_BUTTON_4 = 0x0008
Global Const $LCD_BUTTON_LEFT = 0x0100
Global Const $LCD_BUTTON_RIGHT = 0x0200
Global Const $LCD_BUTTON_OK = 0x0400
Global Const $LCD_BUTTON_CANCEL = 0x0800
Global Const $LCD_BUTTON_UP = 0x1000
Global Const $LCD_BUTTON_DOWN = 0x2000
Global Const $LCD_BUTTON_MENU = 0x4000
Global Const $LCD_PRIORITY_LOW = 1
Global Const $LCD_PRIORITY_NORMAL = 2
Global Const $LCD_PRIORITY_HIGH = 3
Global Const $LCD_COLOR_VISIBLE = 0xFFFFFF
Global Const $LCD_COLOR_INVISIBLE = 0
Global Const $LCD_FONT_DEFAULT = 0
Global Const $LCD_FONT_BOLD = 1
Global Const $LCD_FONT_ITALIC = 2
Global Const $LCD_FONT_UNDERLINE = 4
; ===============================================================================================================================
; #VARIABLEN# ===================================================================================================================
Global $dll = 0
Global $callback = -1
; ===============================================================================================================================
; #FUNKTIONEN# ==================================================================================================================
;LcdInitialize
;LcdDeInitialize
;LcdCreateApplet
;LcdDeleteApplet
;LcdLoadPixmap
;LcdCreatePixmap
;LcdSetTarget
;LcdClear
;LcdDrawPixmap
;LcdDeletePixmap
;LcdWaitActivation
;LcdUpdate
;LcdSetEventHandler [INSTABIL]
;LcdButtonState
; ===============================================================================================================================
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdInitialize
; Beschreibung ..: Initialisiert AdvanceLcd
; Syntax ........: LcdInitialize([$sDLLPath = "advlcd.dll"])
; Parameter .....: $sDLLPath - Pfad zur advlcd.dll
; Rückgabewerte .: Erfolg - $LCD_OK
; Fehler - $LCD_ERROR
; Bemerkungen ...:
; Verwandt ......: LcdDeInitialize
; ===============================================================================================================================
Func LcdInitialize($sDLLPath = "advlcd.dll")
$dll = DllOpen($sDLLPath)
Local $ret = DllCall($dll, "int", "LcdInitialize")
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdInitialize
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdDeInitialize
; Beschreibung ..: Deinitialisiert AdvanceLcd
; Syntax ........: LcdDeInitialize()
; Parameter .....:
; Rückgabewerte .:
; Bemerkungen ...: Vorher sollten alle Applets, Pixmaps etc. gelöscht werden.
; Verwandt ......: LcdInitialize
; ===============================================================================================================================
Func LcdDeInitialize()
If $callback <> -1 Then DllCallbackFree($callback)
Local $ret = DllCall($dll, "int", "LcdDeInitialize")
If @error Then Return SetError(1, @error, 0)
DllClose($dll)
Return $ret[0]
EndFunc ;==>LcdDeInitialize
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdCreateApplet
; Beschreibung ..:
; Syntax ........: LcdCreateApplet($sName, [$iDevices = $LCD_DEVICE_COLOR, [$bConfigurable = 0, [$bAutostart = 0]]])
; Parameter .....: $sName - Der Name des Applets. Er wird später auf dem LCD und im LCD Manager angezeigt.
; $iDevices - Der Gerätetyp, der verwendet werden soll. Siehe Bemerkungen.
; $bConfigurable - Gibt an, ob der "Konfigurieren"-Button im LCD Manager anklickbar sein soll.
; $bAutostart - Gibt an, ob der LCD Manager das Applet automatisch starten kann.
; Rückgabewerte .: Erfolg - Ein Handle des Applets
; Bemerkungen ...: $iDevices kann entweder $LCD_DEVICE_MONO oder $LCD_DEVICE_COLOR sein. Wird beides verwendet, so muss
; bei späteren Aktionen das Gerät per LcdSelectDevice ausgewählt werden.
; Verwandt ......: LcdSelectDevice LcdDeleteApplet
; ===============================================================================================================================
Func LcdCreateApplet($sName, $iDevices = $LCD_DEVICE_COLOR, $bConfigurable = 0, $bAutostart = 0)
Local $ret = DllCall($dll, "ptr", "LcdCreateAppletA", "str", $sName, "int", $iDevices, "int", $bConfigurable, "int", $bAutostart)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdCreateApplet
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdDeleteApplet
; Beschreibung ..:
; Syntax ........: LcdDeleteApplet($hApplet)
; Parameter .....: $hApplet - Handle des Applets, welches gelöscht werden soll.
; Rückgabewerte .:
; Bemerkungen ...: Sollte vor LcdDeInitialize aufgerufen werden.
; Verwandt ......: LcdCreateApplet LcdDeInitialize
; ===============================================================================================================================
Func LcdDeleteApplet($hApplet)
Local $ret = DllCall($dll, "int", "LcdDeleteApplet", "ptr", $hApplet)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdDeleteApplet
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdLoadPixmap
; Beschreibung ..:
; Syntax ........: LcdLoadPixmap($sFile)
; Parameter .....: $sFile - Der Pfad zu der Bilddatei, die geladen werden soll.
; Rückgabewerte .: Erfolg - Das Handle der Pixmap
; Bemerkungen ...: Unterstützte Formate: JPG, PNG, BMP, TIFF und GIF
; Verwandt ......: LcdCreatePixmap LcdDeletePixmap
; ===============================================================================================================================
Func LcdLoadPixmap($sFile)
Local $ret = DllCall($dll, "ptr", "LcdLoadPixmapA", "str", $sFile)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdLoadPixmap
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdCreatePixmap
; Beschreibung ..: Erstellt eine neue leere Pixmap
; Syntax ........: LcdCreatePixmap([$iWidth = 320, [$iHeight = 240, [$iDevice = $LCD_DEVICE_COLOR]]])
; Parameter .....: $iWidth - Breite der Pixmap
; $iHeight - Höhe der Pixmap
; $iDevice - Typ des Geräts, für das die Pixmap erstellt werden soll.
; Rückgabewerte .: Erfolg - Das Handle der Pixmap
; Bemerkungen ...:
; Verwandt ......: Lcd
; ===============================================================================================================================
Func LcdCreatePixmap($iWidth = 320, $iHeight = 240, $iDevice = $LCD_DEVICE_COLOR)
Local $ret = DllCall($dll, "ptr", "LcdCreatePixmap", "int", $iWidth, "int", $iHeight, "int", $iDevice)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdCreatePixmap
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdSetTarget
; Beschreibung ..: Setzt das aktuelle Renderziel.
; Syntax ........: LcdSetTarget($hApplet, $hPixmap)
; Parameter .....: $hApplet - Das Handle des Applets, dessen Renderziel gesetzt werden soll.
; $hPixmap - Ein Handle zu einer Pixmap, welche das Renderziel sein soll. Bemerkungen beachten!
; Rückgabewerte .:
; Bemerkungen ...: $hPixmap kann nur eine Pixmap sein, die mit LcdCreatePixmap erstellt wurde.
; 0 verwenden, um das Renderziel zurückzusetzen.
; Verwandt ......: LcdCreatePixmap
; ===============================================================================================================================
Func LcdSetTarget($hApplet, $hPixmap)
Local $ret = DllCall($dll, "int", "LcdSetTarget", "ptr", $hApplet, "ptr", $hPixmap)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdSetTarget
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdClear
; Beschreibung ..: Leert den Buffer des LCDs.
; Syntax ........: LcdClear($hApplet, [$iColor = 0x000000])
; Parameter .....: $hApplet - Das Applet, dessen Buffer geleert werden soll.
; $iColor - Die Farbe, mit der der Buffer überschrieben werden soll.
; Rückgabewerte .:
; Bemerkungen ...:
; Verwandt ......:
; ===============================================================================================================================
Func LcdClear($hApplet, $iColor = 0x000000)
Local $ret = DllCall($dll, "int", "LcdClear", "ptr", $hApplet, "int", $iColor)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdClear
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdDrawPixmap
; Beschreibung ..: Zeichnet eine Pixmap in den Buffer eines Applets.
; Syntax ........: LcdDrawPixmap($hApplet, [$hPixmap, [$iX = 0, [$iY = 0, [$iFrame = 0]]]])
; Parameter .....: $hApplet - Das Applet, in dessen Buffer die Pixmap gezeichnet werden soll.
; $hPixmap - Die Pixmap, die gezeichnet werden soll.
; $iX - Die X-Koordinate, der oberen linken Ecke der Pixmap
; $iY - Die Y-Koordinate, der oberen linken Ecke der Pixmap
; $iFrame - Die Framezahl, sollte die Pixmap mit LcdLoadAnimPixmap erstellt worden sein.
; Rückgabewerte .:
; Bemerkungen ...:
; Verwandt ......: LcdLoadAnimPixmap
; ===============================================================================================================================
Func LcdDrawPixmap($hApplet, $hPixmap, $iX = 0, $iY = 0, $iFrame = 0)
Local $ret = DllCall($dll, "int", "LcdDrawPixmap", "ptr", $hApplet, "ptr", $hPixmap, "int", $iX, "int", $iY, "int", $iFrame)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdDrawPixmap
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdDeletePixmap
; Beschreibung ..: Löscht eine Pixmap
; Syntax ........: LcdDeletePixmap($hPixmap)
; Parameter .....: $hPixmap - Das Handle der Pixmap, die gelöscht werden soll.
; Rückgabewerte .:
; Bemerkungen ...: Sollte vor LcdDeInitialize aufgerufen werden.
; Verwandt ......: LcdCreatePixmap LcdLoadPixmap LcdDeInitialize
; ===============================================================================================================================
Func LcdDeletePixmap($hPixmap)
Local $ret = DllCall($dll, "int", "LcdDeletePixmap", "ptr", $hPixmap)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdDeletePixmap
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdWaitActivation
; Beschreibung ..: Wartet, bis das Applet aktiviert wird.
; Syntax ........: LcdWaitActivation($hApplet)
; Parameter .....: $hApplet - Das Handle des Applets, auf wessen Aktivierung gewartet werden soll.
; Rückgabewerte .:
; Bemerkungen ...:
; Verwandt ......:
; ===============================================================================================================================
Func LcdWaitActivation($hApplet)
Local $ret = DllCall($dll, "int", "LcdWaitActivation", "ptr", $hApplet)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdWaitActivation
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdUpdate
; Beschreibung ..: Aktualisiert das LCD und zeigt den aktuellen Buffer des Applets an.
; Syntax ........: LcdUpdate($hApplet, [$bSync = 0])
; Parameter .....: $hApplet - Das Handle des Applet, dessen Buffer angezeigt werden soll.
; $bSync - Gibt an, ob gewartet werden soll, bis der Buffer angezeigt wird, oder nicht.
; Rückgabewerte .:
; Bemerkungen ...: Wenn $bSync True ist, läuft das Script weiter, sobald der Inhalt des Buffers an den LCD Manger gesendet wurde.
; Wenn $bSync False ist, läuft das Script erst weiter, wenn der Inhalt des Buffers auf dem LCD angezeigt wird (ca. 30ms langsamer)
; Verwandt ......:
; ===============================================================================================================================
Func LcdUpdate($hApplet, $bSync = 0)
Local $ret = DllCall($dll, "int", "LcdUpdate", "ptr", $hApplet, "int", $bSync)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdUpdate
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdSetEventHandler
; Beschreibung ..: Legt eine Funktion als Eventhandler für ein Applet fest.
; Syntax ........: LcdSetEventHandler($hApplet, $EventHandler, [$hContext = 0])
; Parameter .....: $hApplet - Das Handle des Applets, dessen Eventhandler gesetzt werden soll.
; $EventHandler - Name der Funktion, die als Eventhandler dienen soll.
; $hContect -
; Rückgabewerte .:
; Bemerkungen ...: Die Funktion ist sehr instabil und kann zu Abstürzen des Scripts führen.
; Die Funktion muss immer folgende Parameter besitzen:
; _BeispielCallback($iEvent, $hContext, $iData)
; Verwandt ......:
; ===============================================================================================================================
Func LcdSetEventHandler($hApplet, $EventHandler, $hContext = 0)
If $callback <> -1 Then DllCallbackFree($callback)
$callback = DllCallbackRegister($EventHandler, "int", "int;ptr;int")
Local $ret = DllCall($dll, "int", "LcdSetEventHandler", "ptr", $hApplet, "ptr", DllCallbackGetPtr($callback), "ptr", $hContext)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdSetEventHandler
; #FUNKTION# ====================================================================================================================
; Name ..........: LcdButtonState
; Beschreibung ..: Ermittelt den Status eines Knopfes des LCDs.
; Syntax ........: LcdButtonState($hApplet, $iButton)
; Parameter .....: $hApplet - Das Handle des Applets
; $iButton - Die ID des Knopfes
; Rückgabewerte .:
; Bemerkungen ...: $iButton kann, je nach Gerätetyp, eine der folgenden Variablen sein:
; $LCD_BUTTON_1
; $LCD_BUTTON_2
; $LCD_BUTTON_3
; $LCD_BUTTON_4
;
; $LCD_BUTTON_LEFT
; $LCD_BUTTON_RIGHT
; $LCD_BUTTON_OK
; $LCD_BUTTON_CANCEL
; $LCD_BUTTON_UP
; $LCD_BUTTON_DOWN
; $LCD_BUTTON_MENU
; Verwandt ......: LcdConfigState
; ===============================================================================================================================
Func LcdButtonState($hApplet, $iButton)
Local $ret = DllCall($dll, "int", "LcdButtonState", "ptr", $hApplet, "int", $iButton)
If @error Then Return SetError(1, @error, 0)
Return $ret[0]
EndFunc ;==>LcdButtonState
Beispiel (einfache Bildschirmlupe ohne Vergrößerung):
Spoiler anzeigen
#include <AdvanceLCD.au3>
#include <ScreenCapture.au3>
; Beim Beenden killfunc aufrufen
OnAutoItExitRegister("killfunc")
; AdvanceLcd initialisieren
LcdInitialize()
; Applet erstellen
$hApplet = LcdCreateApplet("Bildschirm")
; LCD als Ziel späterer DrawPixmap Befehle setzen
LcdSetTarget($hApplet, 0)
While 1
; Warten bis das Applet aktiviert wird
LcdWaitActivation($hApplet)
; Screenshot der Umgebung der Maus erstellen. Größe optimal für das LCD, Format BMP (beides für bessere Performance)
$aPos = MouseGetPos()
_ScreenCapture_Capture(@TempDir & "\screenshot.bmp", $aPos[0] - 160, $aPos[1] - 120, $aPos[0] + 160, $aPos[1] + 120)
; Bild laden
$hPixmap = LcdLoadPixmap(@TempDir & "\screenshot.bmp")
; LCD leeren
LcdClear($hApplet, 0x000000)
; Pixmap auf das LCD zeichnen
LcdDrawPixmap($hApplet, $hPixmap)
; Änderungen auf dem LCD anzeigen
LcdUpdate($hApplet, 0)
; Pixmap wieder löschen
LcdDeletePixmap($hPixmap)
WEnd
Func killfunc()
; Applet löschen
LcdDeleteApplet($hApplet)
; AdvanceLcd deinitialisieren
LcdDeInitialize()
EndFunc ;==>killfunc
Todo:
- Weitere Funktionen einbauen
- ANSI Funktionen umschreiben für Unicode Unterstützung
- Evtl. Standardwerte der Parameter der Funktionen setzen
- Callback Bug beheben
- Weitere Beispiele schreiben
Download von AdvanceLcd:
[DOWNLOAD - Klick mich]
In dem Archiv findet ihr einen Ordner Binary. Darin befinden sich zwei weitere Ordner, x86 (32-Bit) und x64 (64-Bit). In den Ordnern befinden sich die jeweiligen DLL Dateien, die ihr braucht.
Wichtig!
Die ganze UDF ist noch WIP (Work-In-Progress). Das heißt, es können noch Bugs auftreten und es fehlen noch Funktionen, die ich mit der Zeit noch ergänzen werde.
Sollten Fehler bei euch auftreten oder solltet ihr Verbesserungsvorschläge oder Kritik haben, bitte ich euch, diese hier zu posten.
Gruß,
Carsten8