also doch lieber mit Booleans.
Mir ging es ausschliesslich um die Fenstererkennung. PixelSearch sollte nun wirklich niemand ernsthaft verwenden wollen.
also doch lieber mit Booleans.
Mir ging es ausschliesslich um die Fenstererkennung. PixelSearch sollte nun wirklich niemand ernsthaft verwenden wollen.
Das Fenster kannst du doch über seinen Namen identifizieren.
- Dauerschleife zur Überwachung (kleines Sleep nicht vergessen)
- abfragen If WinActive(Fenstertitel) Then _Mucke_aus_
Fenstertitel kannst du auch als Teil des Namens verwenden mit Opt('WinTitleMatchMode', 2)
autoBert: Probiere mal, ob dir Getaktete Verbindung weiter hilft.
EDIT: Auf diese Weise hast du dann auch automatisch das dreisterweise aktivierte WUDO abgestellt, welches dich ungefragt zum PeerToPeer-Verteiler von WinUpdates macht. ![]()
aber bis du die ganze IP-Range durchgescannt hast dauert das Ewigkeiten
Naja, man kann es schon reduzieren. Unter der Annahme, dass ich mich in einem lokalen Netzwerk befinde, dass ordentlich verkabelt ist, kann ich die Anforderungen an Ping senken (Anzahl Pakete, Paketgröße, Wartezeit, TTL). Mit einem derart angepaßten Ping dauert ein kpl. Scan von 254 IP-Adressen etwa 3 min. Das ist immerhin schon Welten besser als ein nativer Ping.
Dieses Bsp. spuckt die lebenden IPs als Array aus:
$aResult = _Scan_IPRange('192.168.178.1')
_ArrayDisplay($aResult)
Func _Scan_IPRange($_sIPFullStart, $_sLastByteEnd='254', $iMaxWait=100)
Local $sBase, $sLastByteStart, $sResult, $iDotLast = StringInStr($_sIPFullStart, '.', 0, -1)
$sBase = StringLeft($_sIPFullstart, $iDotLast)
$sLastByteStart = StringTrimLeft($_sIPFullStart, $iDotLast)
Local $aPID[Int($_sLastByteEnd)+1 - Int($sLastByteStart)], $iPing = Int($sLastByteStart), $sCmd
For $i = 0 To UBound($aPID) -1
$sCmd = StringFormat("%s /c ping -n 1 -l 4 -i %i -w %i -4 %s%s", @ComSpec, $iMaxWait, $iMaxWait, $sBase, $iPing)
$aPID[$i] = Run($sCmd, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
$iPing += 1
Next
$iPing = Int($sLastByteStart)
For $i = 0 To UBound($aPID) -1
ProcessWaitClose($aPID[$i])
If StringRegExp(StdoutRead($aPID[$i]), 'Empfangen = 1') Then $sResult &= $sBase & $iPing & '|'
$iPing += 1
Next
Return StringSplit(StringTrimRight($sResult, 1), '|', 2)
EndFunc
Alles anzeigen
@autoBert
Windowsupdates kann man doch ausstellen, bzw. auf manuell stellen
Wie ich autoBert verstanden habe, hat er Windows 10. Meines Wissens hat M$ dort einen Zwangsupdatemodus eingebaut. Für mich ein ganz entscheidener Grund dieses System nicht zu verwenden.
Ja das geht in beide Richtungen. Habe es zwar noch nie so genutzt, aber zumindest sagt das die Beschreibung des SciTE Director Interface.
jetzt habe ich wohl keine Ausrede mehr das Projekt aufzuschieben.
![]()
Ich denke es ist sinnvoll, dass du deine Versionsverwaltung auf bestimmte Dateitypen begrenzt. Die Abfrage kannst du natürlich in deinem Skript machen, aber einfacher geht das direkt im Lua-Skript und über Properties regelst du, welche Typen berücksichtigt werden.
Würde dann so aussehen (den Namen der Property kannst du natürlich frei wählen):
CallRewriteDataBase = EventClass:new(Common)
function CallRewriteDataBase:OnClose(_filename)
local sFiletypes = (props['version.management.filetypes']):lower() -- Eintrag in "SciTEUser.properties": version.management.filetypes=au3|lua|cpp
local sExt = (props['FileExt']):lower() -- Erweiterung der aktuellen Datei
local iMatch = sFiletypes:find(sExt)
if not iMatch then return end
os.execute('"Lw:\\DER\\PFAD\\zur-Datei.exe" '.._filename)
end
Da würde ich auf ein fertiges Tool zurückgreifen, z.B. Advanced IP Scanner. Der ist flink, free und deckt einen Großteil deiner Wünsche ab.
Ist es möglich mit Hilfe eines LUA-Skriptes beim Schliessen eines Skriptfiles in Scite ein Event abzufeuern, welches dann mein Programm veranlasst das Skript wieder in die DB zurück zu speichern?
Ja, das ist möglich.
SciTE feuert folgende Events:
Currently, OnOpen, OnClose, OnSwitchFile, OnSave, OnBeforeSave, OnChar, OnKey, OnSavePointReached, OnSavePointLeft, OnDwellStart, OnDoubleClick, OnMarginClick, OnUpdateUI, and OnUserListSelection are supported.
SciTE beinhaltet das "SciTE Director Interface" (s. <Hilfe zu SciTE> <SciTE4AutoIt3> <SciTE Documentation> <letzte-Zeile-Link: SciTE Director Interface>).
Ich hatte bereits das SciTE Interface als AutoIt-UDF verfügbar gemacht. Wenn du mehr auf der Lua-Ebene machen möchtest ist das ganz nützlich.
Um auf das Event zu reagieren brauchst du nur ein Miniskript:
CallRewriteDataBase = EventClass:new(Common)
function CallRewriteDataBase:OnClose(_filename)
-- print('CLOSED',_filename) -- debug
os.execute('"Lw:\\DER\\PFAD\\zur-Datei.exe" '.._filename)
end
Speichere das als eine Lua-Datei und lade diese Datei im SciTEStartup.lua an letzter Position. Wichtig bei den Pfaden: Immer doppelten Backslash.
Wie du siehst, ruft das Luaskript nach dem Schließen einer Datei eine von dir hinterlegte exe auf und übergibt als Parameter den Dateinamen. Das kannst du dann entsprechend weiter verarbeiten.
(Eine kleine Versionsverwaltung hatte ich ja bereits mal mit Lua erstellt.)
Wenn noch Fragen sind - melde dich.
EDIT: Da die geschlossene Datei im Pfad ja auch Leerzeichen enthalten kann ist es besser, den Pfad auch nochmal einzufassen:
os.execute('"Lw:\\DER\\PFAD\\zur-Datei.exe" "'.._filename..'"')
PS: Habe ich es Dir zu verdanken, dass mein "Status" von "Fortgeschrittener" auf "Anfänger" unter dem Avatar zurückgestuft wurde?
Wie kommst du dadrauf? Übersteigt meine Möglichkeiten.
Du weißt nicht, woher ich die Fensterhandle als Liste habe, was ich damit tun möchte und warum das mein einziger Weg ist.
Das ist einer der Hauptgründe, warum hier soviel daneben geht: Fehlende Infos beim Fragestellen. Das Bsp., das du eingestellt hast, gibt darüber keine Auskunft und benötigt die Funktion HWnd daher definitiv nicht. Woher sollen wir riechen, wie du zu deinen Infos kommst.
Also bevor du hier die beleidigte Leberwurst spielst, wirf mal selbstkritisch einen Blick auf deine Angaben. Dass wir dann irgendwann auch mal genug haben und dann auch die Netiquette flöten geht verwundert nicht.
Wenn du Zeit hast, lies mal quer durch diverse Threads - du wirst sehen, dass es i.A. hier harmonisch zugeht.
ich weiß zwar immer noch nicht, wieso es bei den anderen auch ohne HWnd klappt - aber egal.
Weil man den Rückgabewert von WinActivate verwendet - das ist Datentyp Handle!
Niemand ist so bekloppt und versucht eine Hexzahl als Handle zu übergeben - denn das ist nun mal nur Datentyp Hexzahl.
Aus Hex mach Handle mit Funktion HWnd. Das hat nichts mit meisterlich zu tun, sondern mit Hilfe lesen und umsetzen.
Thats my 2 cents.
Warum dann nicht auch ein Script, was die Fragestellung aus Post 1 löst.
Wenn du möchtest, schreib es dir. Dafür siehst aber nur du einen Bedarf.
Die Fragestellung ergibt sich nämlich aus den bereits mehrfach geschilderten Gründen im Normalfall nicht. Ausnahme: Du verwendest eine UDF, die den Namen nicht verdient und bis über beide Ohren verbugt ist.
Kopiere doch den Inhalt der Dateien mit in dein Skript, statt zu includen. Nicht schick, aber dann hast du eine direkte Zuordnung beim Debug.
Warum ist es bloß so schwer, zielführende Antworten zu erhalten?
Warum ist es so schwer, Fragen zu stellen, die die tatsächlichen Gegebenheiten berücksichtigen statt eines Wunschdenkens?
Auch nicht bös gemeint. Aber du verweigerst dich permanent unseren Antworten, wie ein Kind, das sagt: Ich will, ich will, ich will.
Wundert es Euch nicht, dass die Zeilennummer richtig über die Funktion in die Console geschrieben wird (Zeilennummer der Funktion in der UDF), der Dateiname jedoch nicht stimmt?
DER DATEINAME STIMMT! Wie oft denn noch: Es gibt nur EINE Datei: das startende Skript. Andere Dateien, die per #Include eingebunden sind, sind zur Laufzeit des Skriptes ein Bestandteil davon, so als ob man deren Inhalt einfach in dein Skript einfügt.
ein Bild vollflächig anzeigen
GUISetState(@SW_MAXIMIZE)
Wenn du es im Style $WS_POPUP erstellst, sind dann auch keine Schaltflächen zum Schließen vorhanden.
Über die Fensterverwaltung (Win+Tab) kann man das aber übergehen. Jemanden dazu zu zwingen, unbedingt auf diesem Fenster einen Button zu klicken ist etwas umfangreicher. Da mußt du neben der Fensterverwaltung auch noch den Taskmanager sperren. Nichts, was ich dir bei deinem AutoIt-Wissensstand empfehlen würde.
noch was vergessen?
In Texten können auch vorkommen: : < > | # * + - / \ ´` ' " ^ ° usw., müßig alle Zeichen aufzuführen zu wollen.
Du solltest eher definieren, was genau NICHT enthalten sein darf. Sollte einfacher zu definieren sein. Lesbarer Text darf schließlich jedes beliebige druckbare Zeichen enthalten, somit würde sich das reduzieren auf Steuerzeichen - und die sind in der Regel in Textdaten eh nicht enthalten.
So schnell gebe ich StringFormat nicht auf:
Generiere doch Teilstrings:
$sFields_1 = StringFormat("%s,%s,......", $Field_1 ... $Field_32)
$sFields_2 = StringFormat("%s,%s,......", $Field_33 ... $Field_64)
$sFields_3 = StringFormat("%s,%s,......", $Field_65 ... $Field_71)
$sFields = StringFormat("%s,%s,%s", $sFields_1, $sFields_2, $sFields_3)
Analog mit $sValue vorgehen.
[Verschoben]
In Marokko kannst du genauso wie hier die BL live verfolgen. (wie übrigens in über 200 Ländern, die ständig Streams zur BL anbieten)
Mit ein bischen Google findest du auch die Angebotsseiten. Da sich das zwischen Grauzone und illegal bewegt, gibt es aber keine näheren Hinweise.
Wenn man mit mehreren eigenen UDFs arbeitet, wie soll man zuordnen, aus welcher Programmzeile und welcher au3 die Debug-Info stammt?
Indem man diese Info in die Debugzeile mit einfügt?! ConsoleWrite('Dateiname ' & 'was-du-willst' & @LF)
Nebenziel - warum wird die Zeilennummer richtig angezeigt, aber der Dateiname nicht?
Weil es für Zeilennummer ein Makro gibt. Das Makro @Scriptname gibt den Namen deines Skriptes wieder. Evtl. eingebundene andere Skripte sind während der Laufzeit in dieses eingebunden. Es gibt also nur 1 Datei und deren Name gibt @Scriptname wieder.
Habe es gerade gebraucht, vielleicht auch für euch nützlich. Z.B. beim Download mit InetGet zum Formatieren der übermittelten Anzahl gelesener Bytes.
Local Const $1TB = 0x10000000000
Local Const $1GB = 0x40000000
Local Const $1MB = 0x100000
Local Const $1KB = 0x400
Local $iByte = 2*$1TB + 355*$1GB + 1019*$1MB + 468*$1KB + 13
ConsoleWrite(_FormatByte($iByte) & @CRLF)
Local $tRet = _FormatByte($iByte, '', True)
ConsoleWrite( $iByte & ' Byte: ' & @LF & _
$tRet.TB & ' TB' & @LF & _
$tRet.GB & ' GB' & @LF & _
$tRet.MB & ' MB' & @LF & _
$tRet.KB & ' KB' & @LF & _
$tRet.Byte & ' Byte' & @LF)
; #FUNCTION# ====================================================================================================================
; Name ..........: _FormatByte
; Description ...: Formats a given value of bytes with highest or given unit, optional as structure with all units
; Parameters ....: $_iByte The value of bytes to format
; ...............: $_sUnit (Default = '', unit of highest value) or count of given unit (TB, GB, MB, KB, Byte)
; ...............: $_fStruct Returns a structure with .TB .GB .MB .KB .Byte (Default = False)
; Return values .: The formatted string or the structure.
; Author ........: BugFix
; ===============================================================================================================================
Func _FormatByte($_iByte, $_sUnit='', $_fStruct=False)
Local Static $aByte[5][2] = [[0x10000000000],[0x40000000],[0x100000],[0x400],[0x1]]
Local Static $tBytes = DllStructCreate('int TB;int GB;int MB;int KB;int Byte;')
Local Static $aUnit[5] = ['TB','GB','MB','KB','Byte']
Local $iModulo = $_iByte, $iHighest = 4
For $i = 0 To 3
$aByte[$i][1] = $iModulo >= $aByte[$i][0] ? Floor($iModulo/$aByte[$i][0]) : 0
$iModulo = $aByte[$i][1] > 0 ? Mod($iModulo,$aByte[$i][0]) : $iModulo
$iHighest = $aByte[$i][1] > 0 ? ($i < $iHighest ? $i : $iHighest) : $iHighest
Next
$aByte[4][1] = $iModulo
$tBytes.TB = $aByte[0][1]
$tBytes.GB = $aByte[1][1]
$tBytes.MB = $aByte[2][1]
$tBytes.KB = $aByte[3][1]
$tBytes.Byte = $aByte[4][1]
If $_fStruct Then Return $tBytes
$_sUnit = StringInStr('TB GB MB KB Byte', $_sUnit) ? $_sUnit : ''
$_sUnit = $_sUnit = '' ? $aUnit[$iHighest] : $_sUnit
Local $iUserUnit = Floor(StringInStr('TB GB MB KB Byte', $_sUnit)/3)
Return StringFormat('%.3f %s', $_iByte/$aByte[$iUserUnit][0], $aUnit[$iUserUnit])
EndFunc ;==>_FormatByte
Alles anzeigen
Edit: So, war ein Fehler in einem Statement. Nun sollte es wie gewünscht funktionieren.