Das Beispiel scrollt nicht auf dem Tablet! Der Grund liegt darin, dass "If $iDirectionX ..." und "If $iDirectionY ..." nie eintreten...
Dann lade dir das korrigierte Beispiel aus Post #18 erneut runter... oder ändere die folgenden Zeilen selbst.
Das Beispiel scrollt nicht auf dem Tablet! Der Grund liegt darin, dass "If $iDirectionX ..." und "If $iDirectionY ..." nie eintreten...
Dann lade dir das korrigierte Beispiel aus Post #18 erneut runter... oder ändere die folgenden Zeilen selbst.
Wenn du explizit ein Verzeichnis als Quelle und Ziel angibst, dann dürfen Quelle und Ziel natürlich auch nur Verzeichnisse sein. Genau das hast du mit Quellverzeichnis und Zielverzeichnis auch getan.
Dies hatte ich mit beinahe denselben Worten auch in diesem Satz geschrieben... noch treffender und verständlicher kann ich es nicht formulieren.
...weil ja für Quelle und Ziel eindeutig und unmissverständlich ein Verzeichnis angegeben wird... und das ist es wohl auch, was water dir damit mitteilen wollte.
Einen schönen Tag noch...
Vielleicht hat Bitnugger einen speziellen Maustreiber der das steuert
Ja, das gut möglich sein... ich habe eine Logitech Wireless Mouse M560 und der Treiber setzt dann evtl. automatisch den Fokus auf das unter dem Mauszeiger befindliche Control.
Auf meinem Mini-Server mit Windows 7 und Standard-Maustreiber von Microsoft verhält es sich bei mir auch so und es hilft auch nicht, den Fokus auf ein anderes Control zu setzen.
Dass es bei mir funktioniert, kann aber auch daran liegen, dass ich auf meinem großen PC Windows 10 fahre...
Ja, definiert ist die Variable. Sie nimmt aber nie einen Wert an.
Doch, das tut sie... die Variablen $iDirectionX und $iDirectionY wurden in Zeile 152 deklariert und werden entsprechend der WM_TOUCH-Message in Zeile 170 und 181 definiert - das ist soweit alles richtig! ![]()
Variablen deklarieren... (benennen, bezeichnen, kundgeben, kundtun, zur Kenntnis bringen)
Variablen definieren.... (bestimmen, determinieren, festlegen, Wert(e) zuweisen)
Message senden... hier ist der Fehler!
If $iDirectionX Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX)
If $iDirectionX Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY)
Richtig ist...
If $iDirectionX Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX)
If $iDirectionY Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY)
Teste mal bitte das Script im Anhang... das ist von Melba23 ...ich habe da lediglich noch WM_TOUCH hinzugefügt.
Ich meinte auch, dass $iDirectionX nicht weiter definiert ist. Der Fall also nicht eintreten kann ...
Hast du das Beispiel in Post 7 verwendet?
Ja.
Ops... ja, erwischt!
Da ist ein $iDirectionX zu viel... wieder mal ein typischer Copy & Paste-Fehler. ![]()
Richtig ist:
For $i = 1 To 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
If $iDirectionX Then _SendMessage($hWnd, $WM_HSCROLL, $iDirectionX) ; horizontal scrollen (rechts, links)
If $iDirectionY Then _SendMessage($hWnd, $WM_VSCROLL, $iDirectionY) ; vertikal scrollen (oben, unten)
Next
Das mit der For...Next-Schleife will mir aber nicht so richtig in den Kopf... die Aussage, das es dadurch schneller gehen soll, ist in meinen Augen völliger Quatsch... für einen ersten Test habe ich das aber mal alles unverändert gelassen. Das werde ich aber noch genauer untersuchen.
Hier liest du ja auch mit... Melba23 wird wohl über kurz oder lang auch eine Unterstüzung für WM_TOUCH in seine UDF einbauen... dann kannst du das Aktivieren der ScrollBars mit nur einem Funktionsaufruf erledigen.
Die Syntax dafür sieht dann so aus:
Nun gibt es nur noch 1 Problem.
Wenn in einer ComboBox gescrollt wird, so kann die GUI nicht gescrollt werden.
Erst wenn ein anderer Button angeklickt wird geht dies.
Also bei mir kann ich scrollen, sobald die Maus nicht über einem Control steht... egal, was ich mit dem Combo mache... und es ist auch völlig egal, welches Control den Fokus hat.
Du musst also nur die Maus zu einer Stelle bewegen, wo kein Control ist... dann kannst du die GUI scrollen... und dabei verliert das Combo nicht mal den Fokus.
Die Differenz muss dann mit der Scrollfunktion synchronisiert werden.
Ich meine, da hast du einen Denkfehler... denn du willst doch sicherlich in "Echtzeit" scrollen... in dem Fall musst du bereits bei der der ersten x-/y-Koordinate reagieren, die nicht mit dem Startpunkt übereinstimmt... und nicht erst dann, wenn du den Finger wieder wegnimmst!
Und ja, sicher, die dwID brauchst du natürlich... immer... denn sobald sich diese ändert, musst du dir den neuen Startpunkt merken. Solange die identisch mit der vorherigen Nachricht ist, musst du nur kontrollieren, ob sich die x-/y-Koordinate geändert hat, und wenn ja, die Position(en) synchronisieren, bzw. die Richtung(en) angeben, in die gescrollt werden soll.
Test das Script im Anhang mal... wenn möglich auch mit Mausrad... habe da auch noch ein paar Sachen/Kommentare eingebaut... und gib mir mal bitte die minimalen und maximalen Koordinaten für x und y durch.
Wie es der Zufall will, habe zwei UDFs inkl. Demo... eine ist, soweit ich es ersehen kann, von Oscar , die andere von @Großvater ... beide mit WM_MOUSEWHEEL.
Oscar : https://www.autoit.de/index.php?page…1092#post161092
Der Link ^ ^ ist leider tot... dafür tut es der aber...
oder hier...
@Großvater: GUIScroll-UDF - scrollbare GUIs
Das Ergebnis war: Path bedeutet drive, directory and filename/extension.
Genau genommen steht in der englischen Hilfe aber gar nicht "path", sondern "source path" und "destination path"...
Google übersetzt es so:
The source path -> Der Quellpfad
The destination path -> Der Zielpfad
Nicht nur die Briten/Amis, sondern auch Wikipedia ist der Meinung, dass ein Pfad oder auch Pfadname (hier eben Quell- und Zielpfad) einen Dateinamen enthalten muss... allerdings steht in der englischen Hilfe aber auch, dass Wildcards unterstützt werden... ergo ist alles, was hinter dem letzten Backslash steht, optional. Dies gilt allerdings nur für den Quellpfad!
Peter S. Taler 's Übersetzung dürfte keinen Dateinamen enthalten... und auch keine Wildcards (in deutscher Sprache: Platzhalter)...
Das Quellverzeichnis -> The source directory
Das Zielverzeichnis -> The destination directory
...weil ja für Quelle und Ziel eindeutig und unmissverständlich ein Verzeichnis angegeben wird... und das ist es wohl auch, was water dir damit mitteilen wollte.
Wikipedia sagt zu "Pfad" bzw. "Pfadname" folgendes: https://de.wikipedia.org/wiki/Pfadname
Die korrekte Übersetzung ist demzufolge also: "Der Quellpfad" und "Der Zielpfad".
Warum muss immer alles verkompliziert werden???
Ich kann in diesem Thread auch bei größten Anstrengungen keine einzige Stelle entdecken, die auch nur einen Hauch von Komplexität an sich hat... ![]()
So wie ich es verstehe, ist die dwID bei nur einem TouchPoint nicht von Interesse. Die spielt nur dann eine wichtige Rolle, wenn du mehrere TouchPoints hast, denn in dem Fall musst du diese ja unterscheiden können.
Von daher benötigst du eigentlich nur den y-Wert... und immer wenn eine WM_TOUCH-Message kommt, synchronisierst du die ScrollBar auf den neuen Wert.
Du musst in deinem "Message-Handler" WM_TOUCH aber noch überprüfen, ob du mehrere TouchPoints bekommen hast... ist dies der Fall, dann darfst du die y-Position nämlich nicht synchronisieren!
Was passieren soll, wenn zwei oder mehr TouchPoints vorhanden sind, kannst du dann natürlich auch händeln. Auf meinem Andoid-Tablet werden z.B. zwei aufeinanderfolgende Nachrichten mit drei TouchPoints innerhalb eines Doppelklicks, als Auto-Zoom verstanden, eine Nachricht mit zwei TouchPoints als manuellen Zoom... oder so ähnlich... ![]()
wParam
The low-order word contains the number of touch points associated with this message. The high-order word is reserved for future use.
wParam liefert dir also die Anzahl der Berührungspunkte, an der das Display berührt wurde, zu dem Zeitpunkt, an dem die WM_TOUCH-Message erstellt wurde.
Wenn du das Display nur mit einem Finger berührst, dann kommt da natürlich auch immer eine 1.
Demnach sind die Infos in der Debugausgabe also völlig korrekt! Berühre das Display mal mit mehreren Fingern... in $iTouchPoints (s. neues Script) sollte dann die Anzahl der "Finger" stehen.
Ich habe dein Script mal ein wenig umgeschrieben... teste es mal...
;-- TIME_STAMP 2017-12-26 09:55:11 v 0.1
#Region ;************ Includes ************
#include-once
#include <Array.au3>
#include <GUIConstantsEx.au3>
;~ #include <GuiButton.au3>
;~ #include <StructureConstants.au3>
#include <WindowsConstants.au3>
#include <GuiEdit.au3>
;~ #include <WinAPI.au3>
#EndRegion ;************ Includes ************
#RequireAdmin
Global $g_hGUI, $g_idMemo
Global Const $tagTOUCHINPUT = "LONG x; LONG y; HANDLE hSource; DWORD dwID; DWORD dwFlags; DWORD dwMask; DWORD dwTime; ULONG_PTR dwExtraInfo; DWORD cxContact; DWORD cyContact"
_Main()
Func _Main()
$g_hGUI = GUICreate("WM_TOUCH", 1080, 640)
$g_idMemo = GUICtrlCreateEdit("", 10, 10, 300, 600, $WS_VSCROLL)
;~ _GUICtrlEdit_SetLimitText($g_iMemo, 0x80000000) ; mit _GUICtrlEdit_AppendText() ist das nicht nötig!
GUICtrlSetFont($g_idMemo, 9, 400, 0, "Courier New")
DllCall("User32.dll", "BOOL", "RegisterTouchWindow", "HWND", $g_hGUI, "ULONG", 2)
GUIRegisterMsg($WM_TOUCH, "WM_TOUCH")
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
EndFunc ;==>_Main
; Die in Au3Check 1.51 eingeführte Anweisung #uses, wurde ab 1.52 in #forceref umbenannt. Diese hat zwei Aufgaben.
; 1.) Vermeidung von -w 5 Warnungen durch Au3Check.
; 2.) Vermeiden, dass globale Variablen und Funktionen in der Liste der Bezugssymbole erscheinen, wenn eine Funktion z.B. via Call($fn) aufgerufen wird.
Func WM_TOUCH($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg
Local Static $aDllError = [ _
[1, 'Die Dll-Datei kann nicht verwendet werden.'], _
[2, 'unbekannter Rückgabewert "return type".'], _
[3, 'Funktion wurde nicht in der DLL-Datei gefunden.'], _
[4, 'Falsche Anzahl von Parametern.'], _
[5, 'Falscher Parameter.']]
Local $iTouchPoints = _WinAPI_LoWord($wParam) ; Anzahl der Berührungspunkte, an der das Display berührt wurde, als diese Message erstellt wurde.
Local $aTouchInput[$iTouchPoints]
Local $iBuffer = DllStructCreate("BYTE buffer[" & $iTouchPoints * 40 & "]")
;~ _Memo("BYTE buffer[" & $iTouchPoints * 40 & "]")
Local $tTouchInfo = DllStructCreate($tagTOUCHINPUT, DllStructGetPtr($iBuffer))
Local $pTouchInfo = DllStructGetPtr($tTouchInfo)
Local $iStructSize = DllStructGetSize($tTouchInfo)
For $i = 0 To $iTouchPoints - 1 Step 1
$aTouchInput[$i] = DllStructCreate($tagTOUCHINPUT, $pTouchInfo + $i * 40)
Next
; https://msdn.microsoft.com/de-de/library/windows/desktop/dd317334(v=vs.85).aspx
; typedef struct _TOUCHINPUT {
; LONG x;
; LONG y;
; HANDLE hSource;
; DWORD dwID;
; DWORD dwFlags;
; DWORD dwMask;
; DWORD dwTime;
; ULONG_PTR dwExtraInfo;
; DWORD cxContact;
; DWORD cyContact;
; } TOUCHINPUT, *PTOUCHINPUT;
Local $aRet = DllCall("User32.dll", "BOOL", "GetTouchInputInfo", "HANDLE", $lParam, "UINT", $wParam, "ULONG_PTR", $pTouchInfo, "int", DllStructGetSize($tTouchInfo))
; If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, use the GetLastError function.
If @error Then
Local $iError = @error, $iIndex = _ArraySearch($aDllError, $iError), $sErrorText = $iIndex = -1 ? 'Unbekannter Fehler' : $aDllError[$iIndex][1]
_Memo("Error bei DllCall : " & $iError & ' Errortext = ' & $sErrorText)
_Memo("_WinAPI_GetLastError() : " & _WinAPI_GetLastError())
_Memo("_WinAPI_GetLastErrorMessage() : " & _WinAPI_GetLastErrorMessage())
_Memo("$aRet[0] if successful = true : " & $aRet[0])
Else
_Memo("************************************")
_Memo("Finger Numbers : " & $iTouchPoints)
For $j = 0 To $iTouchPoints - 1 Step 1
_Memo("TouchPointInfo : " & $j)
_Memo("dwID (ID des TouchPints) : " & DllStructGetData($aTouchInput[$j], "dwID"))
_Memo("x/100, y/100 : " & StringFormat('%i, %i\r\n', DllStructGetData($aTouchInput[$j], "x") / 100, DllStructGetData($aTouchInput[$j], "y") / 100))
Next
EndIf
EndFunc ;==>WM_TOUCH
Func _Memo($sText)
If $sText Then _GUICtrlEdit_AppendText($g_idMemo, $sText & @CRLF)
EndFunc ;==>_Memo
Alles anzeigen
Dann "aktiviere" doch mal die Zeilen 57-50... oder ändere sie, für maximale Debug-Info...
GUICtrlSetData($iMemo, "$hWnd : " & $hWnd & @CRLF, 1)
GUICtrlSetData($iMemo, "$Msg : " & $Msg & @CRLF, 1)
GUICtrlSetData($iMemo, "$wParam : " & $wParam & @CRLF, 1)
GUICtrlSetData($iMemo, "$lParam : " & $lParam & @CRLF, 1)
GUICtrlSetData($iMemo, "@error : " & @error & @CRLF, 1)
GUICtrlSetData($iMemo, "_WinAPI_GetLastError() : " & _WinAPI_GetLastError() & @CRLF, 1)
GUICtrlSetData($iMemo, "_WinAPI_GetLastErrorMessage() : " & _WinAPI_GetLastErrorMessage()() & @CRLF, 1)
GUICtrlSetData($iMemo, "Func0 Ret : " & $aRet0[0] & @CRLF, 1)
Weise bitte demnächst darauf hin, wenn du deine Frage auch in anderen Foren gestellt hast.
==>> https://www.win-10-forum.de/edge-and-inter…75-cookies.html
Eine Lösung dafür konnte ich aber auch nicht finden... hier aber ein paar weiterführende Links:
https://www.tenforums.com/browsers-email…ors-update.html
https://superuser.com/questions/1083…s-really-stored
https://www.experts-exchange.com/questions/2859…dat-viewer.html
Um mal einen Blick in die Datei WebCacheV01.dat zu werfen, habe ich sie mit DeadLock entsperrt, weil taskhostw.exe sie bei mir gesperrt hat.
Das Einzige was ich ändern würde wäre ein "@f" aus dem "@@", oder ich habe Assembleit nicht verstanden.
Dann bekommst du das hier...

FASM supports labels that use no identifier or label name.
verstehe ich das richtig, dass dort quasi ein Pseudo-Variant-Array erzeugt
Es wird ein SafeArray erzeugt... wie du das von beiden Seiten handhaben kannst, ist z. B. gut in den Examples in .\Tests\Examples\2) Array variables\ zu sehen.
==>> An AutoIt array is a safearray contained in a variant.
Und was ist, wenn man mehrere Arrays benötigt?
Dann erzeugst du halt mehrere SaveArrays. Wenn du dir die Examples angeschaut hast, wirst du sicher durchblicken. ![]()
Dann kann man die Software aber womöglich via Control-Commands dazu bewegen, dass Messprogramm zu laden... dazu musst du die benötigen Infos mit Au3Info auslesen.
Du schreibst "Protypen-Zahlen"... dann stimmt aber dein Beispieltext nicht, denn "\u25" tanzt dann ja aus der Reihe.
Im Prinzip funktioniert es aber so...
;-- TIME_STAMP 2017-12-20 03:14:09 v 0.1
; Protyp Bedeutung Ersatzdarstellung ISO_8859_1 Unicode
Global $aTable = [ [321, 'Komma' , '' , 44 , '002C'], _
[323, 'Doppelpunkt' , '' , 58 , '003A'], _
[324, 'Ausrufezeichen' , '' , 33 , '0021'], _
[325, 'Fragezeichen' , '' , 63 , '003F'], _
[326, 'Minuszeichen' , '' , 45 , '002D'], _
[327, 'Gleichheitszeichen', '' , 61 , '003D'], _
[328, 'Slash' , '' , 47 , '002F'], _
[329, 'Hochkomma 9' , "'" , -1 , '2019'], _
[330, 'Hochkomma 6' , "'" , -1 , '2018'], _
[333, 'Backslash' , '' , 92 , '005C'], _
[340, 'Malpunkt' , '*' , 183 , '00B7'], _
[341, 'senkrechter Strich', '' , 124 , '007C'], _
[344, 'Minute' , "'" , -1 , '2032'], _
[345, 'Sekunde' , "'" , -1 , '2033'], _
[346, 'Gedankenstrich' , '-' , -1 , '2014'], _
[347, 'Grad' , 'Grad' , 176 , '00B0'], _
[348, 'Promille' , 'Promille' , -1 , '2030'] ]
Global Enum $eProtyp, $eBedeutung, $eErsatzdarstellung, $eISO_8859_1, $eUnicode
_Example()
Func _Example()
Local $sText = 'Nicht \u25ber 25\347 C lagern. Wer über 0,5 \348 Alkohol im Blut hat, sollte kein mehr Auto fahren!'
ConsoleWrite('---------------------------------------------------------------------------------------------------------------' & @CRLF)
ConsoleWrite('! Vorher : ' & $sText & @CRLF)
_ConvertText($sText)
ConsoleWrite('> Nachher : ' & $sText & @CRLF)
ConsoleWrite('---------------------------------------------------------------------------------------------------------------' & @CRLF)
EndFunc
Func _ConvertText(ByRef $sText)
For $i = 0 To UBound($aTable) -1 Step 1
$sText = StringReplace($sText, '\' & $aTable[$i][$eProtyp], ChrW('0x' & $aTable[$i][$eUnicode]))
Next
EndFunc
Alles anzeigen
Hallo Oscar ,
ich bin vor einiger Zeit über diesen Thread gestolpert, der sicher auch für dich interessant ist.
Accessing variables
AutoIt is a BASIC-like language. In BASIC-like languages simple variables are internally stored as variants, and arrays are internally stored as safearrays contained in variants.
Assuming that an AutoIt variable is internally stored as a variant, is it possible to get a pointer to this variant?
Assuming that an AutoIt array is internally stored as a safearray contained in a variant, then it should be possible to get a pointer to the safearray through the pointer to the variant.
Why is a pointer to a safearray interesting? Because such a pointer can be passed as a parameter to a function coded in assembler, C, C++, C# or FreeBasic. We can thus access an AutoIt array directly from a function coded in another language, without the need to convert the array to a structure (DllStructCreate) or similar. In this way it's possible to code very fast array manipulation functions in a real compiled language.