Beiträge von KloMeister

    Wie funktioniert das jetzt mit der .ini? Weil bei mir sagt er jetzt nurnoch keine .ini File gefunden. So wie ich das verstanden habe schaut der nach einer .ini Datei im aktuellen Ordner, egal wie sie heißt? Scheint aber wohl nicht zu funktionieren


    Und das du den "Delay" jetzt abhängig von der Verzögerung für die "Wiederholrate" machst, versteh ich auch nicht. Das sind die Eigenschaften wenn ich eine Taste gedrückt halte. Wenn ich eine Taste einzeln wiederholt drücke, dann kann die Verzögerung deutlich geringer sein als diese eingestellte für die gedrückte Taste. Als Gamer wäre das fatal wenn ich 500ms keine Taste mehr drücken könnte.


    Das Prellen ist ja ein mechanischer Prozess der sich wahrscheinlich im µs Beriech, höchstens niedrigen ms Bereich befindet.

    Die Garantie ist wahrscheinlich schon abgelaufen und außerdem wird meine Tastatur (Zowie Celeritas) nichtmehr hergestellt, wird also schwer da überhaupt noch Ersatz zu bekommen.


    Kostete leider um die 100€


    Irgendwann wenn mir mal wieder ein Modell einer mechanischen Tastatur zusagt, schlage ich wieder zu... Solange muss ich jetzt wohl noch mit dieser Tastatur auskommen.

    Vielen Dank für die Analyse des Codes!
    Ja das passiert wenn man sich Beispiele kopiert, die anpasst und dann einige Rückstände im Code bleiben. (Sonderlich sorgfältig war ich allerdings nicht)


    Ich habe das meiste verbessert (Der SourceCode oben im ersten Post wurde angepasst, damit die Besucher gleich den aktuellsten Code sehen ohne alles lesen zu müssen). Bis auf den Array der bei Beginn eingelesen werden sollte, ist soweit alles eingebaut.



    Nun habe ich allerdings eine Frage. Ich habe jetzt nichtmehr mit Hotkeyset geblockt, sondern indem ich "Return 1" zurückgebe. Damit werden allerdings alle Tasten (kurzzeitig) geblockt (Fällt zwar nicht auf, weil eh Niemand so schnell tippt, aber trotzdem eher doof). Welchen Wert muss ich zurückgeben, damit wirklich nur die entsprechende Taste (kurzzeitig) geblockt wird, die auch gedrückt wurde?
    Danke

    Die Tasten werden über HotKeySet geblockt, die Abfrage über HotKey wäre aber zu kritisch, da die Taste ja erstmal geblockt werden würde. Ich müsste sie also dann mit Hilfe von Send durch AutoIt nachträglich senden. Wie viel Delay wäre das wohl? Wer möchte als Gamer Delay auf seinen Tasten haben?


    Deswegen wird die gedrückte Taste über einen Hook abgefragt (was wohl die schnellste Methode ist) und auch noch gesendet, anschließend geblockt für xx Millisekunden.

    Guten Tag,


    Ich habe eine mechanische Tastatur (MX-Brown Switches von Cherry), die immer wieder mehrfache Tastenanschläge erzeugt (bei bestimmten Tasten), obwohl die Taste nur einmal gedrückt wurde. Damit bin ich nicht der Einzige, solche Probleme sind häufiger anzutreffen (insbesondere bei mechanischen Tastaturen).


    Um dieses Problem zu lösen und ohne eine neue Tastatur erwerben zu müssen, habe ich eine Software programmiert, die eine softwareseitige "entprellung" ermöglicht.



    Hier der Sourcecode, ist eine Menge WinApi Kram, steigt wahrschenlich niemand durch :D (kommentiert habe ich da eher nicht)


    (Verbesserungen wurden in den Code eingebaut 03-08-2016 - 02:39)



    Dazu benötigt man eine "Settings.ini"


    Code
    [Delay]
    Time_ms=6
    [Used_Chars]
    Chars=uioln
    [Autostart]
    Enable=yes


    Erklärung der Settings:
    [Time] - Time_ms = Entprell Zeit in Millisekunden
    [Used_Chars] - Chars = Buchstaben die entprellt werden sollen
    [Autostart] - Enable = yes für Autostart, irgendetwas anderes für keinen Autostart



    Viel Spaß damit, falls ihr damit etwas anfangen könnt


    MfG

    Wenn ein Signal zu stark verstärkt wird (Was bei starken Boosts diverser Frequenzen der Fall sein sollte), dann führt das zur Überstuerung (Clipping) am Ausgang.


    http://de.wikipedia.org/wiki/%…uern_(Signalverarbeitung)


    Sinusförmige Signale werden dann oben abgeschnitten und rechteckig. Wenn du eine Frequenz besonders stark anheben willst, ohne Clipping zu erzeugen, dann musst du den Gesamtpegel vorher reduzieren, damit du mehr "Headroom" nach oben hast.

    Keine Ahnung welche AutoIt Version du hast bzw. mit welchen Include Files du arbeitest, aber bei mir gibt es nichtmal den Befehl " _Excel_Open()"


    Davon steht auch nichts in der Help Datei.


    Es gibt bei mir "_ExcelBookOpen" oder "_ExcelBookAttach"



    Edit: Habe mal nachgeschaut. Anscheinend wurde im letzten Jahr enorm an den Excel-Funktionen gearbeitet. Meine Version war schon 1 Jahr alt. Jetzt habe ich ein Problem, weil alle meine Funktionen auf die alten UDFs abgestimmt waren.


    Edit2: Ich habe auch mal versucht den Code kompatibel zu bekommen, aber mein 550 Zeilen Code lässt sich da nicht so einfach anpassen. Besonders Befehle wie "_ExcelReadCell" und "_ExcelWriteCell" wurden herausgenommen und durch die Range-Befehle ersetzt. Leider ist der Befehlaufbau nicht gleich, so das ein Replace ausgeschlossen ist. Man müsste da wieder Gehirngrips reinstecken und alles durchgehen...


    Mir wäre es dann lieber das Projekt mit den alten Includes fertigzustellen. Falls es auch da eine Möglichkeit gibt die Zeilen zu bekommen, würde ich diese Variante vorziehen.


    Zu sagen ist noch, dass ich das Excel Dokument über "_ExcelBookAttach" in neuer Version "_Excel_BookAttach" anbinde,

    Hallo,


    Ich möchte herausfinden wie viele Zeilen in einer bestimmten Spalte (A) gefüllt sind.


    Ich habe bereits 2 Methoden ausfindig machen können, die leider viel Rechenaufwand benötigen.
    "_ExcelReadArray" und "_ExcelReadCell"


    Damit dauert es leider sehr lange eine über 1000 zeilige Spalte einzulesen und mit einer Schleife zu prüfen wann die Zeile(n) leer ist / sind. Zumal eine leere Zeile kein eindeutiger Indiz für das Ende eines Excel-Dokuments ist. Es kann durchaus passieren dass mal 1-2 Abstandszeilen vorkommen.


    Ich brauche eine Funktion die mir sagt wo die letzte beschriebene Zeile im Excel Dokument der Spalte A ist. Also wäre ein rückwärts Einlesen sicher kein schlechter Ansatz.


    Aber wenn ich mit ExcelReadCell bei z.B. 10000 Rückwärts anfange und checke wann die erste Zeile geschrieben ist, kann das schonml 5 Minuten dauern.


    Hat da jemand eine Idee wie man an die Sache herangeht?


    Danke

    Hallo,


    Ich möchte dem Nutzer meines Programmes durch entsprechende Töne (die durchaus 3-5 Sekunden dauern können), signalisieren wie der Programm-Status ist bzw. ob Fehler aufgetreten sind (Es handelt sich um ein Barcode-Scanner Tool, bei dem der Anwender in der Regel nicht auf dem Bildschirm schaut).


    Mit:



    SoundPlay
    und


    _SoundPlay


    Läuft der Code leider solange nicht weiter, wie das .wav File abgespielt wird. Gibt es eine Möglichkeit, dies zu umgehen aus der eigenen Anwendung heraus? Weitere .exe Dateien über shell auszuführen, die einen Sound abspielen, wäre nur eine Notfall-Lösung. Am liebsten wäre mir eine einzelne Anwendung.


    Danke!

    Kompliziert ist da Garnichts bisher.
    Verrate uns doch mal um was für einen Chat es sich genau handelt. Zeilen aus einer Log-File auszulesen ist nicht unbedingt die beste Wahl, ebenso ist es nicht die beste Wahl über "Sendkeys" Tasten zu senden, die den Anwender stören. Da gibt's wesentlich bessere Wege.
    Wenn es sich um eine normale Windows Anwendung handelt, kann man vermutlich alles über die "Handles" auslesen sowie direkt in entsprechende Textfelder schreiben. Bei einigen Chat-Protokollen kann man wie BufFix bereits schon sagte, die Pakete (Nachrichten) direkt abfangen und senden, das wäre ebenfalls eine bessere Variante, als den Umweg über ein Logfile.


    Gerade als Anfänger ist die Herangehensweise oft verkehrt bzw. ist der Weg nicht sonderlich effizient gewählt.

    Das geht z.B. so:



    #include <MsgBoxConstants.au3>
    #include <WinAPI.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>


    $Form1_1 = GUICreate("URL Open", 450, 300, 191, 90)
    $Edit1 = GUICtrlCreateEdit("Hallo das ist ein text http://www.google.de" & @CRLF & "Test bla http://www.AutoIt.de", 104, 104, 241, 89)
    GUISetState(@SW_SHOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")


    Opt("GUIOnEventMode", 1)


    Global $aSelold


    While 1


    If _WinAPI_GetFocus() = GUICtrlGetHandle($Edit1) Then
    $aSel = _GUICtrlEdit_GetSel($Edit1)


    if $aSel[0] <> $aSelold then
    ;msgbox(0,"Pos",$aSel[0]) - Nur fuers Programmieren um den Bereich der URL herauszufinden
    switch $aSel[0]
    case 22 to 36
    msgbox(0,"","Google wurde geklickt")
    ;Hier URL Oeffnen
    case 47 to 60
    msgbox(0,"","AutoIt wurde geklickt")
    ;Hier URL Oeffnen
    EndSwitch
    endif


    $aSelold = $aSel[0]


    endif
    sleep(100)
    WEnd


    Func Close()
    Exit
    EndFunc

    Also, wenn es verboten ist mit AutoIt direkt den YouTube Titel auszulesen, dann musst du wohl die extra von YouTube zur Verfügung gestellte API nehmen, die unter anderem das selbe ermöglicht.


    https://developers.google.com/youtube/getting_started



    Damit zu arbeiten wird wohl erlaubt sein, ansonsten würde YouTube diese nicht extra für Anwendungsprogrammierer bzw. Webprogrammierer zur Verfügung stellen.
    Ich denke ein paar Video-Titel auszulesen ist keine Straftat, wenn YouTube diese Funktion extra in einer API anbietet.

    beruhigt euch erstmal.


    Ich hoffe ich mache mich nicht strafbar, mit meiner Hilfe :D



    Also mit dieser Methode, würdest du deine Ergebnisse rückwärts ausgeben... Wenn das hilft.


    Oder geht es generell darum, Rechenaufwand zu sparen und somit die vorne im Source stehenden Ergebnisse garnicht erst einzulesen?.


    #include <Array.au3>
    #include <String.au3>


    Example()


    Func Example()
    Local $aArray = _StringBetween("[18][20][3][5][500][60]", "[", "]")
    local $i
    for $i = UBound($aArray) - 1 to 0 step -1
    msgbox(0,"Gefundene Ergebniss nach der Reihe Rueckwaerts", $aArray[$i])
    next


    EndFunc

    So kann das unteranderem funktionieren:




    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>


    _Example()


    Func _Example()
    Local $sFile = FileOpenDialog("Select an image", "", "Images (*.bmp;*.png;*.jpg;*.gif;*.tif)")
    If @error Or Not FileExists($sFile) Then Return


    If Not _GDIPlus_Startup() Then
    MsgBox($MB_SYSTEMMODAL, "ERROR", "GDIPlus.dll v1.1 not available")
    Return
    EndIf
    Local $hImage = _GDIPlus_ImageLoadFromFile($sFile)
    Local $iWidth = 600
    Local $iHeight = _GDIPlus_ImageGetHeight($hImage) * 600 / _GDIPlus_ImageGetWidth($hImage)
    Local $hGui = GUICreate("GDI+ v1.1", $iWidth, $iHeight)
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    GUISetState(@SW_SHOW)


    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, 0, 0, $iWidth, $iHeight)


    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    EndFunc ;==>_Example

    Ich kann dir folgenden Beispiel-Code zum auslesen des Prozessspeichers anbieten, welcher so auch 100% funktioniert:



    #include <WinAPI.au3>
    #include <MsgBoxConstants.au3>
    #include <Constants.au3>


    Global $Process="Winamp.exe";Ersetze mit deinem Prozess
    Global $Pointer = 0x004B5E54; Ersetze mit deiner Adresse
    $handle=_WinAPI_OpenProcess(BitOR($PROCESS_VM_OPERATION,$PROCESS_VM_READ),False,ProcessExists($Process))
    $s=DllStructCreate("int")
    Local $read
    _WinAPI_ReadProcessMemory($handle,$Pointer,DllStructGetPtr($s),DllStructGetSize($s),$read)
    MsgBox(0,"Gelesener Wert",DllStructGetData($s,1))


    Aktuell ließt die Funktion die aktuelle Trackzeit aus Winamp aus.


    Wenn du den Prozess in GTA und die Speicher-Adresse in einen deiner Werte änderst, kannst du das ganze auch mal mit GTA testen. Sollte dann immernoch 0 zurückkommen, ist vermutlich wirklich etwas verkehrt.


    Wenn Spiele gepatched werden, kann es durchaus zu einer Verschiebung bestimmte Speicheradressen kommen.



    Was natürlich auch noch sein kann: Manche Anwendungen benötigen besondere Rechte zum Auslesen des Prozesspeichers. Um daran zu kommen muss man sich erst die Rechte freischalten mit ein paar Api Befehlen...
    Dazu habe ich keinen AutoIt Code, in VB6 ging das so: