Von mir auch einen ganz herzlichen Glückwunsch zum Geburtstag.
Von mir auch einen ganz herzlichen Glückwunsch zum Geburtstag.
Entschuldige, dass wir Dich (fast) vergessen haben. Hier auch ein Thread für Dich:
Herzlichen Glückwunsch zum Geburtstag!
Alles Gute zu Deinem heutigen Geburtstag!
Meinst Du so:
[autoit]
#include <Array.au3>
$string = 'fejrgw4398tzgerfdknvmnqt4i23erwfdsmnvsfkjvnbo4r3tj20wiuesdncvjdsnvn4htio3öadfns'
$array = StringRegExp($string, '.{1,10}', 3)
_ArrayDisplay($array)
Es gibt auch eine Lösung, bei der man die UAC nicht bestätigen muss. Die nennt sich "Aufgabenplanung" und es gibt sie seit Vista. Dort kann man einstellen, dass ein Programm mit den höchsten Rechten gestartet wird.
Vorgehensweise findest Du hier: Aufgabenplanung
Ich habe noch eine Frage:
Warum nimmst Du nicht das Scripting.Dictionary-Objekt?
![]()
funkey: Ich hatte auch erst mit GuiRegisterMsg getestet, aber die Nummern werden nicht während des scrollens generiert. Das funktioniert nur mit der Timer-UDF.
Edit: Dein Skript mit Inhalt:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
GUICreate("Editor", 500, 500)
GUIRegisterMsg(0x0111, "_WM_COMMAND")
Global $LineCounter = GUICtrlCreateEdit("1", 0, 0, 40, 500, 0x6)
GUICtrlSetBkColor(-1, 0xCCCCCC)
Global $nEdit = GUICtrlCreateEdit("", 40, 0, 460, 500)
GUICtrlSetLimit(-1, 99999999)
$sText = FileRead(StringRegExpReplace(@AutoItExe, '(.+\\).+', '$1') & 'Examples\GUI\Advanced\msgboxwizard.au3') ; irgendeinen Text laden
GUICtrlSetData($nEdit, $sText) ; und im Editfeld anzeigen
GUISetState()
[/autoit] [autoit][/autoit] [autoit]Do
Until GUIGetMsg() = -3
Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
$nNotifyCode = BitShift($wParam, 16)
$nID = BitAND($wParam, 0x0000FFFF)
$hCtrl = $lParam
Switch $nID
Case $LineCounter
GUICtrlSetState($nEdit, $GUI_FOCUS)
Case $nEdit
Local $nline = GUICtrlSendMsg($nEdit, $EM_GETLINECOUNT, -1, 0)
Local $sCounter
For $i = GUICtrlSendMsg($nEdit, $EM_GETFIRSTVISIBLELINE, 0, 0) + 1 To $nline
$sCounter &= $i & @CRLF
Next
If GUICtrlRead($LineCounter) <> $sCounter Then GUICtrlSetData($LineCounter, $sCounter)
EndSwitch
EndFunc ;==>_WM_COMMAND
Ich denke mal, Du meinst sowas:
#include <EditConstants.au3>
#include <GuiEdit.au3>
#include <Timers.au3>
#include <WindowsConstants.au3>
$hGui = GUICreate('Textreader v0.1', 800, 600)
GUISetBkColor(0x888888)
GUISetFont(10, 400, 0, 'Courier New')
$hLineNumber = GUICtrlCreateEdit('', 10, 10, 50, 580, BitOR($ES_READONLY, $ES_RIGHT))
GUICtrlSetBkColor(-1, 0xDDDDDD)
$hTextReader = GUICtrlCreateEdit('', 60, 10, 730, 580, BitOR($ES_READONLY, $WS_VSCROLL, $WS_HSCROLL))
GUICtrlSetBkColor(-1, 0xFFFFDD)
GUICtrlSetLimit(-1, 99999999)
$sText = FileRead(StringRegExpReplace(@AutoItExe, '(.+\\).+', '$1') & 'Examples\GUI\Advanced\msgboxwizard.au3') ; irgendeinen Text laden
GUICtrlSetData($hTextReader, $sText) ; und im Editfeld anzeigen
$iOldLine = -1
GUISetState()
_Timer_SetTimer($hGui, 50, '_EditSetNumber')
Do
Until GUIGetMsg() = -3
_Timer_KillAllTimers($hGui)
Exit
Func _EditSetNumber($hWnd, $Msg, $iIDTimer, $dwTime)
#forceref $hWnd, $Msg, $iIDTimer, $dwTime
Local $iFirstVisibleLine, $sNumber = ''
$iFirstVisibleLine = _GUICtrlEdit_GetFirstVisibleLine($hTextReader)
If $iFirstVisibleLine = 0 Then $iFirstVisibleLine = 1
If $iFirstVisibleLine = $iOldLine Then Return
$iOldLine = $iFirstVisibleLine
For $i = 0 To 34
$sNumber &= $iFirstVisibleLine + $i & @CRLF
Next
GUICtrlSetData($hLineNumber, $sNumber)
ControlFocus($hGui, '', $hTextReader)
EndFunc
Jemand eine Idee?
Ja, Du könntest das Skript posten. ![]()
Dazu hatte ich mal ein Beispiel erstellt:
#include <GUIConstants.au3>
Opt('TrayMenuMode', 3) ; Tray-Standardmenü ausschalten
Opt('TrayAutoPause', 0) ; AutoPause ausschalten
Opt('TrayIconHide', 1) ; Tray-Menü verstecken
Global $TrayShow = TrayCreateItem('Test anzeigen') ; Tray-Menü erstellen
Global $TrayExit = TrayCreateItem('Beenden') ; Tray-Menü erstellen
TraySetClick(16) ; Rechte Maustaste für das Tray-Menü benutzen
Global $GUI = GUICreate('Test', 640, 180, -1, -1) ; Fenster erstellen
GUISetState() ; GUI-Fenster anzeigen
While 1 ; MessageLoop-Schleife
Switch GUIGetMsg() ; Anhand des eingetretenen GUI-Ereignisses die entsprechenden Befehle ausführen
Case $GUI_EVENT_MINIMIZE ; Benutzer hat auf Minimieren geklickt
Opt('TrayIconHide', 0) ; Tray-Menü anzeigen
TraySetIcon(@SystemDir & '\shell32.dll', -24) ; Icon für Tray-Menü setzen
GUISetState(@SW_HIDE, $GUI) ; Fenster verstecken
Case $GUI_EVENT_CLOSE
Exit ; Programm beenden
EndSwitch
Switch TrayGetMsg() ; Anhand des eingetretenen Tray-Ereignisses die entsprechenden Befehle ausführen
Case $TrayShow ; wurde 'Anzeigen' aufgerufen, dann...
Opt('TrayIconHide', 1) ; Tray-Menü wieder verstecken
GUISetState(@SW_SHOW, $GUI) ; Fenster anzeigen
GUISetState(@SW_RESTORE, $GUI) ; und wiederherstellen (minimieren rückgängig machen)
Case $TrayExit ; Benutzer hat 'Beenden' ausgewählt
Exit ; Programm beenden
EndSwitch
Wend
Gibt's da auch einen DLLCall dafür, um den Style noch etwas zu ändern
Ist mir nicht bekannt.
Und ja, mit "einfarbig" meine ich mein Beispiel von oben. Also je eine Farbe für den Vorder-/Hintergrund.
Der DLL-Call funktioniert bei allen aktuellen Windows-Versionen (XP, Vista, Win7).
Leider wird transparent dabei nicht unterstützt. Du müsstest da schon mit der einfarbigen Progressbar arbeiten.
Alternativen wären ein Label wie schon von Dir verwendet (flackert) oder eine GDI+ Lösung.
Mit einer klassischen Progressbar und entsprechend angepasster Hintergrundfarbe sieht das doch ganz gut aus:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$hGUI = GUICreate("Test", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
GUISetBkColor(0x000000)
GUICtrlCreatePic("GUI.gif",0,0,989,768)
DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 0)
$hProgress = GUICtrlCreateProgress(225, 115, 700, 6)
GUICtrlSetBkColor(-1, 0x009640)
GUICtrlSetColor(-1, 0xFF0000)
DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 7)
$hGUI2 = GUICreate("", 599, 386, 150, 230, $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_LAYERED, $hGUI)
GUICtrlCreatePic("24852.gif", 0, 0, 599, 386)
GUISetState (@SW_SHOW, $hGUI)
GUISetState (@SW_SHOW, $hGUI2)
$Progress = 0
Do
$Progress += 1
GUICtrlSetData($hProgress, $Progress)
Sleep(50)
Until $Progress > 99
Hier mal ein Beispiel:
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
$hGui = GUICreate('ListView-Beispiel', 600, 400)
$hListView = GUICtrlCreateListView('A|B|C', 10, 10, 580, 300, $LVS_SHOWSELALWAYS)
GUICtrlSetBkColor(-1, 0xAAAAAA)
For $i = 0 To 9
GUICtrlCreateListViewItem(StringFormat('%s|%s|%s', Random(0, 9, 1), Random(0, 9, 1), Random(0, 9, 1)), $hListView)
Next
$hUp = GUICtrlCreateButton('/\', 10, 320, 24, 20)
GUICtrlSetFont(-1, 8, 600, 0, 'Lucida Console')
$hDn = GUICtrlCreateButton('\/', 10, 340, 24, 20)
GUICtrlSetFont(-1, 8, 600, 0, 'Lucida Console')
GUISetState()
ControlListView($hGui, '', $hListView, 'Select', 2, 4)
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $hUp
$iSelectCount = ControlListView($hGui, '', $hListView, 'GetSelectedCount')
If $iSelectCount = 0 Then
ControlListView($hGui, '', $hListView, 'Select', 0)
Else
$iFirstSelected = ControlListView($hGui, '', $hListView, 'GetSelected')
$iItemCount = ControlListView($hGui, '', $hListView, 'GetItemCount')
If $iFirstSelected > 0 Then
ControlListView($hGui, '', $hListView, 'SelectClear')
ControlListView($hGui, '', $hListView, 'Select', $iFirstSelected - 1, $iFirstSelected - 2 + $iSelectCount)
EndIf
EndIf
Case $hDn
$iSelectCount = ControlListView($hGui, '', $hListView, 'GetSelectedCount')
If $iSelectCount = 0 Then
ControlListView($hGui, '', $hListView, 'Select', 0)
Else
$iFirstSelected = ControlListView($hGui, '', $hListView, 'GetSelected')
$iItemCount = ControlListView($hGui, '', $hListView, 'GetItemCount')
If $iFirstSelected + $iSelectCount < $iItemCount Then
ControlListView($hGui, '', $hListView, 'SelectClear')
ControlListView($hGui, '', $hListView, 'Select', $iFirstSelected + 1, $iFirstSelected + $iSelectCount)
EndIf
EndIf
EndSwitch
WEnd
Dann schau mal unter:
[autoit]Ceiling
[/autoit]Wie das? Dafür müsste ich die Gamepadtastendrücke auslesen, das weiß ich leider nicht wie das geht, würde mich über Hilfe freuen
Das ist gar nicht so schwer. Ich habe das mal für mein Musik-Quiz benutzt.
Dazu habe ich diese Vorlage verwendet:
;____________________________________________________________________
; Original program by Ejoc ;
; Improved by Adam1213 (autoit 3.2 compatiblity + improved labels ;
;____________________________________________________________________
#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit];_________________ SETUP_____________________________________
Local $joy,$coor,$h,$s,$msg
$joy = _JoyInit()
[/autoit] [autoit][/autoit] [autoit]dim $labels_text[8]=['X', 'Y', 'Z', 'R', 'U', 'V', 'POV', 'Buttons']
dim $labels_no=UBound($labels_text)
dim $labels[$labels_no]
dim $labels_value[$labels_no]
;__________ CONFIG ____________________________________________
;---------- Find the max length of the longest label --------------
$label_len=0
for $text in $labels_text
$len=stringlen($text)
if $len>$label_len then
$label_len=$len
endif
next
$label_len*=6
;_____________ GUI _______________________________________________
GUICreate('Joystick Test', 200, 200)
GUICtrlCreateLabel('Joystick', 40, 20, 100, 20)
for $i=0 to $labels_no-1
GuiCtrlCreatelabel($labels_text[$i]&':', 10, 60+$i*12, $label_len, 12)
$labels[$i]=GuiCtrlCreatelabel('', 10+$label_len, 60+$i*12, 70, 12)
$labels_value[$i]=''
next
GUISetState()
;_____________________________________________________________________
while 1
$coord=_GetJoy($joy,0)
for $i=0 to UBound($coord)-1
if $coord[$i]<>$labels_value[$i] then
GUICtrlSetData($labels[$i], $coord[$i])
$labels_value[$i]=$coord[$i]
endif
next
sleep(10)
$msg =GUIGetMSG()
if $msg = $GUI_EVENT_CLOSE Then Exitloop
WEnd
$lpJoy=0 ; Joyclose
[/autoit] [autoit][/autoit] [autoit];======================================
; _JoyInit()
;======================================
Func _JoyInit()
Local $joy
Global $JOYINFOEX_struct = "dword[13]"
$joy=DllStructCreate($JOYINFOEX_struct)
if @error Then Return 0
DllStructSetData($joy, 1, DllStructGetSize($joy), 1);dwSize = sizeof(struct)
DllStructSetData($joy, 1, 255, 2) ;dwFlags = GetAll
return $joy
EndFunc
;======================================
; _GetJoy($lpJoy,$iJoy)
; $lpJoy Return from _JoyInit()
; $iJoy Joystick # 0-15
; Return Array containing X-Pos, Y-Pos, Z-Pos, R-Pos, U-Pos, V-Pos,POV
; Buttons down
;
; *POV This is a digital game pad, not analog joystick
; 65535 = Not pressed
; 0 = U
; 4500 = UR
; 9000 = R
; Goes around clockwise increasing 4500 for each position
;======================================
Func _GetJoy($lpJoy,$iJoy)
Local $coor,$ret
Dim $coor[8]
DllCall("Winmm.dll","int","joyGetPosEx", _
"int",$iJoy, _
"ptr",DllStructGetPtr($lpJoy))
if Not @error Then
$coor[0] = DllStructGetData($lpJoy,1,3)
$coor[1] = DllStructGetData($lpJoy,1,4)
$coor[2] = DllStructGetData($lpJoy,1,5)
$coor[3] = DllStructGetData($lpJoy,1,6)
$coor[4] = DllStructGetData($lpJoy,1,7)
$coor[5] = DllStructGetData($lpJoy,1,8)
$coor[6] = DllStructGetData($lpJoy,1,11)
$coor[7] = DllStructGetData($lpJoy,1,9)
EndIf
return $coor
EndFunc
AdlibRegister und dann GUIDelete() oder GUISetState(@SW_HIDE).
Bugs:
- Der vertikale Teil der Schlange sieht etwas komisch aus:
- Die Zeitanzeige sollte ganze Sekunden anzeigen oder auf max. 3 Nachkommastellen gerundet sein.
- Eine Kollision mit dem Rand sollte zum beenden (verloren) führen.
Ansonsten aber ausbaufähig. ![]()
Vorschläge:
- Du könntest "Mauern" einfügen, die man nicht berühren darf.
- Gamepad-Unterstützung
Bei der Levenshtein-Distanz Lösung bekommst Du einen Prozentwert für die Ähnlichkeit. Du musst also einen Schwellenwert einsetzen oberhalb dessen er einen Treffer erkennen soll.
Das bedingt allerdings auch, dass es zu einem "false positive" kommen kann, wenn der Wert zu niedrig ist. Soll nicht abwertend gemeint sein (die DLL von Bernd670 ist klasse), nur als Hinweis.
Hier mal ein Beispiel, wie Du das Ganze viel kürzer machen kannst und wie man dann auch mehrere Checkboxen auswählen kann:
#include <GUIConstantsEx.au3>
Global $ahCheckbox[5]
Global $aNames[5] = ['Windows Media Player', 'Songbird', 'WinAmp', 'VLC', 'RealPlayer']
Global $aFunktions[5] = ['_WMP', '_SongBird', '_WinAmp', '_VLC', '_RealPlayer']
$hGui = GUICreate('Test', 600, 300)
For $i = 0 To 4
$ahCheckbox[$i] = GUICtrlCreateCheckbox($aNames[$i], 10, 10 + $i * 25, 200, 20)
Next
$hStart = GUICtrlCreateButton('Start', 10, 150, 100, 25)
GUISetState()
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $hStart
For $i = 0 To 4
If BitAND(GUICtrlRead($ahCheckbox[$i]), $GUI_CHECKED) Then Call($aFunktions[$i])
Next
EndSwitch
WEnd
Func _WMP()
ConsoleWrite('WMP-Playlist' & @CR)
EndFunc
Func _SongBird()
ConsoleWrite('Songbird-Playlist' & @CR)
EndFunc
Func _WinAmp()
ConsoleWrite('WinAmp-Playlist' & @CR)
EndFunc
Func _VLC()
ConsoleWrite('VLC-Playlist' & @CR)
EndFunc
Func _RealPlayer()
ConsoleWrite('RealPlayer-Playlist' & @CR)
EndFunc
Edit: und so, wenn die Checkboxen nebeneinander liegen sollen:
#include <GUIConstantsEx.au3>
Global $ahCheckbox[5]
Global $aNames[5] = ['Windows Media Player', 'Songbird', 'WinAmp', 'VLC', 'RealPlayer']
Global $aFunktions[5] = ['_WMP', '_SongBird', '_WinAmp', '_VLC', '_RealPlayer']
Global $aLeft[6] = [10, 160, 240, 320, 380, 600]
$hGui = GUICreate('Test', 600, 300)
For $i = 0 To 4
$ahCheckbox[$i] = GUICtrlCreateCheckbox($aNames[$i], $aLeft[$i], 10, $aLeft[$i + 1] - $aLeft[$i], 20)
Next
$hStart = GUICtrlCreateButton('Start', 10, 150, 100, 25)
GUISetState()
While True
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $hStart
For $i = 0 To 4
If BitAND(GUICtrlRead($ahCheckbox[$i]), $GUI_CHECKED) Then Call($aFunktions[$i])
Next
EndSwitch
WEnd
Func _WMP()
ConsoleWrite('WMP-Playlist' & @CR)
EndFunc ;==>_WMP
Func _SongBird()
ConsoleWrite('Songbird-Playlist' & @CR)
EndFunc ;==>_SongBird
Func _WinAmp()
ConsoleWrite('WinAmp-Playlist' & @CR)
EndFunc ;==>_WinAmp
Func _VLC()
ConsoleWrite('VLC-Playlist' & @CR)
EndFunc ;==>_VLC
Func _RealPlayer()
ConsoleWrite('RealPlayer-Playlist' & @CR)
EndFunc ;==>_RealPlayer