ZitatWie krieg ich das hin dass er das am ende wieder neu startet?
Genau dafür brauchst du For-Next oder Do-Until.
Das Ganze in einer Schleife abarbeiten.
ZitatWie krieg ich das hin dass er das am ende wieder neu startet?
Genau dafür brauchst du For-Next oder Do-Until.
Das Ganze in einer Schleife abarbeiten.
:lol:
ZitatVllt kann mir ja jemand schnell ein kleines Script schreiben, wäre echt sehr nett!
Also, wir helfen gerne, wenn du Probleme hast. Aber für dich schreiben...
Mach den Anfang und wenn du nicht weiter kommst, frag nach.
Da ist der Code. Da ist ein Beispiel. Weiß nicht, was man da noch mehr erklären sollte...
Du kannst auch ohne MY_WM_COMMAND arbeiten, wenn du nur SingleClick abfragst.
Wichtig ist, du mußt für jedes Item ein Handle erzeugen (z.B. $arItem=..) und darauf mit dem Event ListViewClick verweisen.
#include <GuiConstants.au3>
#include <GuiListView.au3>
Opt ("GUIOnEventMode", 1)
Dim $gui, $listview
$gui = GUICreate("ListView Get Selected Indices", 392, 322)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$listview = GUICtrlCreateListView("col1|col2|col3", 40, 30, 310, 149, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER))
GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
$item1 = GUICtrlCreateListViewItem("line1|data1|more1", $listview)
$item2 = GUICtrlCreateListViewItem("line2|data2|more2", $listview)
$item3 = GUICtrlCreateListViewItem("line3|data3|more3", $listview)
$item4 = GUICtrlCreateListViewItem("line4|data4|more4", $listview)
$item5 = GUICtrlCreateListViewItem("line5|data5|more5", $listview)
For $i = $item1 To $item5
GUICtrlSetOnEvent($i, '_ListViewClick')
Next
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
Sleep(100)
WEnd
Func Form1Close()
Exit
EndFunc
Func _ListViewClick()
Local $s_indices = _GUICtrlListViewGetSelectedIndices($listview)
MsgBox(0,"Selected", "Index: " & $s_indices & @LF & _
"Text: " & _GUICtrlListViewGetItemText($listview, $s_indices))
EndFunc
Was? Die Regwerte in die Liste eintragen?
Mach es gleich in der Schleife beim Auslesen.
Für jeden gelesenen Wert erzeugst du einen ListViewItem().
Hier das Bsp.aus der Hilfe. Ich habe es bei Ausgabe String erweitert, sodass auch der Text des markierten Eintrages zurückgegeben wird.
Tipp: Wenn du nur einen bestimmten (angeklickten) Spalteneintrag ermitteln möchtest, kannst du den Index des SubItems(Spalte) mit GUICtrlGetState() ermitteln.
#include <GuiConstants.au3>
#include <GuiListView.au3>
Opt ('MustDeclareVars', 1)
Dim $listview, $Btn_Exit, $msg, $Status, $Btn_piped, $Btn_array
GUICreate("ListView Get Selected Indices", 392, 322)
$listview = GUICtrlCreateListView("col1|col2|col3", 40, 30, 310, 149, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER))
GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
GUICtrlCreateListViewItem("line1|data1|more1", $listview)
GUICtrlCreateListViewItem("line2|data2|more2", $listview)
GUICtrlCreateListViewItem("line3|data3|more3", $listview)
GUICtrlCreateListViewItem("line4|data4|more4", $listview)
GUICtrlCreateListViewItem("line5|data5|more5", $listview)
$Btn_piped = GUICtrlCreateButton("Return string", 75, 210, 90, 30)
$Btn_array = GUICtrlCreateButton("Return array", 180, 210, 90, 30)
$Btn_Exit = GUICtrlCreateButton("Exit", 150, 260, 70, 30)
$Status = GUICtrlCreateLabel("", 0, 302, 392, 20, BitOR($SS_SUNKEN, $SS_CENTER))
GUISetState()
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE Or $msg = $Btn_Exit
ExitLoop
Case $msg = $Btn_piped
Local $s_indices = _GUICtrlListViewGetSelectedIndices($listview)
If($s_indices == $LV_ERR) Then
GUICtrlSetData($Status, "Not Items Selected")
Else
MsgBox(0,"Selected", "Index: " & $s_indices & @LF & _
"Text: " & _GUICtrlListViewGetItemText($listview, $s_indices))
EndIf
Case $msg = $Btn_array
Local $a_indices = _GUICtrlListViewGetSelectedIndices($listview,1)
If(IsArray($a_indices))Then
Local $i
For $i = 1 To $a_indices[0]
MsgBox(0,"Selected", $a_indices[$i])
Next
Else
GUICtrlSetData($Status, "Not Items Selected")
EndIf
EndSelect
WEnd
Exit
Dem mit F5 gestarteten Run ist zwar der Hotkey Str+Break zum Beenden zugeordnet, das hat bei mir aber auch noch nie funktioniert.
Wählt man den Eintrag im Menü, klappt es.
Mit welchem Programm möchtest du denn mailen?
Ach noch was. Welche IP? LAN oder WAN?
Ich neme einfach mal an, du willst die öffentliche IP.
[autoit]#include <Inet.au3>
[/autoit][autoit][/autoit][autoit]$s_Subject = _GetIP()
[/autoit][autoit][/autoit][autoit]$file = @SystemDir & "\clip1.txt"
$fh = FileOpen($file, 0)
$as_Body = FileRead($fh)
FileClose($fh)
$s_AttachFiles = @SystemDir & "\clip2.txt"
[/autoit]Du kannst ein Skript jederzeit im Taskmanager beenden.
Oder du baust einen HotKey ein.
z.B. HotKeySet("!e", "_ende")
dazu die
Func _ende()
Exit
EndFunc
Manchmal möchte man einen Doppelklick auf ein Picture, Label usw. auswerten.
Für diese Controls existiert aber standardmäßig kein Doppelklick-Ereignis.
Mit dem folgenden Code könnt ihr jedes Control auf einen Doppelklick abfragen.
Macht bei einem Button natürlich wenig Sinn ;).
Viel Spaß damit:
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 0) ; Maus-Koordinaten relativ zum Fenster
Global $start
Global $n = 0
Global $MousePos = True
Global $pos
Global $clickspeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
$Form1 = GUICreate("Form1", 400, 250, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRIMARYdown')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRIMARYup')
$Label1 = GUICtrlCreateLabel("Label1", 30, 40, 40, 17, $SS_SUNKEN)
$Label2 = GUICtrlCreateLabel("Label2", 30, 80, 40, 17, $SS_SUNKEN)
$Input1 = GUICtrlCreateInput("Input1", 90, 40, 70, 20)
$Input2 = GUICtrlCreateInput("Input2", 90, 80, 70, 20)
$Group1 = GUICtrlCreateGroup("Group1", 190, 30, 190, 80)
$Pic1 = GUICtrlCreatePic(@Systemdir & "\oobe\images\mslogo.jpg",100, 140, 200, 50)
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
Sleep(100)
WEnd
Func Form1Close()
Exit
EndFunc
#region DoubleClick Check
Func _PRIMARYdown()
$pos = MouseGetPos()
Select
Case _CheckCtrlDblClick($Form1, $Label1)
_Lbl_1_DblClick()
Case _CheckCtrlDblClick($Form1, $Label2)
_Lbl_2_DblClick()
Case _CheckCtrlDblClick($Form1, $Input1)
_Inp_1_DblClick()
Case _CheckCtrlDblClick($Form1, $Input2)
_Inp_2_DblClick()
Case _CheckCtrlDblClick($Form1, $Pic1)
_Pic_1_DblClick()
Case _CheckCtrlDblClick($Form1, $Group1)
_Group_1_DblClick()
Case Else
$MousePos = False
EndSelect
EndFunc
Func _PRIMARYup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _CheckCtrlDblClick($GUI, $CTRL)
Local $CtrlPos = ControlGetPos($GUI, '', $CTRL)
If ($pos[0] >= $CtrlPos[0] And $pos[0] <= $CtrlPos[0] + $CtrlPos[2]) And _
($pos[1] >= $CtrlPos[1] +20 And $pos[1] <= $CtrlPos[1] +20 + $CtrlPos[3]) Then
$n += 1
$MousePos = True
If $n = 2 And (TimerDiff($start) < $clickspeed) Then
Return True
Else
$start = TimerInit()
$n = 1
EndIf
EndIf
EndFunc
#endregion DoubleClick Check
#region DoubleClick Functions
Func _Lbl_1_DblClick()
MsgBox(0, '', 'Doubleclick Label 1')
EndFunc
Func _Lbl_2_DblClick()
MsgBox(0, '', 'Doubleclick Label 2')
EndFunc
Func _Inp_1_DblClick()
MsgBox(0, '', 'Doubleclick Input 1')
EndFunc
Func _Inp_2_DblClick()
MsgBox(0, '', 'Doubleclick Input 2')
EndFunc
Func _Pic_1_DblClick()
MsgBox(0, '', 'Doubleclick Picture 1')
EndFunc
Func _Group_1_DblClick()
MsgBox(0, '', 'Doubleclick Group 1')
EndFunc
#endregion DoubleClick Functions
Hast du die Speicheradresse mal mit Cheat Engine oder OLLYDBG überprüft?
Ich hab das mal noch etwas komfortabler gestaltet. Du übergibst jetzt Name der GUI und des zu prüfenden Controls an eine Checkfunktion. Damit ist es einfacher, das für viele Controls (auch auf unterschiedlichen GUI) auszuwerten.
Und die Größenparameter der Controls brauchen nicht separat abgespeichert werden.
#include <array.au3>
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 0) ; WICHTIG, Maus-Koordinaten relativ zum Fenster
Dim $start, $n = 0, $MousePos = True, $pos
Dim $clickspeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
$Form1 = GUICreate("Form1", 633, 454, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRdown')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRup')
$Label1 = GUICtrlCreateLabel("Label1", 144, 108, 36, 17)
$Label2 = GUICtrlCreateLabel("Label2", 144, 148, 36, 17)
GUISetState(@SW_SHOW)
While 1
Sleep(100)
WEnd
Func Form1Close()
Exit
EndFunc
Func _PRdown()
$pos = MouseGetPos()
If _CheckCtrlDblClick($Form1, $Label1) Then
_LblDblClick()
ElseIf _CheckCtrlDblClick($Form1, $Label2) Then
_LblDblClick2()
Else
$MousePos = False
EndIf
EndFunc
Func _PRup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _LblDblClick()
MsgBox(0, '', 'Doppelklick Label 1')
EndFunc
Func _LblDblClick2()
MsgBox(0, '', 'Doppelklick Label 2')
EndFunc
Func _CheckCtrlDblClick($GUI, $CTRL)
Local $CtrlPos = ControlGetPos($GUI, '', $CTRL)
If ($pos[0] >= $CtrlPos[0] And $pos[0] <= $CtrlPos[0] + $CtrlPos[2]) And _
($pos[1] >= $CtrlPos[1] +20 And $pos[1] <= $CtrlPos[1] +20 + $CtrlPos[3]) Then
$n += 1
$MousePos = True
If $n = 2 And (TimerDiff($start) < $clickspeed) Then
Return True
Else
$start = TimerInit()
$n = 1
EndIf
EndIf
EndFunc
ControlClick sollte funktionieren - aber der Fenstertitel ist nicht komplett. Es erscheint immer noch die aufgerufene Seite im Titel.
Deshalb verwende am Skriptanfang:
Opt('WinTitleMatchMode', 2)
[/autoit]Somit wird das Fenster erkannt, wenn nur ein Teil des Titels vorhanden ist.
send("{NUMPADENTER}") brauchst du nicht.
1. Schau dir mal RegEnumKey() an
2. Das Ereignis $NM_CLICK kannst du dafür nutzen.
Wenn das Ereignis eintritt,fragst du den Index des selektierten ListView-Eintrages ab und kannst damit dann den Text des Eintrags zurückgeben.
#include <guiconstants.au3>
#include <guilistview.au3>
Global $listview
Global Const $WM_NOTIFY = 0x004E
Global Const $NM_FIRST = 0
Global Const $NM_LAST = (-99)
Global Const $NM_OUTOFMEMORY = ($NM_FIRST - 1)
Global Const $NM_CLICK = ($NM_FIRST - 2)
Global Const $NM_DBLCLK = ($NM_FIRST - 3)
$main = GUICreate('')
$listview = GUICtrlCreateListView ("Name|Ping" , 9,150,191,580, -1, BitOR($LVS_EX_REGIONAL, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
GUICtrlCreateListViewItem("G0011111" & "|" & "3ms",$listview )
GUIRegisterMsg($WM_NOTIFY, "MY_WM_COMMAND")
GUISetState()
While 1
$msg = GUIGetMsg()
Select
Case $msg = - 3
Exit
;Case $msg = $listview
;_GUICtrlListViewSort($B_DESCENDING_listview , $B_DESCENDING_listview , GUICtrlGetState($B_DESCENDING_listview ))
EndSelect
WEnd
Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
#forceref $hWndGUI, $MsgID
Local $tagNMHDR, $event
Switch $wParam
Case $listview
$tagNMHDR = DllStructCreate("int;int;int", $lParam)
If @error Then Return
$event = DllStructGetData($tagNMHDR, 3)
Switch $event
Case $NM_CLICK
MsgBox(64, 'Info', 'You clicked the listview')
EndSwitch
EndSwitch
$tagNMHDR = 0
EndFunc
ZitatOriginal von Tweaky
Ich nehme immer GUIGetMsg(), weil ich dann z. B. einem Button 2 Funktionen hintereinander ablaufen lassen kann
Das geht doch im OnEvent-Mode genauso:
[autoit]$button = GUICtrlCreateButton()
GUICtrlSetOnEvent(-1, '_$button')
;
;
Func _button()
Func1()
Func2()
; usw.
EndFunc
Man kann dies auch mit GUIGetMsg verwenden, allerdings nicht zu empfehlen, da eine Vermischung von GUIGetMsg und OnEvent zu unvorhersehbaren Ergebnissen führen kann (s. dein Problem mit dem Button).
OnEvent ist, gerade bei größeren Projekten, wesentlich übersichtlicher.
Jedem Event wird eine Funktion zugewiesen. Das ist vor allem bei der Arbeit mit mehreren GUI wesentlich effektiver zu programmieren als mit der GUIGetMsg-Methode.
Ich kann OnEvent nur empfehlen.
Stichwort: OnEvent - Mode
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 0) ; WICHTIG, Maus-Koordinaten relativ zum Fenster
Dim $start, $n = 0, $MousePos = True
Dim $lb_left[1000], $lb_top[1000], $lb_width[1000], $lb_height[1000]
$lb_left[1] = 244
$lb_top[1] = 108
$lb_width[1] = 36
$lb_height[1] = 17
$lb_left[2] = 244
$lb_top[2] = 18
$lb_width[2] = 36
$lb_height[2] = 17
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 433, 154, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "_ende")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRdown')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRup')
$Label1 = GUICtrlCreateLabel("Label1", $lb_left[1], $lb_top[1], $lb_width[1], $lb_height[1])
$Label1 = GUICtrlCreateLabel("Label2", $lb_left[2], $lb_top[2], $lb_width[2], $lb_height[2])
$beenden = GUICtrlCreateButton("beenden", 40, 10, 50, 50, $BS_ICON)
GUICtrlSetOnEvent(-1, '_ende')
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
Sleep(100)
WEnd
Func _ende()
Exit
EndFunc
Func _PRdown()
$pos = MouseGetPos()
For $i = 1 to 2
If ($pos[0] >= $lb_left[$i] And $pos[0] <= $lb_left[$i] + $lb_width[$i]) And _
($pos[1] >= $lb_top[$i] +20 And $pos[1] <= $lb_top[$i] +20 + $lb_height[$i]) Then
$n += 1
$MousePos = True
If $n = 2 And (TimerDiff($start) < 120) Then
_LblDblClick($i)
Else
$start = TimerInit()
$n = 1
EndIf
Else
$MousePos = False
EndIf
Next
EndFunc
Func _PRup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _LblDblClick($i)
Select
Case $i = 1
MsgBox(0, $i, 'Hurra Doppelklick 1. Button')
Case $i = 2
MsgBox(0, $i, 'Hurra Doppelklick 2. Button')
EndSelect
EndFunc
Dazu mußt du nach Position differenzieren.
Also innerhalb der PRIMARYDOWN-Funktion eine erweiterte IF-Abfrage mit den Koordinaten des anderen Labels.
Versuch dich mal, wenns nichts wird melde dich wieder
Aktuelle Version von Scite4Autoit installieren. Link oben rechts im Portal. Da ist alles enthalten.