Beiträge von funkey
-
-
Danke Oscar, sehr nette Funktion.
Hat Ähnlichkeiten mit der Version aus meinem CSV-Editor, ist aber besser!
-
Danke für Antworten?
Es gibt ja nicht mal eine Frage!
Aber man kann im Window Info Tool unter Options den Coord Mode umschalten
-
-
Man muss im Edit-Feld nur Strg-Tab drücken. Das ist Standard-Windows Funktionalität.

-
Hey, danke! Die Idee war sehr gut! Das ganze läuft dank _Ws2_GetLocalPort() innerhalb von wenigen Sekunden durch.
Aber leider bekomme ich nur auf Win7 nur Ports von 49153 bis 65534 und auf WinXP von 1026 bis 5000!? Auch mit #RequireAdmin. Schade.Eine Lösung könnte sein, die Daten direkt RAW ins Netzwerk zu schicken. Also in meinem Fall alle 50 Bytes, nur 8 davon sind ja im Datenpaket. nur leider weiß ich noch nicht wie.
-
Ist zwar schon länger her, hab aber hier eine Alternativlösung um den lokalen Port zu erhalten:
Spoiler anzeigen
[autoit]UDPStartup()
[/autoit] [autoit][/autoit] [autoit]Global $aSock = UDPOpen("255.255.255.255" , 17009, 1)
[/autoit] [autoit][/autoit] [autoit]
UDPSend($aSock, "")Global $iPortLocal = _Ws2_GetLocalPort($aSock[1])
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite($iPortLocal & @CRLF)Global $netstat = _getDOSOutput("netstat -aonp udp")
[/autoit] [autoit][/autoit] [autoit]
Global $sourceport_array = StringSplit(StringMid($netstat, StringInStr($netstat, '*:*' & @AutoItPID)-5, 5), ':')
Global $sourceport = $sourceport_array[$sourceport_array[0]]ConsoleWrite($sourceport & @CRLF)
[/autoit] [autoit][/autoit] [autoit]UDPCloseSocket($aSock)
[/autoit] [autoit][/autoit] [autoit]
UDPShutdown()Func _Ws2_GetLocalPort($iSocket)
[/autoit] [autoit][/autoit] [autoit]
;funkey
Local $hDLL = DllOpen("Ws2_32.dll")
Local $tagIN_ADDR = "ulong S_addr;"
Local $tagSOCKADDR_IN = "short sin_family;ushort sin_port;ptr sin_addr;char sin_zero[8];"
Local $tIn_Addr = DllStructCreate($tagIN_ADDR)
Local $tName = DllStructCreate($tagSOCKADDR_IN)
DllStructSetData($tName, "sin_addr", DllStructGetPtr($tIn_Addr))Local $aRes = DllCall($hDLL, "int", "getsockname", "uint", $iSocket, "struct*", $tName, "int*", 512)
[/autoit] [autoit][/autoit] [autoit]
Local $aRes2 = DllCall($hDLL, "ushort", "ntohs", "ushort", DllStructGetData($tName, 2))DllClose($hDLL)
[/autoit] [autoit][/autoit] [autoit]
Return $aRes2[0]
EndFuncFunc _getDOSOutput($command)
[/autoit]
Local $text = '', $Pid = Run('"' & @ComSpec & '" /c ' & $command, '', @SW_HIDE, 2 + 4)
While 1
$text &= StdoutRead($Pid, False, False) & @CR
If @error Then ExitLoop
WEnd
Return StringStripWS($text,
;Modifiziert @ Homer J. S.
EndFunc -
Hallo, danke für eure Antworten!
@m-obi: Das werde ich später noch testen, aber dafür braucht man eben WinPcap, und das wollte ich nicht extra installieren.Homer J. S.: Die Suche habe ich benutzt, aber dieser Thread ist mir entgangen. Leider hilft mir das auch nicht, weil sich die Geräte anscheinend nur zurückmelden, wenn der Destination-Port der richtige ist. Also ich bekomme immer noch keine Antwort von den Geräten, auf keinem Port. Schade.
-
Hab mal ein Beispiel von prog@ndy umgebaut.
Das könnte man als Notlösung verwenden, ist aber nicht ganz idealSpoiler anzeigen
[autoit]#NoTrayIcon
[/autoit] [autoit][/autoit] [autoit]
#include <GDIplus.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <Constants.au3>#region NotifyIcon Constants
[/autoit] [autoit][/autoit] [autoit]
Select
Case @OSBuild < 2195
$tagNOTIFYICONDATAW_TEMP = "DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; ptr hIcon; WCHAR szTip[64];"
Case Else
$tagNOTIFYICONDATAW_TEMP = "DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; ptr hIcon; WCHAR szTip[128];" & _
"DWORD dwState; DWORD dwStateMask; WCHAR szInfo[256]; UINT uTimeout; WCHAR szInfoTitle[64]; DWORD dwInfoFlags;"
EndSelectGlobal Const $tagNOTIFYICONDATAW = $tagNOTIFYICONDATAW_TEMP
[/autoit] [autoit][/autoit] [autoit]
Global Const $tagNOTIFYICONDATA = $tagNOTIFYICONDATAWGlobal Const $NIN_BALLOONSHOW = $WM_USER + 2
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global Const $NIN_BALLOONHIDE = $WM_USER + 3
Global Const $NIN_BALLOONTIMEOUT = $WM_USER + 4
Global Const $NIN_BALLOONUSERCLICK = $WM_USER + 5Global Const $NIM_ADD = 0x00000000
[/autoit] [autoit][/autoit] [autoit]
Global Const $NIM_MODIFY = 0x00000001
Global Const $NIM_DELETE = 0x00000002
Global Const $NIM_SETFOCUS = 0x00000003
Global Const $NIM_SETVERSION = 0x00000004Global Const $NIF_MESSAGE = 0x00000001
[/autoit] [autoit][/autoit] [autoit]
Global Const $NIF_ICON = 0x00000002
Global Const $NIF_TIP = 0x00000004
Global Const $NIF_STATE = 0x00000008
Global Const $NIF_INFO = 0x00000010
Global Const $NIF_GUID = 0x00000020
Global Const $NIF_REALTIME = 0x00000040
Global Const $NIF_SHOWTIP = 0x00000080Global Const $NIS_VISIBLE = 0x00000000
[/autoit] [autoit][/autoit] [autoit]
Global Const $NIS_HIDDEN = 0x00000001
Global Const $NIS_SHAREDICON = 0x00000002Global Const $NIIF_NONE = 0x00000000
[/autoit] [autoit][/autoit] [autoit]
Global Const $NIIF_INFO = 0x00000001
Global Const $NIIF_WARNING = 0x00000002
Global Const $NIIF_ERROR = 0x00000003
Global Const $NIIF_USER = 0x00000004
Global Const $NIIF_NOSOUND = 0x00000010
Global Const $NIIF_LARGE_ICON = 0x00000010
Global Const $NIIF_RESPECT_QUIET_TIME = 0x00000080
Global Const $NIIF_ICON_MASK = 0x0000000FGlobal Const $WM_TRAYICONPROC = $WM_USER + 100
[/autoit] [autoit][/autoit] [autoit]Global Const $HWND_For_TrayNotifications = GUICreate(@ScriptName & "TrayMsgWin", 1, 1, 0, 0, 0, 0, -3)
[/autoit] [autoit][/autoit] [autoit]
#endregion NotifyIcon Constants; function to add / modify / delete NotfyIcon
[/autoit] [autoit][/autoit] [autoit]
Func _Shell_NotifyIcon($dwMessage, ByRef $lpdata)
; Prog@ndy
Local $ptr
If IsDllStruct($lpdata) Then
$ptr = DllStructGetPtr($lpdata)
Else
$ptr = Ptr($lpdata)
EndIf
Local $result = DllCall("shell32.dll", "int", "Shell_NotifyIconW", "dword", $dwMessage, "ptr", $ptr)
If @error Then Return SetError(1, @error, 0)
Return SetError($result[0] = 0, 0, $result[0])
EndFunc ;==>_Shell_NotifyIcon; function to create an Icon from a GDIplus-Bitmap
[/autoit] [autoit][/autoit] [autoit]
Func _GDIPlus_BitmapCreateHICONFromBitmap($hBitmap)
; Prog@ndy
Local $result = DllCall($ghGDIPDLL, "int", "GdipCreateHICONFromBitmap", "ptr", $hBitmap, "ptr*", 0)
If @error Then Return SetError(1, @error, 0)
Return SetError($result[0], 0, $result[2])
EndFunc ;==>_GDIPlus_BitmapCreateHICONFromBitmap; Ereignisse für die TrayIcons
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_TRAYICONPROC, "TRAYICONPROC"); GDIPlus starten
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Startup()Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
[/autoit] [autoit][/autoit] [autoit]
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics(16, 16, $hGraphics)
_GDIPlus_GraphicsDispose($hGraphics)$hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
[/autoit] [autoit][/autoit] [autoit]Global $hBrushText = _GDIPlus_BrushCreateSolid(0xFF000000)
[/autoit] [autoit][/autoit] [autoit]
Global $BrushBackground = _GDIPlus_BrushCreateSolid(0xFF00FF00)
_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 16, 16, $BrushBackground)Global $hFormat = _GDIPlus_StringFormatCreate()
[/autoit] [autoit][/autoit] [autoit]
Global $hFontFamily = _GDIPlus_FontFamilyCreate("Arial")
Global $hFont = _GDIPlus_FontCreate($hFontFamily, 10, 0)
Global $tLayout = _GDIPlus_RectFCreate()Global $sLauftext = StringFormat("%s:%s:%s", @HOUR, @MIN, @SEC)
[/autoit] [autoit][/autoit] [autoit]Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sLauftext, $hFont, $tLayout, $hFormat)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawStringEx($hGraphics, $sLauftext, $hFont, $aInfo[0], $hFormat, $hBrushText)OnAutoItExitRegister("OnAutoItExit")
[/autoit] [autoit][/autoit] [autoit]$hIcon = _GDIPlus_BitmapCreateHICONFromBitmap($hBitmap) ; Icon aus Bitmap erstellen
[/autoit] [autoit][/autoit] [autoit]$ICON_ID = 333
[/autoit] [autoit][/autoit] [autoit]$NOTIFYICONDATAW = DllStructCreate($tagNOTIFYICONDATAW) ; Daten für das Icon
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($NOTIFYICONDATAW, 1, DllStructGetSize($NOTIFYICONDATAW))
DllStructSetData($NOTIFYICONDATAW, "hWnd", $HWND_For_TrayNotifications)
DllStructSetData($NOTIFYICONDATAW, "uID", $ICON_ID) ; ID für das Icon
DllStructSetData($NOTIFYICONDATAW, "uFlags", BitOR($NIF_ICON, $NIF_TIP, $NIF_MESSAGE)) ; welche Eigenschaften sollen gesetzt werden
DllStructSetData($NOTIFYICONDATAW, "hIcon", $hIcon) ; Icon-Handle setzen
DllStructSetData($NOTIFYICONDATAW, "szTip", $sLauftext) ; Tooltip setzen
DllStructSetData($NOTIFYICONDATAW, "uCallbackMessage", $WM_TRAYICONPROC) ; die WindowMessage zum Empfangen von Ereignissen festelgen_Shell_NotifyIcon($NIM_ADD, $NOTIFYICONDATAW) ; Das Icon erzeugen
[/autoit] [autoit][/autoit] [autoit]_WinAPI_DestroyIcon($hIcon) ; Das Icon wieder löschen. Das TrayIcon hat eine Kopie davon erhalten.
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($NOTIFYICONDATAW, "uFlags", BitOR($NIF_ICON, $NIF_TIP)) ; Die gleiche Struktur wird später auch verwendet, aber nur, um
; das Icon und den tooltip zu ändern.AdlibRegister("_Marquee", 50)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(23000)
WEndFunc OnAutoItExit()
[/autoit] [autoit][/autoit] [autoit]
AdlibUnRegister()
; Aufräumen
_Shell_NotifyIcon($NIM_DELETE, $NOTIFYICONDATAW) ; das TrayIcon löschen
; GDIPlus freigeben
_GDIPlus_BrushDispose($BrushBackground)
_GDIPlus_BrushDispose($hBrushText)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFontFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
EndFunc ;==>OnAutoItExitFunc _Marquee()
[/autoit] [autoit][/autoit] [autoit]
Local Static $x = 0, $Text = $sLauftext
$x -= 1
_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 16, 16, $BrushBackground)Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $Text, $hFont, $tLayout, $hFormat)
[/autoit] [autoit][/autoit] [autoit]
If $x <= -DllStructGetData($aInfo[0], 3) + 4 Then
$x = 16
$Text = $sLauftext
DllStructSetData($NOTIFYICONDATAW, "szTip", $Text)
EndIf
DllStructSetData($aInfo[0], 1, $x)
_GDIPlus_GraphicsDrawStringEx($hGraphics, $Text, $hFont, $aInfo[0], $hFormat, $hBrushText); Das Icon erzeugen
[/autoit] [autoit][/autoit] [autoit]
$hIcon = _GDIPlus_BitmapCreateHICONFromBitmap($hBitmap)
; Das Icon setzen
DllStructSetData($NOTIFYICONDATAW, "hIcon", $hIcon)
; Das TrayIcon erhält eine Kopie.
_Shell_NotifyIcon($NIM_MODIFY, $NOTIFYICONDATAW)
; Das Icon löschen
_WinAPI_DestroyIcon($hIcon)
EndFunc ;==>_MarqueeFunc TRAYICONPROC($hwnd, $uMsg, $wParam, $lParam)
[/autoit]
; Ereignisse für das TrayIcon
Local $uTrayMsg = _WinAPI_LoWord($lParam)
Local $nID = _WinAPI_HiWord($lParam)
Switch $uTrayMsg
Case $NIN_BALLOONSHOW
ConsoleWrite("Balloon show" & @CRLF)
Case $NIN_BALLOONHIDE
ConsoleWrite("Balloon hide" & @CRLF)
Case $NIN_BALLOONTIMEOUT
ConsoleWrite("Balloon timeout" & @CRLF)
Case $NIN_BALLOONUSERCLICK
ConsoleWrite("Balloon userclick" & @CRLF)
Case $WM_LBUTTONUP
ConsoleWrite("left mousebutton Up" & @CRLF)
Case $WM_RBUTTONUP
ConsoleWrite("right mousebutton Up" & @CRLF)
Case $WM_LBUTTONDOWN
ConsoleWrite("left mousebutton Down, set new value" & @CRLF)
$sLauftext = StringFormat("%s:%s:%s", @HOUR, @MIN, @SEC)
Case $WM_RBUTTONDOWN
ConsoleWrite("right mousebutton Down" & @CRLF)
Case $WM_CONTEXTMENU
ConsoleWrite("Context Menu" & @CRLF)
Case $WM_LBUTTONDBLCLK
ConsoleWrite("left mousebutton doubleclick" & @CRLF)
Exit
EndSwitch
Return _WinAPI_DefWindowProc($hwnd, $uMsg, $wParam, $lParam)
EndFunc ;==>TRAYICONPROC -
OK. Ich mache es dann aber meistens so:
[autoit]Local $aResult = DllCall("user32.dll", "hwnd", "GetWindow", "hwnd", $_hCtrl, "uint", 5) ; 5 = $GW_CHILD
[/autoit]Außerdem sollte
[autoit]If Not IsDeclared("GW_CHILD") Then Global Const $GW_CHILD = 5
[/autoit]
funktionieren, tut es aber nicht!? Es kommt die 'previously declared' Meldung! -
Kann man sicher mal brauchen, danke. Für die 'Magic Number' 5 solltest du vielleicht $GW_CHILD verwenden, damit das ganze leichter verständlich wird.
-
Da gibt es viele Anwendungsgebiete dafür. Ambesten du liest dir das ganze im englischen Forum ab hier oder so durch:
http://www.autoitscript.com/forum/topic/13…_40#entry979069 -
Ich begrüße jede Weiterentwicklung von AutoIt. Wenn ich länger was mit C mache, dann vergesse ich bereits jetzt die $-Zeichen in AutoIt. Ich werde das neue Feature immer einsetzen, sobald eine neue Stable damit herauskommt.
Ich dachte, $a und a sollten komplett unterschiedliche Variablen sein? Ansonsten kommt es sicher zu Verwirrungen.
-
Hallo,
ich habe eine Software, die verschiedene Modbus/TCP-Server im Netzwerk finden kann. Diese Funktionalität hätte ich gerne in AutoIt nachgebaut, nur eben bisher ohne Erfolg.
Ich habe Wireshark benutzt um zu sehen wie das Programm das macht. Und zwar wird via UDP-Broadcast eine 8-Byte Meldung an 255.255.255.255 geschickt. Danach melden sich die einzelnen Geräte nacheinander und schicken ihre Konfiguration (IP, Subnet, Gateway) und ihre Produktnummer zurück. Der PC hat den Port 17009, das Modbus-Gerät 17008.
Wenn ich nun das ganze mit AutoIt versuche, dann ist der ausgehende Port immer ein anderer, deswegen vermute ich, dass ich nichts von den Geräten zurückerhalte. Kann ich irgendwie den ausgehenden Port bestimmen? Mit UDPBind scheint es nicht zu funktionieren.Hier noch eines meiner Test-Versuchsskripte:
Spoiler anzeigen
[autoit]UDPStartup()
[/autoit] [autoit][/autoit] [autoit]Global $ThisPCIP = @IPAddress1
[/autoit] [autoit][/autoit] [autoit]Global $aSocket2 = UDPBind($ThisPCIP, 17009)
[/autoit] [autoit][/autoit] [autoit]
If @error <> 0 Then
ConsoleWrite("error opening $aSocket2, @error = " & @error & @CRLF)
Exit
EndIfGlobal $ThatPCIP = "255.255.255.255" ;broadcast
[/autoit] [autoit][/autoit] [autoit]Global $aSocket = UDPOpen($ThatPCIP, 17008, 1)
[/autoit] [autoit][/autoit] [autoit]
If @error <> 0 Then
ConsoleWrite("error opening $socket" & @CRLF)
Exit
EndIfIf UDPSend($aSocket, Binary("0x3101FFFFFFFFFFFF")) = 0 Then
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "ERROR", "Error while sending UDP message: " & @error)
Exit
EndIf$data = UDPRecv($aSocket2, 512)
[/autoit] [autoit][/autoit] [autoit]
If $data <> "" Then
MsgBox(0, "UDP DATA", $data, 1)
EndIfUDPCloseSocket($aSocket)
[/autoit]
UDPCloseSocket($aSocket2)
UDPShutdown()Hat irgendwer eine Idee, oder zumindest mehr Erfahrung damit? Muss ich die Funktionen aus Ws2_32.dll wrappen, um zum Ziel zu gelangen?
Danke für eure Hilfe!
-
Danke progandy für die Erinnerung, das vergesse ich immer wieder.
-
Ich hätte das so gemacht:
AutoIt
[autoit]Global $strdll = "Freebasic_DLL.dll"
[/autoit] [autoit][/autoit] [autoit]$hDll = DllOpen($strdll)
[/autoit] [autoit][/autoit] [autoit]$a = DllStructCreate("double;double;double;double")
[/autoit] [autoit][/autoit] [autoit]$ptrA = DllStructGetPtr($a)
[/autoit] [autoit][/autoit] [autoit]
$aRet= DllCall($hDll, "none", "f_inTest", "double", 1,"double", 2,"double", 3,"double", 4, "ptr", $ptrA)ConsoleWrite(DllStructGetData($a, 1) & @CRLF)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(DllStructGetData($a, 2) & @CRLF)
ConsoleWrite(DllStructGetData($a, 3) & @CRLF)
ConsoleWrite(DllStructGetData($a, 4) & @CRLF)$b = DllStructCreate("double;double;double;double")
[/autoit] [autoit][/autoit] [autoit]
$ptrB = DllStructGetPtr($b)
$arrPtrB = DllCall($hDll, "none", "f_Test", "ptr", $ptrA, "ptr", $ptrB)ConsoleWrite(DllStructGetData($b, 1) & @CRLF)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(DllStructGetData($b, 2) & @CRLF)
ConsoleWrite(DllStructGetData($b, 3) & @CRLF)
ConsoleWrite(DllStructGetData($b, 4) & @CRLF)DllClose($hDll)
[/autoit]Freebasic_DLL
Code
Alles anzeigenExtern "Windows-MS" TYPE testtype x1 AS DOUBLE x2 AS DOUBLE x3 AS DOUBLE x4 AS DOUBLE END TYPE SUB f_inTest(BYVAL y1 AS DOUBLE, BYVAL y2 AS DOUBLE, BYVAL y3 AS DOUBLE, BYVAL y4 AS DOUBLE, ByRef z AS testtype) Export z.x1 = y1 + 1 z.x2 = y2 + 1 z.x3 = y3 + 1 z.x4 = y4 + 1 'RETURN z END Sub SUB f_Test(BYREF z1 AS testtype, BYREF z2 AS testtype) Export z2.x1 = z1.x1 - 1 z2.x2 = z1.x2 - 1 z2.x3 = z1.x3 - 1 z2.x4 = z1.x4 - 1 'RETURN z2 END Sub END Extern -
Bei MenuItems wird der State mir GuiCtrlRead ausgelesen.
[autoit]#include <GUIConstantsEx.au3>
[/autoit][autoit][/autoit][autoit]$hGui = GUICreate('Test', 600, 400)
[/autoit][autoit][/autoit][autoit]
$idButton = GUICtrlCreateButton('test', 10, 10, 100, 20)$cContext = GUICtrlCreateContextMenu($idButton)
[/autoit][autoit][/autoit][autoit]
$cTest = GUICtrlCreateMenuItem("blabla", $cContext)GUISetState()
[/autoit][autoit][/autoit][autoit]MsgBox(0, 'Test', BitAND(GUICtrlRead($cTest), $GUI_ENABLE) = $GUI_ENABLE)
[/autoit] -
Zitat von Strahleman
habs jetzt hinbekommen, dass über ByRef die ermittelte Struktur an Autoit übergeben wird. Aber kann ich auch diese erstellten Strukturen wieder von Autoit an die DLL zur Weiterverarbeitung zurückübergeben und eine neu berechnete Struktur dann von der DLL erhalten?Natürlich kann man das. Einfach Struktur erstellen (DllStructCreate) und den Pointer der Funktion übergeben (DllStructGetPtr).
Und wenn du von einer Funktion einen Pointer erhältst, dann kannst du diesen auch gleich direkt der nächsten Funktion übergeben. -
Alles was nicht dem Standard entspricht, muss in AutoIt ein Pointer zu einer DLLStruct sein. Am besten ist dann aber auch nicht direkt den Rückgabewert zu verwenden, sondern z.B. den ersten oder letzten Parameter ByRef zu übergeben. Dann hast du auch keine Probleme mit dem 'wer allokiert den Speicher und wer gibt ihn wieder frei'.
-
Hier eine UDF zum Durchklicken von progandy:
[ gelöst ] On Top, durchsichtige und trotzdem durchklicken?Edit: Mal ein kleines 'fieses' Beispiel

Spoiler anzeigen
[autoit];### UDF Start
[/autoit] [autoit][/autoit] [autoit]
#include-once
#include <Winapi.au3>
#include <WindowsConstants.au3>If Not IsDeclared("GWL_EXSTYLE") Then Global $GWL_EXSTYLE = -20
[/autoit] [autoit][/autoit] [autoit];===============================================================================
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;
; Function Name: _Win_SetClickThrough($hWnd,$noclic = True)
; Description:: Makes a window to not receive mouse input
; Parameter(s): $title -> Title or hWnd of Window
; $text [Optional] -> Text in Window
; $noclic [Optional] -> If False, the window regains MouseInput otherwise it will loose it, defalut: True
; Requirement(s): <WINApi.au3>
; Return Value(s): Success: 1, Error0 and @error
; @error Values: 1 -> Window does not exist
; 2 -> Error in Setting the Styles
; Author(s): Prog@ndy
;
;===============================================================================
;
Func _Win_SetClickThrough($title, $text = "", $noclic = True)
Local $hWnd = WinGetHandle($title, $text)
If @error Then Return SetError(1, 0, 0)
If $noclic Then
_WinAPI_SetWindowLong($hWnd, $GWL_EXSTYLE, BitOR(_WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE), $WS_EX_TRANSPARENT))
If @error Then Return SetError(2, 0, 0)
WinSetTrans($hWnd, "", 255) ; Sets the Layered Attribute, but still shows the window
If @error Then Return SetError(2, 0, 0)
Else
_WinAPI_SetWindowLong($hWnd, $GWL_EXSTYLE, BitAND(_WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE), BitNOT($WS_EX_TRANSPARENT)))
If @error Then Return SetError(2, 0, 0)
EndIf
Return 1
EndFunc ;==>_Win_SetClickThrough
;### UDF ENDGlobal $hGui = GUICreate("", 120, 20, @DesktopWidth - 120, 0, $WS_POPUP, $WS_EX_TOPMOST)
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xFF0000)
GUICtrlCreateLabel("Klick mich ;", 0, 0, 120, 20, 0x201)GUISetState()
[/autoit] [autoit][/autoit] [autoit]_Win_SetClickThrough($hGui)
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3_Win_SetClickThrough($hGui, "", 0)
[/autoit]