Detectar pressionamentos da tela de toque no AutoHotkey no Windows 8

6

Estou usando um Dell Venue 8 Pro executando o Windows 8.1 de 32 bits. Eu estou tentando usar AutoHotkey para mapear certas regiões da tela para certos botões no teclado, a fim de poder usar a tela sensível ao toque para controlar um certo jogo de pinball que já existe. Meu objetivo é pressionar A se a metade esquerda da tela for tocada e pressionar B para a metade direita (a resolução da tela está definida para 640x480). Este é o script que eu escrevi:

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

No entanto, ele não parece estar reconhecendo as impressoras touchscreen. Parece que as impressoras touch screen são diferentes dos cliques normais do mouse. Como posso usar o AutoHotkey para reconhecer uma impressora sensível ao toque ou há outra solução para o que estou tentando fazer?

Edit: Estou começando a pensar que o AutoHotkey não é capaz de fazer o que eu quero realizar aqui. Se alguém puder encontrar uma forma alternativa que produza esse mesmo resultado (pressiona os botões do teclado quando as regiões da tela são tocadas), aceitarei a resposta.

    
por bdr9 19.03.2014 / 20:27

3 respostas

3

Não sei em que idioma você está codificando o jogo ... Normalmente, [ javascript ], [ jquery ] e [ Webkit ] suporta eventos de toque. Mas se isso não ajudar, você pode tentar este script e alterá-lo conforme sua conveniência:

Cite o criador do script: [ link ]

I have an MID (Mobile Internet Device) called Viliv S5. It has resolution of 1024 x 768 for 4.8 inch screen. That means icons are to small to click with fingers. So I developed a script to convert touchscreen (absolute coordinate) to touchpad (relative coordinate).

This script hooks mouse down, hiding real cursors and showing fake cursors. When the finger is released, the mouse pointer is moved to the intended position and reveal the cursor.

Uso:

  1. Descompacte o arquivo zip na pasta relevante.

  2. Abra o Touchpad.ini e defina o cursor "speed" (0 ~ 1).

  3. Arraste a tela e o cursor se move.

  4. Toque em qualquer lugar da tela e clique em enviar.

  5. Toque duplo é duplo clique.

  6. "Ctrl + u" pausa / reinicia o script.

  7. Clique no ícone da bandeja e saia do script.

Para fazer:

  1. Implemente arrastando.

  2. Às vezes, os cursores pulam para a posição do meu dedo.

  3. Às vezes, os cursores estão ocultos.

Faça o download do arquivo zip aqui: link (Atualizei o link acima).

SCRIPT:

; 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% )
    }
}

Espero que isso ajude ... Eu não testei o script.

    
por 26.03.2014 / 19:42
2

No encadeamento da Lista de desejos do AutoHotkey gestos de toque com vários dedos , o principal desenvolvedor do AutoHotkey, lexikos, diz isso em 30 de setembro de 2013:

I don't have a Windows tablet or touch screen, or any interest in getting one or developing touch input features.

Além disso, até onde eu sei, o Windows 8 envia eventos de mouse para telas sensíveis ao toque, embora eles sejam atrasados até que o Windows decida que eles não são gestos.

Este thread do stackoverflow diz:

I've noticed that Windows 7's touch screen interface has this thing where it will hold back mousedown events. Due to the "tap-and-hold right click" gesture, Windows 7 won't actually send the application a mouse down event until:

  • the user "touch ups" (raise their finger from a touch, at which point both down and up are sent)
  • moves their finger (at which point the click becomes a drag)
  • or the right click circle gesture times out (after about 5-6 seconds)

Seu aplicativo precisará trabalhar com essas limitações, especialmente as de MouseGetPos não funciona até que o usuário levante ou mova o dedo de uma forma que é obviamente (para o Windows) não um gesto.

Com efeito, o MouseGetPos pode não funcionar muito bem em uma tela sensível ao toque.

    
por 22.03.2014 / 09:02
0

Você pode usar um aplicativo de terceiros para fazer isso.

O TouchMe Gesture Studio pode ajudar você a atribuir gestos de touchscreen a teclas de atalho.

confira este post no fórum

    
por 08.04.2015 / 10:47