Hi,
wenn ich deinen Code richtig interpretiere, holst du dir doch schon per bmp.LockBits() einen Pointer auf die Bitmapdaten bzw Pixel. Wieso willst du dann noch mit dem (wesentlich langsameren) SetPixel()/Getpixel() arbeiten anstatt die 4 Byte direkt in den Speicher zu schreiben bzw zu lesen?
Weiterhin bin ich nicht sicher, ob du so ein *.PNG benutzen kannst?!Funktioniert das mit einem *.BMP bzw *.JPG?
Beiträge von Andy
-
-
// Update 13.08.2016 erzwungene Kommentarposition
// Wenn im Script irgendwo "aligncomment=POSITION" enthalten ist, werden die Kommentare an dieser Position/Spalte ausgerichtet, wenn diese Position eine andere ist, als von
// AlignComment() berechnet!
// bsp. aligncomment=45, es werden die Kommentare an Spalte 45 ausgerichtet.Hi,
damit ein Script "schön" aussieht, benutzen einige von euch bereits Tidy (Link zur neuesten Beta) (Scite Ctrl+T). Leider werden damit alle Kommentare, die man per Semikolon abgetrennt hinter eine Zeile schreibt, direkt hinter dieser Zeile ausgerichtet.Manchmal ist es aber gewünscht, dass die Kommentare unabhängig von der Zeilenlänge der Codezeilen an einer bestimmten Spaltenposition ausgerichtet werden.
Dies wird mit AlignComment erreicht.
Dabei wird das auszurichtende Script per Kommandozeile an AlignComment übergeben, welches zunächst eine Sicherungskopie des Scriptes erstellt. Dann wird Tidy aufgerufen (falls installiert), eine Positionsspalte für die Kommentare errechnet und alle Kommentare an dieser Spalte ausgerichtet.
Per Ctrl+Q (;~) auskommentierte Zeilen werden NICHT ausgerichtet bzw bleiben so erhalten, wie Tidy sie anlegt!
Zeilen, die ausschliesslich einen Kommentar enthalten (also mit ; anfangen), werden in die Spalte geschrieben, in der auch die aktuellen Codezeilen stehen. Damit werden z.B. in 4 ineinandergeschachtelten For/To-Schleifen der Anfang der Kommentarzeilen zum Anfang der Codezeilen ausgerichtet.Zur Zeit ist es so, dass AlignComment so ausrichtet, dass 80% aller Codezeilen kürzer als die Kommentarposition ist. Das heisst, bei "langen" Zeilen wird der Kommentar einfach an die Zeile angehängt.
Wer das ändern möchte, kann gern die Variable $faktor_align entsprechend anpassen.AutoIt
Alles anzeigen#include <Array.au3> #include <WindowsConstants.au3> ;AlignComment by Andy @ www.autoit.de ;Aligns Comments where are introduced by a Semicolon ; (;~ won´t be aligned!) ; ;The Script should be placed in the Scite-Directory\AlignComment\AlignComment.au3 ; ;add following lines in the SciteUser.propreties-file (Scite\Options\open User-properties) ;if the #38 is occupied, please choose an other number, and replace all 38 ! ;# 38 AlignComment ;command.38.*.au3="$(autoit3dir)\autoit3.exe" "$(SciteDefaultHome)\AlignComment\AlignComment.au3" "$(FilePath)" ;command.name.38.*.au3=AlignComment ;command.save.before.38.*.au3=1 ;command.is.filter.38.*.au3=1 ;command.shortcut.38.*.au3=F4 ;replace F4 with any other non-used keyboard shortcut to start AlignComment ; ;After that, restart Scite, load a script with comments and press F4...thats all $faktor_align = 0.30 ;80% der Zeilen sind kürzer als die Kommentarposition... ;sendscite-commands ;http://www.autoitscript.com/forum/index.php?showtopic=25029&view=findpost&p=175714 If $cmdline[0] = 0 Then ;kein Dateiname angegeben MsgBox(0, "Error AlignComment.au3", "No File selected!") Exit Else $Tidy_path = RegRead("HKEY_CLASSES_ROOT\AutoIt3Script\Shell\Tidy\Command", "") $Tidy_path = StringTrimRight(StringReplace($Tidy_path, '"', ""), 3) SendSciTE_Command('menucommand:106') ;"Datei speichern" der aktuell in Scite geöffneten Datei FileCopy($cmdline[1], $cmdline[1] & ".BAK") ;Sicherungskopie erstellen If @error Then ;falls keine Sicherungskopie herzustellen ist, abbrechen MsgBox(0, "Error AlignComment.au3", "No Backup Copy possible! Check " & $cmdline[1]) Exit EndIf $workdir = StringLeft($cmdline[1], StringInStr($cmdline[1], "\", 1, -1) - 1) ShellExecuteWait($Tidy_path, '"' & $cmdline[1] & '"', $workdir, Default, @SW_HIDE) $file = FileRead($cmdline[1]) ;Dateiinhalt zeilenweise lesen EndIf SendSciTE_Command('menucommand:104') ;reload SendSciTE_Command('menucommand:420') ;clear Output in Scite Console window ConsoleWrite("+ AlignComment by Andy @ www.autoit.de" & @CRLF) ConsoleWrite("+ Orginal file copied to: " & $cmdline[1] & ".BAK" & @CRLF) $zeilen = StringSplit($file, @CRLF, 3) $alignvorgabe = StringRegExp($file, "(?i)aligncomment\s*=\s*(\d+)", 3) ; findet aligncomment=44 im text $alignvorgabepos = 0 If IsArray($alignvorgabe) Then $alignvorgabepos = $alignvorgabe[0] EndIf ;~ _ArrayDisplay($zeilen) $anz = 0 ;position des kommentarzeichens ermitteln Dim $len[UBound($zeilen)] ; For $i = 0 To UBound($zeilen) - 1 ;jede einzelne zeile $string = StringRegExp($zeilen[$i], '((?:[^''";]*([''"]).*?\2)*[^;]*)(;.*$)', 3) ; falls kommentar in zeile, ist dieser in $string[2], ansonsten string[0}="" If $string = 1 Then ;kein Kommentar in der Zeile $l = StringLen($zeilen[$i]) ;länge ohne Kommentar If $l > 10 Then ;keine leerzeile $len[$i] = $l ;anzahl zeichen Else ;leerzeilen zählen (werden nicht mitberechnet) $anz += 1 EndIf Else ;kommentar in der Zeile enthalten $l = StringLen($string[0]) ; länge ohne Kommentar If $l > 10 Then ;nur wenn keine Kommentarzeile $len[$i] = $l ;zeilenlänge ohne kommentar Else ;kommentarzeilen werden auch nicht mitgezählt $anz += 1 EndIf EndIf Next _ArraySort($len, 1) ;array absteigend sortieren ;_ArrayDisplay($len) $c_pos = $len[Int($faktor_align * (UBound($len) - 1 - $anz))] ;position des kommentars, so dass 80% aller zeilen kleiner als die Kommentarposition ist If $c_pos < $alignvorgabepos Then $c_pos = $alignvorgabepos ;If $c_pos < 30 Then $c_pos = 30 ConsoleWrite(" Comments at the end of a line are aligned at Position " & $c_pos & @CRLF) ConsoleWrite(" Whole line Comments are indented" & @CRLF) $a = 'test ;' $Kom = "" ;Das ist ein Kommentar $leerstring = _stringrep(" ", $c_pos) ;maximale anzahl leerzeichen $c_zeile = "" For $i = 0 To UBound($zeilen) - 1 ;anzahl zeilen $z = $zeilen[$i] ;einzelne Zeile $z = StringReplace($z, Chr(9), " ") ;tabs ersetzen durch 4 leerzeichen (scite) $string = StringRegExp($z, '((?:[^''";]*([''"]).*?\2)*[^;]*)(?:(;.*$)|.$)', 3) ; falls kommentar in zeile, ist dieser in $string[2], ansonsten string[0}="" ohne kommentar ist $string=1 If UBound($string) <> 3 Then ;kein kommentar in dieser Zeile $c_zeile = $c_zeile & $z & @CRLF Else ;kommentar in der zeile enthalten $string[0] = StringStripWS($string[0], 2) ;leerzeichen entfernen $l = StringLen($string[0]) ;stringlänge ohne Kommentar If $l > $c_pos Or $string[0] = "" Or StringRegExp($string[0], '\A(?m)(\s+$)') = True Then ; kommentarzeile oder Zeile zu lang, kommentarzeilen werden eingerückt $c_zeile = $c_zeile & $z & @CRLF ;Zeile bleibt unverändert Else $l = StringLen($string[0]) $anz_lz = $c_pos - $l + 1 ;länge Code ohne Kommentar $c_zeile = $c_zeile & $string[0] & StringLeft($leerstring, $anz_lz) & $string[2] & @CRLF ;Kommentar wird ausgerichtet EndIf EndIf Next FileDelete($cmdline[1]) FileWrite($cmdline[1], $c_zeile) Sleep(100) SendSciTE_Command('menucommand:104') ;Script laden Exit (0) ;copied from Xenobiologists OrganizeIncludes ;=============================================================================== ; Description: Sending commands to SciTE interface ;=============================================================================== Func SendSciTE_Command($sCmd, $Wait_For_Return_Info = 0) Local $WM_COPYDATA = 74 Local $WM_GETTEXT = 0x000D Local $WM_GETTEXTLENGTH = 0x000E224 Local Const $SCI_GETLINE = 2153 Local $Scite_hwnd = WinGetHandle('DirectorExtension') ; Get SciTE DIrector Handle Local $My_Hwnd = GUICreate('AutoIt3-SciTE interface') ; Create GUI to receive SciTE info Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2)) ; Convert my Gui Handle to decimal $sCmd = ':' & $My_Dec_Hwnd & ':' & $sCmd ; Add dec my gui handle to commandline to tell SciTE where to send the return info ;~ ConsoleWrite('SciTE Command --> ' & $sCmd & @LF) Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']') DllStructSetData($CmdStruct, 1, $sCmd) Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr') DllStructSetData($COPYDATA, 1, 1) DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1) DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct)) DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _ 'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _ 'Ptr', DllStructGetPtr($COPYDATA)) GUIDelete($My_Hwnd) EndFunc ;==>SendSciTE_Command Func _stringrep($s, $k) ;zeichen, anzahl, schneller Ersatz für _stringrepeat() While StringLen($s) * 2 <= $k ;schneller ersatz für stringrepeat $s &= $s WEnd $s &= StringLeft($s, $k - StringLen($s)) Return $s EndFunc ;==>_stringrep
Damit man AlignComment aus Scite mit einem Tastendruck aufrufen kann, sollte man folgendermassen vorgehen:
AlignComment im Verzeichnis "euerSciteVerzeichnis\AlignComment\AlignComment.au3" abspeichern.
Dann in Scite die Datei SciteUser.properties (Optionen\Benutzer-Einstellungen öffnen) öffnen und folgende Zeilen eintragen:Code# 38 AlignComment command.38.*.au3="$(autoit3dir)\autoit3.exe" "$(SciteDefaultHome)\AlignComment\AlignComment.au3" "$(FilePath)" command.name.38.*.au3=AlignComment command.save.before.38.*.au3=1 command.is.filter.38.*.au3=1 command.shortcut.38.*.au3=F4
F4 kann durch eine andere freie Tastenkombination ersetzt werden! Falls die #38 bereits in eurer SciteUser.properties enthalten ist, sucht die nächste freie Nummer und ersetzt alle 38er durch diese freie Nummer.Nun Scite einmal neustarten (sicher ist sicher^^) und ein Script mit vielen Kommentaren laden, F4 drücken und sich über die ausgerichteten Kommentare freuen^^! Viel Spass!
Bitte Rückmeldung, ob AlignComment auch mit 64Bit-Systemen zurechtkommt. Ich habe es nur auf 32bit getestet, aber bis auf den Registry-Aufruf um das Tidy-Verzeichnis zu bekommen sollte es keine Probleme geben!
Falls jemand AlignComment auch mit anderen Programmiersprachen bzw Kommentartrennern verwenden möchte, bitte Info!/EDIT/ die Schleifen von For $i = 0 To UBound($zeilen) - 2 nach For $i = 0 To UBound($zeilen) - 1 geändert.(s.Oscars Post). Das führt allerdings dazu, dass im 32-Bitmodus eine Leerzeile ans Script angehängt wird.
-
[autoit]
$verhaelnis
[/autoit]ist immer 0, da $temp[0] zum Zeitpunkt der Berechnung noch garkein Handle eines Bildes enthält. Zufälligerweise berechnet aber
[autoit]_GDIPlus_ImageGetWidth(0)
[/autoit]irgendeine Zahl, es wird auch kein @error gesetzt, ansonsten würde durch 0 geteilt und ein Fehler generiert! Da $verhaelnis=0 ist die Höhe des Bildes bei
[autoit]_GDIPlus_GraphicsDrawImageRect($graphic, $temp[0], $current_pos[0], $current_pos[1], 20, 20 * $verhaetlnis)
[/autoit]natürlich auch 0 und somit wird es nicht dargestellt....
Debugging FTW!Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <GUIConstantsEx.au3>Local $max_x = 300, $max_y = 300
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$Gui = GUICreate("Beispiel", $max_x, $max_y)
[/autoit] [autoit][/autoit] [autoit]Dim $weg = _erstelle_weg($max_x, $max_y)
[/autoit] [autoit][/autoit] [autoit]Dim $temp[2]
[/autoit] [autoit][/autoit] [autoit]$move_figures = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
$new_figure = TimerInit()GUISetBkColor(0xFFFFFF, $Gui)
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW)_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
$temp[0]=_GDIPlus_ImageLoadFromFile(@ScriptDir & "\figur.bmp"); array mit allen figuren
[/autoit] [autoit][/autoit] [autoit]
Dim $figuren[1] = [0]$height = _GDIPlus_ImageGetHeight($temp[0])
[/autoit] [autoit][/autoit] [autoit]
$width = _GDIPlus_ImageGetWidth($temp[0])
$verhaetlnis = $height / $width
$graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)While True
[/autoit] [autoit][/autoit] [autoit]
; nach zufälligen abstand von 1 - 100 ms ein neues mänchen zeichen
If TimerDiff($new_figure) > Random(1, 100, 1) Then
; im index 0 das bildhandle, im index 1 die position auf dem weg-array
Local $temp[2] = [_GDIPlus_ImageLoadFromFile(@ScriptDir & "\figur.bmp"), 0]; neue figur
[/autoit] [autoit][/autoit] [autoit]
$figuren[0] += 1; array ins n feld einfügen
[/autoit] [autoit][/autoit] [autoit]
_ArrayAdd($figuren, $temp); neuen stempel für die zufallswartezeit erstellen
[/autoit] [autoit][/autoit] [autoit]
$new_figure = TimerInit()
EndIf; nach 10 ms verstrichener zeit, figuren erneut bewegen
[/autoit] [autoit][/autoit] [autoit]
If TimerDiff($move_figures) > 10 Then
; für alle figuren
For $i = 1 To $figuren[0]
; kopiere das array aus dem großen array zurück
Local $temp = $figuren[$i]
; lass männchen 1 position am weg wandern
$temp[1] += 1; X- und Y-Koordinate aus dem weg der position des männchen lesen
[/autoit] [autoit][/autoit] [autoit]
Local $current_pos = $weg[$temp[1] + 1]
;
; geändertes kleines array (pos am weg) wieder zurück ins große array speichern
$figuren[$i] = $temp; bild verschieben
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_GraphicsDrawImageRect($graphic, $temp[0], $current_pos[0], $current_pos[1], 20, 20 * $verhaetlnis)
sleep(50)
Next$move_figures = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
EndIfSwitch GUIGetMsg()
[/autoit] [autoit][/autoit] [autoit]
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEndFunc _erstelle_weg($max_x, $max_y)
[/autoit] [autoit][/autoit] [autoit]
Dim $weg[1] = [0]
Dim $pos[2] = [0, 0]Local $x = 0, $y = 0
[/autoit] [autoit][/autoit] [autoit]While($x < $max_x And $y < $max_y)
[/autoit] [autoit][/autoit] [autoit]
If Random(0, 1, 1) == 0 Then
$x += 1
Else
$y += 1
EndIf$pos[0] = $x
[/autoit] [autoit][/autoit] [autoit]
$pos[1] = $y$weg[0] += 1
[/autoit] [autoit][/autoit] [autoit]
_ArrayAdd($weg, $pos)
;~ GUICtrlCreatePic("line.bmp", $x, $y, 1, 1, $BS_BITMAP)
WEndReturn $weg
[/autoit]
EndFuncjedenfalls wird jetzt das Männlein angezeigt, der Weg ist aber seltsam^^
-
Über die "neue" Version (beta) von Tidy bin ich überhaupt darauf gekommen, evtl. wäre es mal Zeit, Jos zu fragen ob man diese Funktion in Tidy integrieren könnte.
Allerdings könnte man auch einfach in den SciteUser.propreties ein Ctrl+T auf ein Batch umleiten, dass zuerst Tidy, und im Anschluss daran den "Kommentarausrichter" aufruft.Zzt. habe ich ein quick&dirty-Script, welches die einzelnen Längen der Zeilen analysiert und daraufhin eine Position für den Kommentar errechnet. Somit kann man sich sparen, eine feste Position vorzugeben.
Bissl Kleinkram ist noch zu tun, wenn ich damit zufrieden bin, geht es online^^ -
Zitat
ich habe gelesen, daß man viele Dinge nur wirklich mit RegEx lösen kann.
ja, 0.0234% aller "Dinge" kann man nur mit RegExp lösen. Ggf ist Regexp kürzer, schneller oder auch "professioneller"...manchmal!
Aber die "normalen" Stringbefehle machen ihre Sache genausogut. Mit dem Vorteil, dass "jeder" sie nachvollziehen kann.
Und man kann sie oft wesentlich leichter anpassen, ohne die komplette RegExp umzuschreiben.
Was nichts daran ändert, dass RegExp eine sehr mächtige Waffe ist!Und da 1000 Wege nach Rom führen....
Spoiler anzeigen
[autoit]Global $aText[2]
[/autoit] [autoit][/autoit] [autoit]$aText[0] = "http://www.autoit.de/index.php?page=Index"
[/autoit] [autoit][/autoit] [autoit]
$aText[1] = "http://www.codeproject.com/KB/dotnet/regextutorial.aspx"For $i = 0 To 1
[/autoit] [autoit][/autoit] [autoit]
$ersterPunkt=stringinstr($atext[$i],".") ;positionen der "." finden
$zweiterPunkt=stringinstr($atext[$i],".",1,1,$ersterPunkt+1)
$string=stringmid($atext[$i],$ersterpunkt+1,$zweiterpunkt-$ersterPunkt-1) ;dazwischen steht der gesuchte string
MsgBox(0, "String: " & $i + 1, $string)
NextFor $i = 0 To 1
[/autoit] [autoit][/autoit] [autoit]
$string=stringtrimleft($atext[$i],stringinstr($atext[$i],".")) ;string bis zum ersten punkt abschneiden
$string=stringleft($string,stringinstr($string,".")-1) ;String bis zum nächsten punkt anzeigen
MsgBox(0, "String: " & $i + 1, $string)
NextFor $i = 0 To 1
[/autoit] [autoit][/autoit] [autoit][/autoit]
$a=stringsplit($atext[$i],".",3) ;string zerteilen
MsgBox(0, "String: " & $i + 1, $a[1]) ;;array[1] anzeigen
Next -
Das mit der "Optimierung" ist bei einem Interpreter immer so eine Sache...Ich jedenfalls habe in AutoIt die Erfahrung gemacht, dass jeder eingesparte Befehl Performance bringt.
Daher ist es um so wichtiger, die "inner loops" so klein wie möglich zu machen. Aber ich denke, im vorliegenden Fall kommts auf 100 oder 200 Takte mehr oder weniger nicht an^^ -
@Großvater,
jedenfalls ist es nicht langsamer, wie in AutoIt eigentlich aufgrund des zusätzlichen Befehls zu erwarten!Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
$t = TimerInit()$b=2^16 ;anzahl tests
[/autoit]
For $p = 1 To $b ;outer loop
$bin = ""
$dec = 2 ^ 31 - 1
For $i = 10 To 0 Step -1 ;inner loop
;$bin &= Number(BitAND($dec, 2 ^ $i) = 2 ^ $i) ;beide gleich schnell...
$bin &= Number(BitAND($dec, BitShift(1, -$i)) > 0)
Next
Next
$m = TimerDiff($t)
MsgBox(262144, 'Debug line ~' & @ScriptLineNumber, 'Selection:' & @LF & '$m' & @LF & @LF & 'Return:' & @LF & $m) ;### Debug MSGBOX -
Zitat
Was ihm aber nichts bringt, da er scheinbar zu Laufzeit diesen Eintrag in der exe setzen will,
Naja, dann erstellt er eben in der EXE im Resourcezweig per Resourceneditor einmal einen String und ändert diesen dann zu Laufzeit. Das Offset dieses Strings in der Datei bleibt ja immer gleich und kann hardkodiert mitkompiliert werden. Wozu der Quatsch eigentlich? Denn
Zitat1. ich darf nicht mit der registrierung abrbeiten
2. es muss eine einzelne exe sein also keine extrene setting.txt oder ähnliches
3. der string wird immer wieder geänderthört sich nicht nach einer "normalen" Anwendung an, um das mal vorsichtig auszudrücken!
-
Greenhorns Variante funktioniert einwandfrei^^
Spoiler anzeigen
[autoit]Global Const $user32dll = DllOpen ("user32.dll")
[/autoit] [autoit][/autoit] [autoit]#include <Constants.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Global Const $MAX_PATH = 260
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global Const $HWND_DESKTOP = 0Func GetTopWindow ($hWnd)
[/autoit] [autoit][/autoit] [autoit]Local $aRes = DllCall ($user32dll, 'HWND', 'GetTopWindow', _
[/autoit] [autoit][/autoit] [autoit]
'HWND', $hWnd)
Return $aRes[0]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func GetNextWindow ($hWnd, $wCmd)
[/autoit] [autoit][/autoit] [autoit]Local $aRes = DllCall ($user32dll, 'HWND', 'GetWindow', _
[/autoit] [autoit][/autoit] [autoit]
'HWND', $hWnd, _
'UINT', 2)Return $aRes[0]
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func GetWindowText ($hWnd, ByRef $lpString, $nMaxCount)
[/autoit] [autoit][/autoit] [autoit]Local $aRes = DllCall ($user32dll, 'INT', 'GetWindowTextW', _
[/autoit] [autoit][/autoit] [autoit]
'HWND', $hWnd, _
'WSTR', $lpString, _
'INT', $nMaxCount)If (not @error) Then
[/autoit] [autoit][/autoit] [autoit]
$lpString = $aRes[2]
Return $aRes[0]
EndIfEndFunc
[/autoit] [autoit][/autoit] [autoit]Func GetWindowZOrder ($hWnd)
[/autoit] [autoit][/autoit] [autoit]Local $hwndTop
[/autoit] [autoit][/autoit] [autoit]
Local $hwndNext
Local $sText$hwndTop = GetTopWindow ($hWnd)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hwndTop = ' & $hwndTop & @crlf & '>Error code: ' & @error & @crlf) ;### Debug ConsoleIf (not $hwndTop) Then _
[/autoit] [autoit][/autoit] [autoit]
Return FALSEGetWindowText ($hwndTop, $sText, $MAX_PATH)
[/autoit] [autoit][/autoit] [autoit]$hwndNext = GetNextWindow ($hwndTop, $GW_HWNDNEXT)
[/autoit] [autoit][/autoit] [autoit]GetWindowText ($hwndNext, $sText, $MAX_PATH)
[/autoit] [autoit][/autoit] [autoit]While ($hwndNext <> 0)
[/autoit] [autoit][/autoit] [autoit]
$hwndNext = GetNextWindow ($hwndNext, $GW_HWNDNEXT)
GetWindowText ($hwndNext, $sText, $MAX_PATH)
ConsoleWrite (StringFormat ("--- HWND: %s; Text: %s\n", $hwndNext, $sText))
WEndReturn TRUE
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]WinActivate ("PoEdit")
[/autoit] [autoit][/autoit] [autoit]
Sleep (500)
GetWindowZOrder ($HWND_DESKTOP) ; Desktop = 0
DllClose ($user32dll)
Exit (0);«««««««««««««««««««««««««««««««« End Of File «««««««««««««««««««««««««««««««««
[/autoit]das "überladen"
[autoit]While (($hwndNext = GetNextWindow ($hwndNext, $GW_HWNDNEXT)) <> 0)
[/autoit]ist aber AutoIt ein bisschen zu viel

-
Zitat
funktioniert nicht wie es soll... wäre immernoch sehr viel arbeit für mich...
glatt gelogen, wenn dir schon jemand "den Arm aus der Sonne legt", könntest du wenigstens soviel Anstand besitzen, und in der Hilfe nachschauen, mit welchem Befehl du die führenden Nullen hinzufügst....
Die "Arbeit" hat sich Oscar gemacht, wobei man bemerken sollte, dass er im Gegensatz zu dir in der Lage ist, die Forensuche zu benutzen um bereits abgehandelte Themen zu findenUnd eins kann ich dir sicher versprechen, ein Spruch wie
ZitatJetz brauche ich noch ein Programm welches.....
ist nicht gerade geeignet, Leute die ihre Freizeit opfern um DEINE Arbeit machen, weiter zu motivieren...denn..."Nur selbst fressen macht fett!"
Will meinen, schreib doch selbst mal ein Script, die "Arbeit" ist ja in Form der Funktion schon gemacht! -
mit dem http://www.wilsonc.demon.co.uk/d10resourceeditor.htm kann man Ressourcen u.a. auch in EXE Dateien anpassen
-
zu1) Richtig!
zu2)ZitatDriver will be automatically installed and configured automatically when the dll is loaded
also ins Verzeichnis der Dll
-
Hi, versuche mal, alle Typen im Dll-Call auf 64 Bit zu setzen, also aus INT machst du INT64.
Um die Lib´s brauchst du dir idr keine Gedanken zu machen, die werden zu der DLL dazugelinkt, die brauchst du nur, während die Dll compiliert wird.
Ggf. wird auch noch der Treiber hwinterfacex64.sys gebraucht.... -
Vorgehensweise des Beispiels:
In Scite erstellt, Kommentare per Leerzeichen / Tabs ausgerichtet, in den Foreneditor kopiert, von der Forensoftware "rendern" lassen und per "Code kopieren" Button nach Scite zurückkopiert.(Die Tabs werden dabei automatisch durch Leerzeichen ersetzt).Da es aber durchaus vorkommen kann, dass "halbe" oder "viertel" Tabs bis zum nächsten Tabstop durch die volle Anzahl der Leerzeichen ersetzt werden, verschiebt sich der Text auch beim Zurückkopieren.
Daher werde ich in Zukunft "wild" Kommentare setzen und einfach per Script vor dem Posten zwischen Code und Kommentar mit Leerzeichen auffüllen. Somit ist wenigstens nach dem zurückkopieren der Quellcode richtig ausgerichtet. Wie das im Forum aussieht ist zweitrangig, da sowieso nicht ohne weiteres anpassbar.
Alternative wäre, sowohl ein ein "Ausrichten-Script" fürs Forum und eins für Scite zu erstellen, dann kann jeder machen was er will^^. Schaumamal... -
Hi,
ZitatDa jedoch einige Zeichen Fett und andere normal dargestellt werden, könnte sich das ganze trotzdem verschieben, ich hab aber noch nichts bemerkt.
Das liegt daran, dass bei deinem Beispiel so gut wie alle Zeichen Fett sind^^
[autoit]#AutoIt3Wrapper_UseUpx=n ;Aufgefüllt mit Leerzeichen
[/autoit][autoit][/autoit][autoit]
#AutoIt3Wrapper_UseUpx=n ;Aufgefüllt mit Tabs
iiiiiiiiiiiiiiiiiiii ;20xi und 60 Leerzeichen
aeklpfjopaoghpaijerhfpkjdfnpvkjbnapvj.. ;40 zufällige Zeichen und 40 LeerzeichenOpt("GUIOnEventMode", 1) ;Leerzeichen
[/autoit]
Local $hWnd, $hGraphic, $hBitmap, $hBackbuffer, $hBrush ;Leerzeichen
Opt("GUIOnEventMode", 1) ;Tab
Local $hWnd, $hGraphic, $hBitmap, $hBackbuffer, $hBrush ;Tab
For $i=1 to 20 ;TabulatorenWas funktioniert ist das Auffüllen mit Leerzeichen zwischen Code und Kommentar, dann wird beim "zurückkopieren" aus der Forendarstellung nach Scite wenigstens dort "richtig" ausgerichtet (Scite ist bei mir nichtproportional...)
-
Interessante Diskussion!
Für mich wesentlich interessanter ist die Tatsache, dass z.B. in Italien (aber auch in allen anderen Ländern Europas) Gesetze verabschiedet werden, welche Korruption, Steuerhinterziehung und weitaus schlimmere "Verbrechen" von Politikern legitimieren. Und die Mehrheit der Bevölkerung findet das völlig in Ordnung!
Irgendein Vollspaten (MdB, ich habe mir leider nicht den Namen aufgeschrieben, sondern aus lauter Wut weitergezappt) hat in einem Interview zur fortschreitenden Wahlmüdigkeit festgestellt, dass die "Nichtwähler" durch ihre Entscheidung massgeblich die politische Landschaft bestimmen. In welchem Land ist dieser Idiot aufgewachsen und hat in den letzten 30 Jahren die Politik mitverfolgt? So wie ich die Sache sehe, werden politische Entscheidungen ausschliesslich von GEWÄHLTEN "Volksvertretern" bestimmt, und nicht von nichtgewählten! Somit es ist für einen Politiker wesentlich einfacher und lukrativer, sein Fähnchen in den Wind zu hängen, anstatt mal "Eier in der Hose" zu haben und seine eigene (subjektive) Meinung zu vertreten! Koalitionszwang ist seit dem "Einheitskanzler" systemimmanent geworden! Auch bei den Grünen!Zu S21: Kein Schwein hätte sich aufgeregt, wenn ein paar Bäume gefällt oder wenn im Zuge der Bauarbeiten eine denkmalgeschützte Fassade umgelegt worden wäre! Das passiert tagtäglich überall! Das eigentliche Problem sind die extrem gestiegenen Kosten. Und die liegen bestimmt nicht an den um 800% gestiegenen Lohnkosten der Bauarbeiter oder des Materials! Das Problem ist generell, dass zu viele Leute sich im Umfeld die Taschen vollstopfen wollen. Bei der Bankenkrise hatte auch keiner was dagegen gehabt, dass 500 Milliarden (ohne die 285Mrd für die 2 BadBanks) für offensichtliche Unfähigkeit von 20.000 Angestellten ausgegeben wird! Wobei auch gerade in Baden-Württemberg auffällt, dass dort relativ wenige Großbanken sitzen. Will man sich dort "zum Ausgleich" an S21 gütlich tun wenn das Füllhorn doch offensichtlich besonders reichlich über den grössten Fehlentscheidern und Handaufhaltern ausgeschüttet wird?
Frei nach dem Motto:" Ich habe die wenigste Ahnung, deshalb bin ich auch am wenigsten Verantwortlich und genau deshalb gehört mir auch das größte Stück vom Kuchen!"
Und genau diese Leute profilieren sich in der Öffentlichkeit mit großspuriger Diskussion über +-5€/Monat für einen H4-Empfänger.Wenn ihr das nächste Mal in der Schule, dem Bus, im Zug oder bei der Arbeit seid, schaut euch mal um und versucht zu verstehen, warum die Menschen um euch herum solche "Entscheider" wählen...
-
-
Zitat
Ich will alle verfügbaren Codepages auflisten lassen, und dann anzeigen lassen (also die Zeichen von 0x00 bis 0xFF)
Hab da mal was gebastelt.....Spoiler anzeigen
[autoit];Umwandlung Ansi-String in String Codepage
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>;http://msdn.microsoft.com/en-us/library/…6(v=VS.85).aspx
[/autoit] [autoit][/autoit] [autoit]
$page = "037 IBM037 IBM EBCDIC US-Canada|437 IBM437 OEM United States|500 IBM500 IBM EBCDIC International|708 ASMO-708 Arabic (ASMO 708)|709 Arabic (ASMO-449+, BCON V4)|710 Arabic - Transparent Arabic|720 DOS-720 Arabic (Transparent ASMO); Arabic (DOS)|737 ibm737 OEM Greek (formerly 437G); Greek (DOS)|775 ibm775 OEM Baltic; Baltic (DOS)|850 ibm850 OEM Multilingual Latin 1; Western European (DOS)|852 ibm852 OEM Latin 2; Central European (DOS)|855 IBM855 OEM Cyrillic (primarily Russian)|857 ibm857 OEM Turkish; Turkish (DOS)|858 IBM00858 OEM Multilingual Latin 1 + Euro symbol|860 IBM860 OEM Portuguese; Portuguese (DOS)|861 ibm861 OEM Icelandic; Icelandic (DOS)|862 DOS-862 OEM Hebrew; Hebrew (DOS)|863 IBM863 OEM French Canadian; French Canadian (DOS)|864 IBM864 OEM Arabic; Arabic (864)|865 IBM865 OEM Nordic; Nordic (DOS)|866 cp866 OEM Russian; Cyrillic (DOS)|869 ibm869 OEM Modern Greek; Greek, Modern (DOS)|870 IBM870 IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2|874 windows-874 ANSI/OEM Thai (same as 28605, ISO 8859-15); Thai (Windows)|875 cp875 IBM EBCDIC Greek Modern|932 shift_jis ANSI/OEM Japanese; Japanese (Shift-JIS)|936 gb2312 ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312)|949 ks_c_5601-1987 ANSI/OEM Korean (Unified Hangul Code)|950 big5 ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5)|1026 IBM1026 IBM EBCDIC Turkish (Latin 5)|1047 IBM01047 IBM EBCDIC Latin 1/Open System|1140 IBM01140 IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro)|1141 IBM01141 IBM EBCDIC Germany (20273 + Euro symbol); IBM EBCDIC (Germany-Euro)|1142 IBM01142 IBM EBCDIC Denmark-Norway (20277 + Euro symbol); IBM EBCDIC (Denmark-Norway-Euro)|1143 IBM01143 IBM EBCDIC Finland-Sweden (20278 + Euro symbol); IBM EBCDIC (Finland-Sweden-Euro)|1144 IBM01144 IBM EBCDIC Italy (20280 + Euro symbol); IBM EBCDIC (Italy-Euro)|1145 IBM01145 IBM EBCDIC Latin America-Spain (20284 + Euro symbol); IBM EBCDIC (Spain-Euro)|1146 IBM01146 IBM EBCDIC United Kingdom (20285 + Euro symbol); IBM EBCDIC (UK-Euro)|1147 IBM01147 IBM EBCDIC France (20297 + Euro symbol); IBM EBCDIC (France-Euro)|1148 IBM01148 IBM EBCDIC International (500 + Euro symbol); IBM EBCDIC (International-Euro)|1149 IBM01149 IBM EBCDIC Icelandic (20871 + Euro symbol); IBM EBCDIC (Icelandic-Euro)|1200 utf-16 Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications|" & _
"1201 unicodeFFFE Unicode UTF-16, big endian byte order; available only to managed applications|1250 windows-1250 ANSI Central European; Central European (Windows)|1251 windows-1251 ANSI Cyrillic; Cyrillic (Windows)|1252 windows-1252 ANSI Latin 1; Western European (Windows)|1253 windows-1253 ANSI Greek; Greek (Windows)|1254 windows-1254 ANSI Turkish; Turkish (Windows)|1255 windows-1255 ANSI Hebrew; Hebrew (Windows)|1256 windows-1256 ANSI Arabic; Arabic (Windows)|1257 windows-1257 ANSI Baltic; Baltic (Windows)|1258 windows-1258 ANSI/OEM Vietnamese; Vietnamese (Windows)|1361 Johab Korean (Johab)|10000 macintosh MAC Roman; Western European (Mac)|10001 x-mac-japanese Japanese (Mac)|10002 x-mac-chinesetrad MAC Traditional Chinese (Big5); Chinese Traditional (Mac)|10003 x-mac-korean Korean (Mac)|10004 x-mac-arabic Arabic (Mac)|10005 x-mac-hebrew Hebrew (Mac)|10006 x-mac-greek Greek (Mac)|10007 x-mac-cyrillic Cyrillic (Mac)|10008 x-mac-chinesesimp MAC Simplified Chinese (GB 2312); Chinese Simplified (Mac)|10010 x-mac-romanian Romanian (Mac)|10017 x-mac-ukrainian Ukrainian (Mac)|10021 x-mac-thai Thai (Mac)|10029 x-mac-ce MAC Latin 2; Central European (Mac)|10079 x-mac-icelandic Icelandic (Mac)|10081 x-mac-turkish Turkish (Mac)|10082 x-mac-croatian Croatian (Mac)|12000 utf-32 Unicode UTF-32, little endian byte order; available only to managed applications|12001 utf-32BE Unicode UTF-32, big endian byte order; available only to managed applications|20000 x-Chinese_CNS CNS Taiwan; Chinese Traditional (CNS)|20001 x-cp20001 TCA Taiwan|20002 x_Chinese-Eten Eten Taiwan; Chinese Traditional (Eten)|20003 x-cp20003 IBM5550 Taiwan|20004 x-cp20004 TeleText Taiwan|20005 x-cp20005 Wang Taiwan|20105 x-IA5 IA5 (IRV International Alphabet No. 5, 7-bit); Western European (IA5)|20106 x-IA5-German IA5 German (7-bit)|20107 x-IA5-Swedish IA5 Swedish (7-bit)|20108 x-IA5-Norwegian IA5 Norwegian (7-bit)|20127 us-ascii US-ASCII (7-bit)|20261 x-cp20261 T.61|20269 x-cp20269 ISO 6937 Non-Spacing Accent|20273 IBM273 IBM EBCDIC Germany|20277 IBM277 IBM EBCDIC Denmark-Norway|20278 IBM278 IBM EBCDIC Finland-Sweden|20280 IBM280 IBM EBCDIC Italy|20284 IBM284 IBM EBCDIC Latin America-Spain|20285 IBM285 IBM EBCDIC United Kingdom|20290 IBM290 IBM EBCDIC Japanese Katakana Extended|20297 IBM297 IBM EBCDIC France|20420 IBM420 IBM EBCDIC Arabic|20423 IBM423 IBM EBCDIC Greek|20424 IBM424 IBM EBCDIC Hebrew|20833 x-EBCDIC-KoreanExtended IBM EBCDIC Korean Extended|" & _
"20838 IBM-Thai IBM EBCDIC Thai|20866 koi8-r Russian (KOI8-R); Cyrillic (KOI8-R)|20871 IBM871 IBM EBCDIC Icelandic|20880 IBM880 IBM EBCDIC Cyrillic Russian|20905 IBM905 IBM EBCDIC Turkish|20924 IBM00924 IBM EBCDIC Latin 1/Open System (1047 + Euro symbol)|20932 EUC-JP Japanese (JIS 0208-1990 and 0121-1990)|20936 x-cp20936 Simplified Chinese (GB2312); Chinese Simplified (GB2312-80)|20949 x-cp20949 Korean Wansung|21025 cp1025 IBM EBCDIC Cyrillic Serbian-Bulgarian|21027 (deprecated)|21866 koi8-u Ukrainian (KOI8-U); Cyrillic (KOI8-U)|28591 iso-8859-1 ISO 8859-1 Latin 1; Western European (ISO)|28592 iso-8859-2 ISO 8859-2 Central European; Central European (ISO)|28593 iso-8859-3 ISO 8859-3 Latin 3|28594 iso-8859-4 ISO 8859-4 Baltic|28595 iso-8859-5 ISO 8859-5 Cyrillic|28596 iso-8859-6 ISO 8859-6 Arabic|28597 iso-8859-7 ISO 8859-7 Greek|28598 iso-8859-8 ISO 8859-8 Hebrew; Hebrew (ISO-Visual)|28599 iso-8859-9 ISO 8859-9 Turkish|28603 iso-8859-13 ISO 8859-13 Estonian|28605 iso-8859-15 ISO 8859-15 Latin 9|29001 x-Europa Europa 3|38598 iso-8859-8-i ISO 8859-8 Hebrew; Hebrew (ISO-Logical)|50220 iso-2022-jp ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS)|50221 csISO2022JP ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana)|50222 iso-2022-jp ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI)|50225 iso-2022-kr ISO 2022 Korean|50227 x-cp50227 ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022)|50229 ISO 2022 Traditional Chinese|50930 EBCDIC Japanese (Katakana) Extended|50931 EBCDIC US-Canada and Japanese|50933 EBCDIC Korean Extended and Korean|50935 EBCDIC Simplified Chinese Extended and Simplified Chinese|50936 EBCDIC Simplified Chinese|50937 EBCDIC US-Canada and Traditional Chinese|50939 EBCDIC Japanese (Latin) Extended and Japanese|51932 euc-jp EUC Japanese|51936 EUC-CN EUC Simplified Chinese; Chinese Simplified (EUC)|51949 euc-kr EUC Korean|51950 EUC Traditional Chinese|52936 hz-gb-2312 HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ)|54936 GB18030 Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030)|57002 x-iscii-de ISCII Devanagari|57003 x-iscii-be ISCII Bengali|57004 x-iscii-ta ISCII Tamil|57005 x-iscii-te ISCII Telugu|57006 x-iscii-as ISCII Assamese|57007 x-iscii-or ISCII Oriya|57008 x-iscii-ka ISCII Kannada|57009 x-iscii-ma ISCII Malayalam|57010 x-iscii-gu ISCII Gujarati|57011 x-iscii-pa ISCII Punjabi|65000 utf-7 Unicode (UTF-7)|65001 utf-8 Unicode (UTF-8)"$a = StringSplit($page, "|", 2)
[/autoit] [autoit][/autoit] [autoit]
$struct = DllStructCreate("byte[512]") ;platz für UTF16
$ansi = ""
For $i = 1 To 255 ;ansistring füllen mit dem aktuellen Zeichensatz
$ansi &= Chr($i)
NextFor $b In $a ;alle codepages
[/autoit]
$codepage = Number($b) ;codepagenummer
$string = _WinAPI_MultiByteToWideCharEx($ansi, DllStructGetPtr($struct), $codepage, $MB_USEGLYPHCHARS) ;Ansi-String in Codepage umwandeln
;wenn $string=0 dann ggf Fehler/nicht darstellbar, ansonsten anzahl der Zeichen
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $string = ' & $string & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
If $string <> 0 Then MsgBox(262144, "Codepage Nr:" & $b, "Orginalstring:" & @CRLF & $ansi & @CRLF & @CRLF & "Codepage " & $codepage & @CRLF & BinaryToString(DllStructGetData($struct, 1), 2)) ;### Debug MSGBOX
Next -
Das sind keine Whitespaces sondern Nullbytes!
[autoit]
Diese sind und bleiben im String vorhanden, die AutoIt (WinApi)-Funktionen zum Anzeigen stellen aber nur nullterminierte Strings dar! Ergo wird alles "nach" dem Nullbyte "abgeschnitten"....
Das kann man z.B. damit beheben, indem man das Nullbyte durch ein Leerzeichen austauscht.$binary = "0xFFFFFFFFFFFFFFFFFFFF696E666F302E352E3100756E6E616D65642073657276657200646D3100444D0030002D310030003800"
[/autoit]
$text=BinaryToString($binary) ; ggf. flag anpassen wg Unicode
$text=stringreplace($text,chr(0)," ") ;Nullbyte ersetzen durch leerzeichen chr(32)
MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$text' & @lf & @lf & 'Return:' & @lf & $text) ;### Debug MSGBOX
Um nur die Ascii-Codes 32 bis 127 darzustellen, kann man ja per Regexp() filtern, oder Buchstabenweise den ursprünglichen String scannen... -