1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. bernd670

Beiträge von bernd670

  • Längste Collatz-Folge | Project Euler

    • bernd670
    • 13. Mai 2015 um 18:18

    Hier mal meine Lösung von 2010.

    AutoIt
    ;~ The following iterative sequence is defined for the set of positive integers:
    ;~
    ;~ n ? n/2 (n is even)
    ;~ n ? 3n + 1 (n is odd)
    ;~
    ;~ Using the rule above and starting with 13, we generate the following sequence:
    ;~                         13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
    ;~
    ;~ It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it
    ;~ has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.
    ;~
    ;~ Which starting number, under one million, produces the longest chain?
    ;~
    ;~ NOTE: Once the chain starts the terms are allowed to go above one million.
    
    
    $maxlength = 0
    $savedValue = 0
    
    
    
    
    For $i = 2 To 1000000
    	$length = 1
    	$value = $i
    	While $value > 1
    		;ConsoleWrite($value & " -> ")
    		If Mod($value,2) = 0 Then
    			$value /= 2
    			$length += 1
    		Else
    			$value = $value * 3 + 1
    			$length += 1
    		EndIf
    	WEnd
    	If $length > $maxlength Then
    		$maxlength = $length
    		$savedValue = $i
    	EndIf
    	;ConsoleWrite("1" & @CRLF)
    Next
    
    
    ConsoleWrite($savedValue & @CRLF)
    Alles anzeigen
  • Listview > Hilfe

    • bernd670
    • 12. Mai 2015 um 00:38

    Wirklich Hilfe möchte @baerchen scheinbar nicht, sonst würde ja mehr kommen als

    Zitat von baerchen

    Ist mir bewusst wie man es macht xD

    und

    Zitat von baerchen

    Bringt mir auch nicht viel xDD

    obwohl er ja Hilfe brauche könnte

    Zitat von baerchen

    Das ist meine Funktion fähige Lösung xDdie aber noch leicht ein fehler hat :*D


    Ich werde mal abwarten was noch so kommt!

    PS: Ich habe den Code in Post #6 mal neu formatiert!

  • Anzahl Teiler einer natürlichen Zahl ermitteln

    • bernd670
    • 10. Mai 2015 um 19:23

    Hallo,

    da sieht man mal wieder das man doch einrostet wenn etwas lange nicht macht! 8o

    Ich weiss nicht ob du die Seite kennst, aber da du ja scheinbar auch mathematik gerne magst solltest du die Seite mal anschauen
    https://projecteuler.net/about

  • Anzahl Teiler einer natürlichen Zahl ermitteln

    • bernd670
    • 10. Mai 2015 um 17:45

    Doch so einfach! :thumbup:

  • Anzahl Teiler einer natürlichen Zahl ermitteln

    • bernd670
    • 10. Mai 2015 um 17:14

    Hallo,

    Angenommen deine Funktion _GetNumbPrimeFact gibt ein Array mit 4 Primfaktoren zurück. Bei 4 Primfaktoren gibt es 2^4 - 1 = 15 Möglichkeiten.

    Wenn man sich jetzt mal die Zahlen von 1 - 15 binär anschaut fällt auf das jeder Wert einer Kombinationsmöglichkeit entspricht.
    A, B, C, D stehen für die Werte im Array A = $aiFact[0], B = $aiFact[1], C = $aiFact[2], D = $aiFact[3].

    Code
    D C B A
    01: 0 0 0 1  = A
    02: 0 0 1 0  = B
    03: 0 0 1 1  = A * B
    04: 0 1 0 0  = C
    05: 0 1 0 1  = A * C
    06: 0 1 1 0  = B * C
    07: 0 1 1 1  = A * B * C
    08: 1 0 0 0  = D
    09: 1 0 0 1  = A * D
    10: 1 0 1 0  = B * D
    11: 1 0 1 1  = A * B * D
    12: 1 1 0 0  = C * D 
    13: 1 1 0 1  = A * C * D
    14: 1 1 1 0  = B * C * D
    15: 1 1 1 1  = A * B * C * D
    Alles anzeigen

    In Zeile 13 in meiner Funktion schaue ich nur welche Bits bei $iSum gesetzt sind und berechne das Produkt der Werte.
    zum Beispiel bei $iSum = 13: A * C * D und addiere das Ergebnis zu $iSumGesamt.


    Ich hoffe das ist einigermaßen verständlich.

  • Anzahl Teiler einer natürlichen Zahl ermitteln

    • bernd670
    • 10. Mai 2015 um 15:55

    Hallo,

    ich habe auch noch eine Lösung gefunden!

    Die dürfte etwas schneller sein weil sie eine For-Schleife weniger hat und ohne Array- und String-Funktionen auskommt!

    AutoIt
    ; Diese Funktion macht mir Probleme und Kopfschmerzen...
    Func _GetComb(ByRef $aiFact)	; Anzahl der möglichen Teiler
    	local $iSumGesamt = 0
    	Local $iLoops
    
    
    	; Anzahl der Durchgänge berechnen ( = 2 ^ Ubound($aiFact) - 1)
    	$iLoops = BitShift(1, 0-Ubound($aiFact)) - 1
    
    
    	For $iSum = 1 To $iLoops
    		$izProdukt = 1
    		For $iFact = 0 To UBound($aiFact) - 1
    			; Berechnen des Zwichenprodukts, ist das Bit 0 gesetzt wird mit $aiFact[0] multipliziert, Bit 1 = $aiFact[1] usw.
    			If BitAND($iSum, BitShift(1, 0-$iFact)) Then $izProdukt *= $aiFact[$iFact] 
    		Next
    		$iSumGesamt += $izProdukt
    	Next
    
    
    	Return $iSumGesamt + 1
    EndFunc
    Alles anzeigen
  • Anzahl Teiler einer natürlichen Zahl ermitteln

    • bernd670
    • 10. Mai 2015 um 12:39

    Sind doch 24 oder?

  • Anzahl Teiler einer natürlichen Zahl ermitteln

    • bernd670
    • 10. Mai 2015 um 07:57

    Hallo,

    es gibt noch 3 Teiler, die hast du vergessen!

    Code
    2^1 * 3^2 = 18
    2^2 * 3^2 = 36
    2^3 * 3^2 = 72


    Für die Zahl 360 gibt es also 24 Teiler.

    Probiers mal so:

    AutoIt
    ; Diese Funktion macht mir Probleme und Kopfschmerzen...
    Func _GetComb(ByRef $aiFact)	; Anzahl der möglichen Teiler
    	Local $iSum1 = 0, $iSum2 = 0, $iSum3 = 0
    
    
    	If UBound($aiFact) > 2 Then $iSum3 = 1 ; $iSum3 nur berechen wenn es mehr als 2 Primfaktoren gibt
    
    
    	For $i = 0 To UBound($aiFact) - 1
    		$iSum1 += $aiFact[$i]
    		$iSumTemp = $aiFact[$i]
    		For $j = $i + 1 To UBound($aiFact) - 1
    			$iSum2 += $iSumTemp * $aiFact[$j]
    		Next
    		$iSum3 *= $aiFact[$i]
    	Next
    	ConsoleWrite($iSum1 & " " & $iSum2 & " " & $iSum3 & @CRLF)
    	Return $iSum1 + $iSum2 + $iSum3 + 1
    EndFunc
    Alles anzeigen


    Edit: Mir ist gerade aufgefallen das ab 4 Primfaktoren so auch nicht mehr funktioniert!

  • Eingabe per Tastaturbefehl - Monitor aus?

    • bernd670
    • 9. Mai 2015 um 11:57

    Hallo,

    ich habe dein Script mal etwas umgebaut, es wird jetzt geprüft ob evtl. schon eine oder sogar mehrere Instanzen vom Programm laufen. Sollten schon welche laufen werden diese beendet. Zusätzlich wird vom neu gestarteten Programm die PID und der Handle vom Windows gespeichert, dass erleichtert den Zugriff. Ein Logging hab ich auch eingebaut, dass kannst du abschalten wenn du die Variable $bLogging auf False setzt.

    Mir ist aufgefallen das beim IniRead für die Variable zaehler in der Anweisung ein "h" fehlt, ich wusste jetzt nur nicht ob es ein Schreibfehler im Script ist oder ob der Wert so in der INI-Datei steht.

    Damit das Programm richtig funktioniert muss immer ein Benutzer angemeldet sein und der Bildschirm darf nicht gesperrt sein. Der Grund dafür ist die Interaktion mit Programm über den Desktop. Also schauen das der Bildschirmschoner deaktiviert ist und das Powermanagement auf "volle Leistung" gestellt ist.

    AutoIt
    Opt("WinTitleMatchMode", 2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase
    
    
    Local $a = @ScriptDir
    If StringLen($a) <= 3 Then
    	$start_dir = StringLeft($a, 2)
    Else
    	$start_dir = @ScriptDir
    EndIf
    ;MsgBox (0, "Start Dir", $start_dir)
    
    
    Const $jahr = StringRight(@YEAR, 2) ; braucht man eigentlich hier nicht
    Const $programm_name = 'han_lager_neuberechnung'
    Const $ini_pfad = $start_dir & '\' & $programm_name & '.ini'
    ;MsgBox (0, "ini_pfad", $ini_pfad)
    
    
    ; -----------------------------------------
    ; Array für wu und wo
    ;    $aWuWo[<zaehler>][0] = Wu
    ;    $aWuWo[<zaehler>][1] = Wo
    ; -----------------------------------------
    Const $aWuWo[28][2] = [[27], _  ; Anzahl
    		["0101", "0199"], _ ; 1
    		["0201", "0299"], _ ; 2
    		["0301", "0699"], _ ; 3
    		["0701", "0899"], _ ; 4
    		["0901", "0999"], _ ; 5
    		["1001", "1099"], _ ; 6
    		["1101", "1499"], _ ; 7
    		["1501", "2199"], _ ; 8
    		["2201", "2299"], _ ; 9
    		["2301", "2599"], _ ; 10
    		["2601", "2999"], _ ; 11
    		["3001", "3199"], _ ; 12
    		["3201", "3599"], _ ; 13
    		["3601", "4099"], _ ; 14
    		["4101", "4299"], _ ; 15
    		["4301", "4399"], _ ; 16
    		["4401", "5099"], _ ; 17
    		["5101", "6999"], _ ; 18
    		["7001", "7199"], _ ; 19
    		["7201", "7499"], _ ; 20
    		["7501", "8099"], _ ; 21
    		["8101", "8399"], _ ; 22
    		["8401", "8499"], _ ; 23
    		["8501", "8799"], _ ; 24
    		["8801", "8999"], _ ; 25
    		["9001", "9199"], _ ; 26
    		["9201", "9999"] _  ; 27
    		]
    
    
    Local $pfad_dir = IniRead($ini_pfad, "10", "pfad_dir", "default")
    Local $pfad_programm = IniRead($ini_pfad, "10", "pfad_programm", "default")
    Local $pfad_temp = IniRead($ini_pfad, "10", "pfad_temp", "default")
    Local $warten = IniRead($ini_pfad, "10", "warten", "default")
    Local $sach = IniRead($ini_pfad, "10", "sach", "default")
    Local $zaehler = IniRead($ini_pfad, "10", "zaeler", "default"); eigentlich könnte man darauf verzichten aber so hat man die Möglichkeit nicht bei 1 zu beginnen.
    
    
    #Region ### neue Variablen
    Local $szLogFile = $pfad_temp & "\WAWIB_" & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & ".log"
    Local $bLogging = True ; Logging ein/aus
    Local $hWndWAWIB, $pidWAWIB
    #EndRegion ### neue Variablen
    
    
    If $bLogging Then FileWrite($szLogFile, "Programmstart: " & _GetDate() & " " & _GetTime() & @CRLF & @CRLF)
    
    
    ;MsgBox (0, "Ini Reads kontrollieren", $zaehler)
    
    
    FileDelete($pfad_dir & "\err*.log")
    
    
    Do
    	If $bLogging Then FileWrite($szLogFile, _GetTime() & "  Starte Lauf: " & $zaehler & @CRLF)
    
    
    	StartWAWIB()
    	EingabeWAWIB()
    	Sleep(500)
    Until $zaehler = 28
    
    
    If $bLogging Then FileWrite($szLogFile, @CRLF & "Programmende: " & _GetDate() & " " & _GetTime() & @CRLF)
    
    
    Func StartWAWIB()
    	Local $aWL
    
    
    	; Erst mal prüfen ob noch eine Instanz vom Programm läuft, wenn ja beenden
    	$aWL = WinList($pfad_programm)
    	For $iWL = 1 To $aWL[0][0]
    		If $bLogging Then FileWrite($szLogFile, _GetTime() & "  StartWAWIB(): Laufende Instanzen: " & $aWL[0][0] & @CRLF)
    		WinClose($aWL[$iWL][1]) ; erstmal mit WinClose probieren
    		WinWaitClose($aWL[$iWL][1], "", 5)
    		If WinExists($aWL[$iWL][1]) Then WinKill($aWL[$iWL][1]) ; wenn WinClose nicht funktioniert WinKill nehmen
    	Next
    
    
    	If FileExists($pfad_temp & "\$*.$$$") Then FileDelete($pfad_temp & "\$*.$$$")
    
    
    	EnvSet("SACHBEAR", $sach)
    	;EnvUpdate ( )
    	;local $k = EnvGet("SACHBEAR")
    	;MsgBox (0,"Sach", $k)
    
    
    	; Programm starten
    	$pidWAWIB = Run(@ComSpec) ; PID merken
    	ProcessWait($pidWAWIB)
    	; Handle ermitteln
    	$aWL = WinList()
    	For $iWL = 1 To $aWL[0][0]
    		If WinGetProcess($aWL[$iWL][1]) = $pidWAWIB Then
    			If (WinWaitActive($aWL[$iWL][1], "", 2)) Then
    				$hWndWAWIB = $aWL[$iWL][1]
    				WinSetTitle($hWndWAWIB, "", $pfad_programm)
    				WinSetOnTop($hWndWAWIB, "", 1)
    				ExitLoop
    			EndIf
    		EndIf
    	Next
    
    
    	If $bLogging Then FileWrite($szLogFile, _GetTime() & "  StartWAWIB(): Programm gestartet (Titel = " & WinGetTitle($hWndWAWIB) & ", PID = 0x" & Hex($pidWAWIB) & ", HWnd = 0x" & Hex($hWndWAWIB) & ")" & @CRLF)
    
    
    	;Sleep (100)
    	;Send("{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}")
    	Sleep(200)
    	ControlSend($hWndWAWIB, "", "", "{ENTER}") ; für bestätigen sachbearbeiter
    	Sleep(500)
    	ControlSend($hWndWAWIB, "", "", "asdfg123") ; bei eingabe maximaler datenlänge entfällt das enter pasw = maximal
    	Sleep(4000) ; hier längere Pause, der Handel läd einstellungen
    	If WinExists($hWndWAWIB, "") Then ; prüfen ob Wawi geladen, durch fensterabfrage, dann fenster in den vordergrund holen.
    		WinSetOnTop($hWndWAWIB, "", 1)
    	Else
    		If $bLogging Then FileWrite($szLogFile, _GetTime() & "  StartWAWIB(): Fehler nach laden der Einstellungen!" & @CRLF)
    		Return
    	EndIf
    	ControlSend($hWndWAWIB, "", "", "g") ; wechseln zur Eingabeseite für Neuberechnung
    	Sleep(500)
    	ControlSend($hWndWAWIB, "", "", "g")
    	Sleep(500)
    	; MsgBox (0,"Fenstername", WinGetTitle($hWndWAWIB))
    EndFunc   ;==>StartWAWIB
    
    
    
    
    Func EingabeWAWIB()
    	If WinExists($hWndWAWIB) Then ; prüfen ob Wawi geladen, durch fensterabfrage, dann fenster in den vordergrund holen.
    		WinSetOnTop($hWndWAWIB, "", 1)
    	Else
    		If $bLogging Then FileWrite($szLogFile, _GetTime() & "  EingabeWABWIB(): Eingabe nicht möglich Programm existiert nicht mehr!" & @CRLF)
    		Return
    	EndIf
    	ControlSend($hWndWAWIB, "", "", "{ENTER}")
    	Sleep(500)
    	ControlSend($hWndWAWIB, "", "", "{ENTER}")
    	Sleep(500)
    	ControlSend($hWndWAWIB, "", "", $aWuWo[$zaehler][0]) ; wu
    	Sleep(500)
    	ControlSend($hWndWAWIB, "", "", $aWuWo[$zaehler][1]) ; wo
    	Sleep(500)
    	;MsgBox (0,"Fenstername", WinGetTitle($hWndWAWIB))
    	ControlSend($hWndWAWIB, "", "", "{F9}")
    
    
    	If $bLogging Then FileWrite($szLogFile, _GetTime() & "  Vorgang gestartet!" & @CRLF)
    
    
    	For $i1 = 1 To $warten ; warten kommt aus der ini
    		Sleep(10000) ;hier warten bis der Handel seine Arbeit erledigt hat
    		If Not FileExists($pfad_temp & "\$*.$$$") Or Not WinExists($hWndWAWIB) Then
    			FileDelete($pfad_temp & "\$*.$$$")
    			If $bLogging Then FileWrite($szLogFile, _GetTime() & "  EingabeWABWIB(): Vorgang wird vorzeitig beendet!" & @CRLF)
    			ExitLoop
    		EndIf
    	Next
    
    
    	If $bLogging Then FileWrite($szLogFile, _GetTime() & "  Vorgang beendet!" & @CRLF)
    
    
    	If WinExists($hWndWAWIB) Then
    		$zaehler = $zaehler + 1
    		WinSetOnTop($hWndWAWIB, "", 1)
    	Else
    		If $bLogging Then FileWrite($szLogFile, _GetTime() & "  EingabeWABWIB(): zähler wurde nicht erhöht!" & @CRLF)
    		Return
    	EndIf
    
    
    	Sleep(800)
    	ControlSend($hWndWAWIB, "", "", "{ESC}")
    	Sleep(800)
    	ControlSend($hWndWAWIB, "", "", "{ESC}")
    	Sleep(800)
    	ControlSend($hWndWAWIB, "", "", "j")
    	Sleep(500)
    
    
    	;MsgBox (0,"Wawi zu ?", "Wawi ist zu?")
    
    
    EndFunc   ;==>EingabeWAWIB
    
    
    Func _GetDate()
    	Return @MDAY & "." & @MON & "." & @YEAR
    EndFunc   ;==>_GetDate
    
    
    Func _GetTime()
    	Return @HOUR & ":" & @MIN & ":" & @SEC
    EndFunc   ;==>_GetTime
    Alles anzeigen

    Ich kann das Script leider nicht im vollen Umfang testen, ich hoffe ich habe nicht vergessen. Für Schäden übernehme ich keine Haftung!

  • Listview > Hilfe

    • bernd670
    • 8. Mai 2015 um 14:59

    Hallo,

    hier mal ein Beispiel wie man es machen kann!

    Spoiler anzeigen
    AutoIt
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiStatusBar.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    
    
    Opt("GUIOnEventMode", 1)
    
    
    Local $szIniFile = "c:\Windows\System32\tcpmon.ini"
    
    
    Local $arSBPartsSize[3] = [200, 400, -1]
    Local $arSBPartsText[3] = ["", "", ""]
    
    
    #Region ### GUI section ###
    $FrmTest = GUICreate("Test", 1024, 768, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "FrmPCClose")
    GUISetOnEvent($GUI_EVENT_MINIMIZE, "FrmPCMinimize")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "FrmPCMaximize")
    GUISetOnEvent($GUI_EVENT_RESTORE, "FrmPCRestore")
    $LV1 = GUICtrlCreateListView("Key|Value", 16, 32, 992, 600, BitAND($GUI_SS_DEFAULT_LISTVIEW, BitNOT($LVS_SINGLESEL)), BitOR($WS_EX_CLIENTEDGE, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    _GUICtrlListView_EnableGroupView($LV1)
    GUICtrlSendMsg($LV1, $LVM_SETCOLUMNWIDTH, 0, 300)
    GUICtrlSendMsg($LV1, $LVM_SETCOLUMNWIDTH, 1, 600)
    $SBPC = _GUICtrlStatusBar_Create($FrmTest, $arSBPartsSize, $arSBPartsText)
    GUISetState(@SW_SHOW)
    #EndRegion ### GUI section ###
    
    
    
    
    #Region ### INI section ###
    $aIRSN = IniReadSectionNames($szIniFile)
    
    
    $iLVItemID = 0
    
    
    For $iaIRSN = 1 To $aIRSN[0]
    	_GUICtrlStatusBar_SetText($SBPC, "Sektionen: " & $iaIRSN, 0)
    	_GUICtrlListView_InsertGroup($LV1, -1, $iaIRSN - 1, $aIRSN[$iaIRSN], 0)
    	$aIRS = IniReadSection($szIniFile, $aIRSN[$iaIRSN])
    	For $iaIRS = 1 To $aIRS[0][0]
    		_GUICtrlListView_AddItem($LV1, $aIRS[$iaIRS][0])
    		_GUICtrlListView_AddSubItem($LV1, $iLVItemID, $aIRS[$iaIRS][1], 1)
    		_GUICtrlListView_SetItemGroupID($LV1, $iLVItemID, $iaIRSN - 1)
    		$iLVItemID += 1
    		_GUICtrlStatusBar_SetText($SBPC, "Elemente: " & $iLVItemID, 1)
    	Next
    Next
    #EndRegion ### INI section ###
    
    
    
    
    While 1
    	Sleep(100)
    WEnd
    
    
    Func FrmPCClose()
    	GUIDelete($FrmTest)
    
    
    	Exit
    EndFunc   ;==>FrmPCClose
    
    
    
    
    Func FrmPCMaximize()
    	_GUICtrlStatusBar_Resize($SBPC)
    EndFunc   ;==>FrmPCMaximize
    
    
    
    
    Func FrmPCMinimize()
    	_GUICtrlStatusBar_Resize($SBPC)
    EndFunc   ;==>FrmPCMinimize
    
    
    
    
    Func FrmPCRestore()
    	_GUICtrlStatusBar_Resize($SBPC)
    EndFunc   ;==>FrmPCRestore
    Alles anzeigen
  • Verbindung zum Oracle Server

    • bernd670
    • 7. Mai 2015 um 18:52

    Wenn man nichts installieren kann, hat das ja bestimmt seinen Grund! ?(

  • $CmdLine Fehler

    • bernd670
    • 7. Mai 2015 um 16:17

    Hallo,

    vielleicht wird's ja einfacher wenn du StringFormat nimmst!

    [autoit]

    MsgBox(0,"", StringFormat('"%s" "%s" %s" "%s"', $Parameter[1][1], $Parameter[1][2], $Parameter[1][3], $Parameter[1][4]))

    [/autoit]
  • DllCall dhcpsapi.dll

    • bernd670
    • 7. Mai 2015 um 14:02

    Hallo,

    wenn man mit der DHCPSAPI.DLL arbeitet muss man, als erste Funktion immer DhcpDsInit aufrufen damit der Speicher vorbereitet wird und als letzte Funktion immer DhcpDsCleanup aufrufen damit der Speicher wieder aufgeräumt wird.

    Das folgende Script ist getestet und funktioniert!

    AutoIt
    #include <Array.au3>
    
    
    $tagString = "struct;WCHAR Text[1024];endstruct"
    $tagDHCPDS_SERVER = "struct;DWORD Version;PTR ServerName;DWORD ServerAddress;DWORD Flags;DWORD State;PTR DsLocation;DWORD DsLocType;endstruct"
    $tagDHCPDS_SERVERS = "struct;DWORD Flags;DWORD NumElements;PTR Servers;endstruct"
    
    
    Local $bInitOk = False
    Local $aDHCPServer[1][2] = [[0]]
    
    
    $hDHCPAPI = DllOpen("DHCPSAPI.DLL")
    
    
    DllCall($hDHCPAPI, "DWORD", "DhcpDsInit") ; https://msdn.microsoft.com/en-us/library/windows/desktop/aa813372(v=vs.85).aspx
    $bInitOk = Not @error
    
    
    If Not $bInitOk Then Exit
    
    
    $aDLLRetVal = DllCall($hDHCPAPI, "DWORD", "DhcpEnumServers", "DWORD", 0, "PTR", Null, "PTR*", Null, "PTR", Null, "PTR", Null)
    
    
    If IsArray($aDLLRetVal) Then
    	$tDHCPDS_SERVERS = DllStructCreate($tagDHCPDS_SERVERS, $aDLLRetVal[3])
    	$aDHCPServer[0][0] = DllStructGetData($tDHCPDS_SERVERS, "NumElements")
    
    
    	; Array für DHCPDS_SERVER struct aufbauen
    	$atagDHCPDS_SERVER = ""
    	For $i = 1 To $aDHCPServer[0][0]
    		$atagDHCPDS_SERVER &= StringRegExpReplace($tagDHCPDS_SERVER, "\s+(.*?);", " $1_" & $i & ";") & ";"
    	Next
    
    
    	$atDHCPDS_SERVER = DllStructCreate($atagDHCPDS_SERVER, DllStructGetData($tDHCPDS_SERVERS, "Servers"))
    
    
    	; Namen und IP in $aDHCPServer aufnehmen
    	For $i = 1 To $aDHCPServer[0][0]
    		$tString = DllStructCreate($tagString, DllStructGetData($atDHCPDS_SERVER, "ServerName_" & $i))
    		_ArrayAdd($aDHCPServer, DllStructGetData($tString, "Text") & "|" & _dw2ip(DllStructGetData($atDHCPDS_SERVER, "ServerAddress_" & $i)))
    	Next
    EndIf
    
    
    _ArrayDisplay($aDHCPServer)
    
    
    DllCall($hDHCPAPI, "NONE", "DhcpDsCleanup") ; https://msdn.microsoft.com/en-us/library/windows/desktop/aa813371(v=vs.85).aspx
    DllClose($hDHCPAPI)
    
    
    Func _dw2ip($dwAddr)
    	$dwAddr = Hex($dwAddr, 8)
    	Return Int("0x" & StringMid($dwAddr, 1, 2)) & "." & Int("0x" & StringMid($dwAddr, 3, 2)) & "." & Int("0x" & StringMid($dwAddr, 5, 2)) & "." & Int("0x" & StringMid($dwAddr, 7, 2))
    EndFunc   ;==>_dw2ip
    Alles anzeigen
  • Powershell auslesen

    • bernd670
    • 5. Mai 2015 um 10:14

    Hallo,

    das sollte mit dem Paramter -File <Dateipfad> <Argumente> funktionieren!

    AutoIt
    Run(@SystemDir & "\WindowsPowerShell\v1.0\powershell.exe -NoLogo -File " & @ScriptDir & "\script1.ps1 " & "58444" & " 1431047" & " Password", @SystemDir, @SW_SHOW)
  • Bilder trapezförmig skalieren und mit Text versehen

    • bernd670
    • 2. Mai 2015 um 08:12

    Hallo,

    für das automatische einfügen von Zeilenumbrüchen hatte mal eine Funktion geschriebe, vielleicht kannst damit ja was anfangen!

    AutoIt
    ;===============================================================================
    ; Name:             _StringWrap
    ; Description:      Fügt Zeilenumbrüche in Strings ein
    ; Parameter(s):     $strString  = String der bearbeitet werden soll
    ;                   $nCount     = Anzahl der Zeichen bevor der Umbruch
    ;                                 eingefügt werden soll
    ;                   (optional)
    ;                   $cWrap      = Zeichen das/die als Umbruch eingefügt werden
    ;                                 sollen (default = @CRLF)
    ;                   $cBreaking  = 0 (default) -> Softbreak (an Wortgrenze)
    ;                                 1           -> Hardbreak
    ; Note(s):          Ist kein Leerzeichen im String enthalten wird hart umgebrochen
    ; Requirement(s):   keine
    ; Return Value(s):  String mit umbrüchen
    ; Author(s):        bernd670
    ;
    ;===============================================================================
    Func _StringWrap($strString, $nCount, $cWrap = Default, $cBreaking = Default)
    
    
    	Local $strRetString = "", $nPos
    
    
    	If $cWrap = Default Then $cWrap = @CRLF
    	If $cBreaking = Default Then $cBreaking = 0
    
    
    	Do
    		If StringLen($strString) > $nCount Then
    			$nPos = StringInStr(StringLeft($strString, $nCount + 1), " ", 0, -1)
    			If ($nPos And $cBreaking = 0) Then
    				$strRetString &= StringLeft($strString, $nPos - 1) & $cWrap
    				$strString = StringMid($strString, $nPos + 1)
    			Else
    				$strRetString &= StringLeft($strString, $nCount) & $cWrap
    				$strString = StringMid($strString, $nCount + 1)
    			EndIf
    		EndIf
    	Until StringLen($strString) < $nCount
    
    
    	$strRetString &= $strString
    
    
    	Return $strRetString
    EndFunc   ;==>_StringWrap
    Alles anzeigen
  • Powershell auslesen

    • bernd670
    • 30. April 2015 um 17:27

    Hallo,

    das geht mit StdinWrite und dem Parameter $STDIN_CHILD.
    Damit Powershell die Befehl von der Standardeingabe liest muss Powershell mit -Command - aufgerufen werden. Wichtig ist das Minus hinter -Command!!!

    AutoIt
    #include <Constants.au3>
    
    
    $PID = Run(@SystemDir & "\WindowsPowerShell\v1.0\powershell.exe -NoLogo -Command -", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
    
    
    StdinWrite($PID, "$HostSettings = (Get-Host).UI.RawUI" & @CRLF)
    StdinWrite($PID, "$HostSettings_Buffersize = $HostSettings.BufferSize" & @CRLF)
    StdinWrite($PID, "$HostSettings_Buffersize.Width = 1200" & @CRLF)
    StdinWrite($PID, "$HostSettings_Buffersize.Height = 1000" & @CRLF)
    StdinWrite($PID, "$HostSettings.BufferSize = $HostSettings_Buffersize" & @CRLF)
    
    
    
    
    StdinWrite($PID, "Get-WmiObject win32_service | Format-Table -AutoSize" & @CRLF)
    StdinWrite($PID, "exit" & @CRLF)
    
    
    $szOut = ""
    While 1
    	$szOut &= StdoutRead($PID)
    	if @error Then ExitLoop
    
    
    	sleep(100)
    WEnd
    
    
    ConsoleWrite($szOut & @CRLF)
    Alles anzeigen
  • Bekomme _FFWindowOpen nicht zum laufen ( FF.au3)

    • bernd670
    • 28. April 2015 um 22:44

    Hallo,

    wie @alpines schon bemerkt hat fehlt da einfach nur ein Backslash in der Zeile 4330 (aktuelle UDF)!

    AutoIt
    Local $sHKLM = 'HKEY_LOCAL_MACHINE\SOFTWARE\'
    	If @OSArch <> 'X86' Then $sHKLM &= 'Wow6432Node\'
    	$sHKLM &= 'Mozilla\Mozilla Firefox'
    	Local $sFFExe = RegRead($sHKLM & "\" & RegRead($sHKLM, "CurrentVersion") & "\Main", "PathToExe")
    	If @error Then
    		SetError(__FFError($sFuncName, $_FF_ERROR_GeneralError, "Error reading registry entry for FireFox." & @CRLF & _
    				$sHKLM & "\*CurrentVersion*\Main\PathToExe" & @CRLF & _
    				"Error from RegRead: " & @error))
    		Return 0
    	EndIf
  • Werte aus ini File in Combobox

    • bernd670
    • 26. April 2015 um 23:13

    Hallo,

    das geht mit IniReadSectionNames und IniRead!

    AutoIt
    #include <GUIConstants.au3>
    #include <GuiComboBox.au3>
    #include <Array.au3>
    
    
    $inifile = @ScriptDir & "\00031.ini"
    $bExit = False
    
    
    Opt("GUIOnEventMode", 1)
    
    
    GUICreate("",400,500)
    $hCombo = GUICtrlCreateCombo("", 16, 16)
    GUISetOnEvent($GUI_EVENT_CLOSE, "ByeBye")
    GuiSetState()
    
    
    $aSections = IniReadSectionNames($inifile)
    
    
    For $i = 1 To $aSections[0]
    	$szName = IniRead($inifile, $aSections[$i], "name", "")
    	if ($szName <> "") Then _GUICtrlComboBox_InsertString($hCombo, $szName)
    Next
    
    
    _GUICtrlComboBox_SetCurSel($hCombo, 0)
    
    
    
    
    While 1
    	if $bExit Then ExitLoop
       Sleep(100)
    WEnd
    
    
    Func ByeBye()
        $bExit = True
    EndFunc
    Alles anzeigen
  • GUICtrlMenuItem() Index im Menü finden

    • bernd670
    • 26. April 2015 um 16:39

    Hallo,

    so könnte man es auch lösen!

    Den Text vom Menüitem temporär umbennen -> suchen -> und orginal Text wieder zurückschreiben!!

    AutoIt
    func MenuItemByHandle($hMenu, $hMenuItem)
    	Local $iRetVal, $szItemText = GUICtrlRead($hMenuItem, 1)
    
    
    	if not IsHWnd($hMenu) then $hMenu = GUICtrlGetHandle($hMenu)
    
    
    	GUICtrlSetData($hMenuItem, "@@!!search!!@@")
    	$iRetVal = _GUICtrlMenu_FindItem($hMenu, "@@!!search!!@@")
    	GUICtrlSetData($hMenuItem, $szItemText)
    
    
    	return $iRetVal
    EndFunc
    Alles anzeigen
  • GUICtrlMenuItem() Index im Menü finden

    • bernd670
    • 25. April 2015 um 23:58

    Hallo,

    probiers mal damit,

    [autoit]

    _GUICtrlMenu_FindItem(GUICtrlGetHandle($hMenu), StringReplace(GUICtrlRead($hMenuItem2,1),"&", ""))

    [/autoit]

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™