在 Windows 8 中的 AutoHotkey 中检测触摸屏按压

在 Windows 8 中的 AutoHotkey 中检测触摸屏按压

我使用的是运行 Windows 8.1 32 位的 Dell Venue 8 Pro。我尝试使用 AutoHotkey 将屏幕的某些区域映射到键盘上的某些按钮,以便能够使用触摸屏来控制已经存在的某个弹球游戏。我的目标是,如果触摸了屏幕的左半部分,则按 A,如果触摸了右半部分,则按 B(屏幕分辨率设置为 640x480)。这是我编写的脚本:

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

但是,它似乎根本无法识别触摸屏按下。似乎触摸屏按下与普通鼠标点击不同。如何使用 AutoHotkey 识别触摸屏按下,或者是否有其他解决方案可以解决我的问题?

编辑:我开始认为 AutoHotkey 无法完成我想在这里完成的任务。如果有人能找到另一种产生相同结果的方法(触摸屏幕区域时按下键盘按钮),我会接受答案。

答案1

我不确定你用什么语言编写游戏...通常,[JavaScript的],[jQuery的], 和 [Webkit] 支持触摸事件。但如果这没有帮助,那么您可以尝试此脚本并根据您的方便进行修改:

引自剧本创作者的话:[关联]

我有一台 MID(移动互联网设备),名为 Viliv S5。它的屏幕分辨率为 1024 x 768,屏幕尺寸为 4.8 英寸。这意味着图标太小,无法用手指点击。因此,我开发了一个脚本,将触摸屏(绝对坐标)转换为触摸板(相对坐标)。

此脚本将鼠标悬停,隐藏真实光标并显示假光标。当手指松开时,鼠标指针将移动到预期位置并显示光标。

用法:

  1. 将 zip 文件解压到相关文件夹中。

  2. 打开Touchpad.ini并设置光标“速度”(0〜1)。

  3. 拖动屏幕,光标就会移动。

  4. 点击屏幕上的任意位置即可发送点击。

  5. 双击即为双击。

  6. “Ctrl + u”暂停/重新启动脚本。

  7. 单击托盘图标并退出脚本。

去做:

  1. 实现拖动。

  2. 有时光标会跳到我的手指位置。

  3. 有时光标会被隐藏。

在此处下载 zip 文件: http://cafe.naver.com/flowpad/34 (我更新了上面的链接。)

脚本:

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

希望这有帮助...我还没有测试过该脚本。

答案2

在 AutoHotkey 愿望清单主题中 多指触摸手势,AutoHotkey 的主要开发者,lexikos,于 2013 年 9 月 30 日发表了以下言论:

我没有 Windows 平板电脑或触摸屏,也没有兴趣购买或开发触摸输入功能。

除此之外,据我所知,Windows 8 确实会为触摸屏发送鼠标事件,尽管这些事件会被延迟,直到 Windows 决定它们不是手势。

stackoverflow 线程说:

我注意到 Windows 7 的触摸屏界面有此功能,它会阻止鼠标按下事件。由于“点击并按住右键单击”手势,Windows 7 实际上不会向应用程序发送鼠标按下事件,直到:

  • 用户“触摸抬起”(从触摸处抬起手指,此时向下和向上都会被发送)
  • 移动手指(此时点击变为拖动)
  • 或者右键单击圆圈手势超时(大约 5-6 秒后)

您的应用程序需要克服这些限制,尤其是当用户以明显(对 Windows 而言)不是手势的方式抬起或移动手指时,MouseGetPos 才能够工作。

实际上,MouseGetPos 在触摸屏上可能无法很好地运行。

答案3

您可以使用第三方应用程序来执行此操作。

TouchMe Gesture Studio 也许能够提供帮助,它可以让您将触摸屏手势分配给热键。

查看这个 ahk 论坛帖子

相关内容