Das Erkennen des Touchscreens erfolgt in AutoHotkey unter Windows 8

6

Ich verwende ein Dell Venue 8 Pro mit 32-Bit-Version von Windows 8.1. Ich versuche, mit AutoHotkey bestimmte Bildschirmbereiche bestimmten Tasten auf der Tastatur zuzuordnen, um über den Touchscreen ein bestimmtes bereits vorhandenes Flipperspiel steuern zu können. Mein Ziel ist es, A zu drücken, wenn die linke Hälfte des Bildschirms berührt wird, und B für die rechte Hälfte zu drücken (die Bildschirmauflösung ist auf 640 x 480 eingestellt). Dies ist das Skript, das ich geschrieben habe:

~LButton::
MouseGetPos, x,y
if (x > 0 and x < 320)
    Send {A}
if (x > 320 and x < 640)
    Send {B}
return

Es scheint jedoch überhaupt nicht zu sein, dass Touchscreen-Drucke erkannt werden. Es scheint, als ob sich das Drücken auf dem Touchscreen von normalen Mausklicks unterscheidet. Wie kann ich AutoHotkey verwenden, um ein Drücken auf einem Touchscreen zu erkennen, oder gibt es eine andere Lösung für das, was ich versuche?

Bearbeiten: Ich fange an zu glauben, dass AutoHotkey nicht in der Lage ist, das zu tun, was ich hier erreichen möchte. Wenn jemand eine Alternative findet, die das gleiche Ergebnis erzielt (drückt Tastaturtasten, wenn Bildschirmbereiche berührt werden), werde ich die Antwort akzeptieren.

bdr9
quelle
Das Problem ist, dass beim Berühren des Bildschirms ein Klick auf die aktuelle Cursorposition statt auf die Stelle registriert wird, auf die Sie getippt haben. Überprüfen Sie Ihre Zeigergerätetreiber, um eine Einstellung zu finden, die steuert, welchen Modus sie für das Tippen verwendet. Suchen Sie nach etwas wie „Tippen zum Klicken“, „Absolute / Relative Position“, „Maus- / Bildschirmmodus“ usw. Sie können die verschiedenen Modi testen, um sicherzustellen, dass Sie den richtigen haben, indem Sie MSPaint öffnen und auf festlegen Wählen Sie die dickste Pinselgröße, und tippen Sie dann auf verschiedene Stellen, um zu prüfen, ob sie überall dort punktiert sind, wo Sie sie berührt haben, oder nur an derselben Stelle. Klicken Sie beispielsweise mit der Maus, ohne sich zu bewegen.
Synetech
Probieren Sie auch die AHKHID-Bibliothek aus , die erweiterte Eingaben bereitstellen soll, und dieses Skript, mit dem genau das erreicht werden soll, was Sie sich erhoffen.
Synetech

Antworten:

3

Ich bin nicht sicher, in welcher Sprache Sie das Spiel programmieren ... Normalerweise unterstützen [ Javascript ], [ jquery ] und [ Webkit ] Touch-Ereignisse. Aber wenn das nicht hilft, können Sie dieses Skript ausprobieren und es nach Ihren Wünschen ändern:

Zitat des Erstellers des Skripts: [ link ]

Ich habe ein MID (Mobile Internet Device) namens Viliv S5. Es hat eine Auflösung von 1024 x 768 für 4,8-Zoll-Bildschirm. Das bedeutet, dass Symbole zu klein sind, um mit den Fingern zu klicken. Also habe ich ein Skript entwickelt, um Touchscreen (absolute Koordinate) in Touchpad (relative Koordinate) umzuwandeln.

Dieses Skript hakt die Maus runter, versteckt echte Cursor und zeigt gefälschte Cursor an. Wenn der Finger losgelassen wird, wird der Mauszeiger an die gewünschte Position bewegt und der Cursor wird angezeigt.

Verwendungszweck:

  1. Dekomprimieren Sie die Zip-Datei im entsprechenden Ordner.

  2. Öffnen Sie die Datei Touchpad.ini und setzen Sie den Cursor auf "Geschwindigkeit" (0 ~ 1).

  3. Ziehen Sie den Bildschirm und der Cursor bewegt sich.

  4. Tippen Sie auf eine beliebige Stelle auf dem Bildschirm und klicken Sie wird gesendet.

  5. Doppelklick ist Doppelklick.

  6. "Strg + u" pausiert / startet das Skript neu.

  7. Klicken Sie auf das Taskleistensymbol und beenden Sie das Skript.

Machen:

  1. Implementieren Sie das Ziehen.

  2. Manchmal springen Cursor zu meiner Fingerposition.

  3. Manchmal werden Cursor ausgeblendet.

Laden Sie die Zip-Datei hier herunter: http://cafe.naver.com/flowpad/34 (Ich habe den obigen Link aktualisiert.)

SKRIPT:

; AutoHotkey Version: 1.x
; Language:       English
; Platform:       Win9x/NT
; Author:         Seung-Young Noh <[email protected]>


#SingleInstance force
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

Menu, Tray, NoStandard
Menu, Tray, Tip, Touchpad V0.7
Menu, Tray, Icon, 1.ico, , 1
Menu, Tray, add, Exit, MenuQuit
Menu, Tray, Default, Exit
Menu, Tray, Click, 1

#Persistent
CoordMode, Mouse, Screen

IniRead, Cursor_speed, Touchpad.ini, main, Cursor_speed
if not Cursor_speed
    Cursor_speed := 0.7

SystemCursor("I")
SetTimer, WatchCursor, 50
return

MenuQuit:
    ExitApp
return

LWin & u::
    Suspend
    SetTimer, WatchCursor, Off
    SetTimer, MovePointer, Off
    SystemCursor(1)

    if (A_IsSuspended = 1) {
        Menu, Tray, Icon, 2.ico
    } else {
        Menu, Tray, Icon, 1.ico
    }
return  

WatchCursor:
    MouseGetPos, x, y
    GetKeyState, state, LButton
    FromX := FromX1
    FromY := FromY1
    FromX1 := x
    FromY1 := y
return

StartWatchCursor:
    SetTimer, WatchCursor, On
return

LButton::
    SystemCursor(0)
    SetTimer, WatchCursor, Off

    ToX := FromX
    ToY := FromY

    SplashImage, C:\Windows\Cursors\arrow_r.cur, x%ToX% y%ToY% B

    MouseGetPos, thisX, thisY
    SetTimer, MovePointer, 100
return

LButton Up::
    SetTimer, MovePointer, Off

    MouseMove, %ToX%, %ToY%, 0
    SplashImage, Off
    if ((A_TimeSincePriorHotkey < 100) and (abs((ToX - FromY) * (ToY - FromY)) < 200)) {
        Click
    }
    FromX := ToX
    FromY := ToY

    SystemCursor(1)

    SetTimer, StartWatchCursor, -1000
return

MovePointer:
    MouseGetPos, x, y
    ToX := ToX + Round(Cursor_speed * (x - thisX))
    ToY := ToY + Round(Cursor_speed * (y - thisY))
    if (ToX <= 0) {
        ToX = 0
    } else if (ToX >= A_ScreenWidth) {
        ToX := A_ScreenWidth
    }
    if (ToY <= 0) {
        ToY = 0
    } else if (ToY >= A_ScreenHeight) {
        ToY := A_ScreenHeight
    }

    if (((x - thisX) != 0) or ((y - thisY) !=0)) {
        SplashImage, C:\Windows\Cursors\arrow_r.cur, x%ToX% y%ToY% B
    }
    thisX := x
    thisY := y
return

;; The script below is another's. I can't remember whose it is.

SystemCursor(OnOff=1)   ; INIT = "I","Init"; OFF = 0,"Off"; TOGGLE = -1,"T","Toggle"; ON = others
{
    static AndMask, XorMask, $, h_cursor
        ,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13 ; system cursors
        , b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13   ; blank cursors
        , h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13   ; handles of default cursors
    if (OnOff = "Init" or OnOff = "I" or $ = "")       ; init when requested or at first call
    {
        $ = h                                          ; active default cursors
        VarSetCapacity( h_cursor,4444, 1 )
        VarSetCapacity( AndMask, 32*4, 0xFF )
        VarSetCapacity( XorMask, 32*4, 0 )
        system_cursors = 32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650
        StringSplit c, system_cursors, `,
        Loop %c0%
        {
            h_cursor   := DllCall( "LoadCursor", "uint",0, "uint",c%A_Index% )
            h%A_Index% := DllCall( "CopyImage",  "uint",h_cursor, "uint",2, "int",0, "int",0, "uint",0 )
            b%A_Index% := DllCall("CreateCursor","uint",0, "int",0, "int",0
                , "int",32, "int",32, "uint",&AndMask, "uint",&XorMask )
        }
    }
    if (OnOff = 0 or OnOff = "Off" or $ = "h" and (OnOff < 0 or OnOff = "Toggle" or OnOff = "T"))
        $ = b  ; use blank cursors
    else
        $ = h  ; use the saved cursors

    Loop %c0%
    {
        h_cursor := DllCall( "CopyImage", "uint",%$%%A_Index%, "uint",2, "int",0, "int",0, "uint",0 )
        DllCall( "SetSystemCursor", "uint",h_cursor, "uint",c%A_Index% )
    }
}

Hoffe das hilft ... Ich habe das Skript nicht getestet.

mk117
quelle
Vielen Dank, dass Sie mich auf dieses Skript aufmerksam gemacht haben. Ich muss es versuchen und sehen, ob ich es an meine Bedürfnisse anpassen kann. Das Flipperspiel ist übrigens kein Spiel, das ich programmiere. Dies ist der Grund, warum ich AutoHotkey verwenden muss. Das Spiel existiert bereits und ich versuche nur, es über den Touchscreen zu steuern.
BDR9
@ bdr9: Du hast das Kopfgeld vergeben, aber du solltest auch die Antwort akzeptieren. Wenn ich das richtig verstehe, behandelt dieses Skript nicht nur MouseGetPos, sondern auch Schaltflächenereignisse. Vielleicht ist dies das, was Ihr Problem gelöst hat. Ich frage mich, warum diese Mausereignisse nicht von Window Spy angezeigt wurden, wie ich vorgeschlagen habe.
Harrymc
2

Im AutoHotkey Wish List-Thread " Multi-Finger-Touch-Gesten" sagt der Hauptentwickler von AutoHotkey, Lexikos, am 30. September 2013 Folgendes:

Ich habe kein Windows-Tablet oder -Touchscreen oder habe kein Interesse daran, eines zu erwerben oder Touch-Eingabefunktionen zu entwickeln.

Abgesehen davon sendet Windows 8 meines Wissens Mausereignisse für Touchscreens, die jedoch so lange verzögert werden, bis Windows feststellt, dass es sich nicht um Gesten handelt.

Dieser Stapelüberlauf-Thread sagt:

Ich habe festgestellt, dass die Touchscreen-Oberfläche von Windows 7 über diese Funktion verfügt, mit der Maus-Down-Ereignisse zurückgehalten werden. Aufgrund der Geste "Tippen und Halten mit der rechten Maustaste" sendet Windows 7 der Anwendung erst dann ein Ereignis, wenn:

  • der Benutzer "berührt" (hebt den Finger von einer Berührung, an welcher Stelle sowohl nach unten als auch nach oben gesendet wird)
  • bewegt den Finger (an diesem Punkt wird das Klicken zum Ziehen)
  • oder die Geste des Rechtsklick-Kreises läuft ab (nach ca. 5-6 Sekunden)

Ihre Anwendung muss mit diesen Einschränkungen arbeiten, insbesondere mit MouseGetPos, das erst funktioniert, wenn der Benutzer seinen Finger auf eine Weise hebt oder bewegt, die offensichtlich (für Windows) keine Geste ist.

In der Tat funktioniert MouseGetPos auf einem Touchscreen möglicherweise nicht sehr gut.

Harrymc
quelle
Danke für die Antwort. Kennen Sie ein anderes Programm, das AutoHotkey ähnelt und Touchscreen-Ereignisse (Finger nach unten, Finger nach oben usw.) unabhängig von Mausereignissen erkennt?
bdr9
Dies würde die Anbindung an eine neue Windows-API erfordern. AHK ist nicht interessiert, aber das bedeutet nicht, dass man keine DLL erstellen kann, um von ihr aufgerufen zu werden, aber mir ist nicht bekannt, dass jemand dies für AHK oder dessen alternative AutoIt getan hat. Die einfachste Lösung wäre, die Benutzeroberfläche so zu ändern, dass Klicks anstelle von Verschiebungen verwendet werden, da dies immer funktioniert.
Harrymc
Was genau meinst du damit, dass du die Benutzeroberfläche so änderst, dass Klicks und keine Bewegungen verwendet werden? Ist dies eine Einstellung in Windows 8? Wenn ja, wo finde ich es?
bdr9
Ich wollte Ihr Design so ändern, dass der Benutzer die Bildschirmbereiche berührt / darauf klickt, anstatt seinen Finger zu bewegen. Sie können Ereignisse mit gedrückter oder gedrückter Maustaste abfangen.
Harrymc
1
Das versuche ich schon. AutoHotkey erkennt einzelne Berührungen nicht als Mausereignisse. Ich bewege meinen Finger nicht, tippe nur auf den Bildschirm.
bdr9
0

Sie können dazu eine Drittanbieter-App verwenden.

TouchMe Gesture Studio kann Ihnen möglicherweise helfen, indem Sie Tastenkombinationen Touchscreen-Gesten zuweisen.

Schau dir diesen Ahk-Forum-Beitrag an

YasharBahman
quelle