Detecção de 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 touch screen. 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 AutoHotkey não é capaz de fazer o que eu quero realizar aqui. Se alguém puder encontrar uma maneira alternativa que produza esse mesmo resultado (pressiona os botões do teclado quando as regiões da tela são tocadas), aceitarei a resposta.


O problema é que quando você toca na tela, ele registra um clique na posição atual do cursor em vez de no local em que você tocou. Verifique seus drivers de dispositivo de ponteiro para encontrar uma configuração que controle o modo que ele usa para os toques. Procure algo nos moldes de “toque para clicar”, “posição absoluta / relativa”, “modo mouse / tela”, etc. Você pode testar os diferentes modos para ter certeza de ter o caminho certo abrindo o MSPaint, configurando-o para o tamanho de pincel mais gordo, depois toque em locais diferentes para ver se ele está onde quer que você tocou ou apenas no mesmo local, como clicar o mouse sem se mover.
Synetech

Além disso, tente a biblioteca AHKHID, que serve para fornecer entrada avançada, e este script que tenta realizar exatamente o que você está esperando fazer.
Synetech

Respostas:


3

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

Cite do criador do script: [ link ]

Eu tenho um MID (Mobile Internet Device) chamado Viliv S5. Tem resolução de 1024 x 768 para tela de 4,8 polegadas. Isso significa que os ícones são pequenos para clicar com os dedos. Então eu desenvolvi um script para converter touchscreen (coordenada absoluta) para touchpad (coordenada relativa).

Este script conecta o mouse, ocultando cursores reais e mostrando cursores falsos. Quando o dedo é solto, o ponteiro do mouse é movido para a posição desejada e revela o cursor.

Uso:

  1. Descompacte o arquivo zip na pasta relevante.

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

  3. Arraste a tela e o cursor se move.

  4. Toque em qualquer lugar na tela e clique em é enviado.

  5. Duplo toque é duplo clique.

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

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

Façam:

  1. Implemente arrastando.

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

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

Baixe o arquivo zip aqui: http://cafe.naver.com/flowpad/34 (atualizei o link acima).

ROTEIRO:

; AutoHotkey Version: 1.x
; Language:       English
; Platform:       Win9x/NT
; Author:         Seung-Young Noh <noh@socoop.net>


#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.


Obrigado por trazer este script para minha atenção. Eu vou ter que tentar e ver se posso modificá-lo para atender às minhas necessidades. O jogo de pinball não é um jogo que eu estou codificando, a propósito. Esta é a razão pela qual eu preciso usar o AutoHotkey. O jogo já existe e eu estou apenas tentando usar a tela sensível ao toque para controlá-lo.
bdr9

@ bdr9: Você concedeu a recompensa, mas você também deve aceitar a resposta. Se bem entendi, este script lida não apenas com MouseGetPos, mas também com eventos de botão, então talvez isso resolva seu problema. Eu me pergunto por que esses eventos de mouse não foram mostrados pelo Window Spy como eu sugeri.
harrymc

2

Nos gestos de toque de vários dedos do AutoHotkey Wish List , o principal desenvolvedor do AutoHotkey, lexikos, diz isso em 30 de setembro de 2013:

Eu não tenho um tablet ou tela de toque do Windows, ou qualquer interesse em obter um ou desenvolver recursos de entrada de toque.

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

Este encadeamento stackoverflow diz:

Eu notei que a interface de tela de toque do Windows 7 tem essa coisa onde vai segurar eventos de mousedown. Devido ao gesto de "clicar e manter pressionado o botão direito", o Windows 7 não enviará realmente o aplicativo um evento de mouse para baixo até:

  • o usuário "touch ups" (levante o dedo a partir de um toque, no ponto em que ambos para baixo e para cima são enviados)
  • move o dedo (ponto em que o clique se torna um arrasto)
  • ou o gesto de círculo de clique direito expira (após cerca de 5 a 6 segundos)

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

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


Obrigado pela resposta. Você conhece algum outro programa semelhante ao AutoHotkey que possa detectar eventos da tela sensível ao toque (dedo para baixo, dedo para cima, etc) independentemente dos eventos do mouse?
bdr9

Isso exigiria a interface com uma nova API do Windows. O AHK não está interessado, mas isso não significa que não se possa criar uma DLL para ser chamada a partir dele, mas não estou ciente de que alguém tenha feito isso para o AHK ou seu AutoIt alternativo. A solução mais simples seria alterar a interface do usuário para usar cliques em vez de movimentos, pois isso sempre funcionará.
harrymc

O que exatamente você quer dizer ao alterar a interface para usar cliques em vez de movimentos? Esta é uma configuração no Windows 8? Se sim, onde posso encontrá-lo?
bdr9

Eu quis dizer mudar o seu design, para que o usuário toque / clique nas áreas da tela, em vez de mover o dedo ao redor. Você pode interceptar eventos de mouse ou para baixo.
harrymc

1
Isso é o que eu já estou tentando fazer. O AutoHotkey não está reconhecendo toques únicos como eventos de mouse. Eu não estou movendo meu dedo, apenas tocando na tela.
bdr9

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.