用Python模拟windows8中的触摸事件

2024-04-25 12:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pythonforwindows8编写一种驱动程序。我将通过串行接收触摸坐标,然后我想使用它使它看起来好像有人触摸了屏幕上的那些坐标(模拟触摸)。在

我的第一个问题是:

windows8中的触摸事件与鼠标点击该区域不同吗?(我知道他们为触控活动修改了所有的东西,但不确定这其中包含了什么——可能是为了让触摸屏更友好而使用效果区的东西?)在

其次:

如果是这样的话,有没有一个python库来模拟一个坐标上的“触摸”而不是“点击”?在

更新:

使用ctypes和评论中链接的页面,我创建了以下内容:

from ctypes import *

#Constants

#For touchMask
TOUCH_MASK_NONE=          0x00000000 #Default
TOUCH_MASK_CONTACTAREA=   0x00000001
TOUCH_MASK_ORIENTATION=   0x00000002
TOUCH_MASK_PRESSURE=      0x00000004
TOUCH_MASK_ALL=           0x00000007

#For touchFlag
TOUCH_FLAG_NONE=          0x00000000

#For pointerType
PT_POINTER=               0x00000001#All
PT_TOUCH=                 0x00000002
PT_PEN=                   0x00000003
PT_MOUSE=                 0x00000004

#For pointerFlags
POINTER_FLAG_NONE=        0x00000000#Default
POINTER_FLAG_NEW=         0x00000001
POINTER_FLAG_INRANGE=     0x00000002
POINTER_FLAG_INCONTACT=   0x00000004
POINTER_FLAG_FIRSTBUTTON= 0x00000010
POINTER_FLAG_SECONDBUTTON=0x00000020
POINTER_FLAG_THIRDBUTTON= 0x00000040
POINTER_FLAG_FOURTHBUTTON=0x00000080
POINTER_FLAG_FIFTHBUTTON= 0x00000100
POINTER_FLAG_PRIMARY=     0x00002000
POINTER_FLAG_CONFIDENCE=  0x00004000
POINTER_FLAG_CANCELED=    0x00008000
POINTER_FLAG_DOWN=        0x00010000
POINTER_FLAG_UPDATE=      0x00020000
POINTER_FLAG_UP=          0x00040000
POINTER_FLAG_WHEEL=       0x00080000
POINTER_FLAG_HWHEEL=      0x00100000
POINTER_FLAG_CAPTURECHANGED=0x00200000


#Structs Needed

class POINT(Structure):
    _fields_=[("x", c_long),
              ("y", c_long)]

class POINTER_INFO(Structure):
    _fields_=[("pointerType",c_int32),
              ("pointerId",c_uint32),
              ("frameId",c_uint32),
              ("pointerFlags",c_int),
              ("sourceDevice",c_uint32),
              ("hwndTarget",c_uint32),
              ("ptPixelLocation",POINT),
              ("ptHimetricLocation",POINT),
              ("ptPixelLocationRaw",POINT),
              ("ptHimetricLocationRaw",POINT),
              ("dwTime",c_uint32),
              ("historyCount",c_uint32),
              ("inputData",c_int32),
              ("dwKeyStates",c_uint32),
              ("PerformanceCount",c_uint64),
              ("ButtonChangeType",c_int)
              ]

class RECT(Structure):
    _fields_=[("left",c_long),
              ("top",c_long),
              ("right",c_long),
              ("bottom",c_long)]

class POINTER_TOUCH_INFO(Structure):
    _fields_=[("pointerInfo",POINTER_INFO),
              ("touchFlags",c_int),
              ("touchMask",c_int),
              ("rcContact", RECT),
              ("rcContactRaw",RECT),
              ("orientation", c_uint32),
              ("pressure", c_uint32)]



#Initialize Touch Injection

pointerInfo=POINTER_INFO(pointerType=PT_TOUCH,
                         pointerId=0,
                         ptPixelLocation=POINT(950,540))

touchInfo=POINTER_TOUCH_INFO(pointerInfo=pointerInfo,
                             touchFlags=TOUCH_FLAG_NONE,
                             touchMask=TOUCH_MASK_ALL,
                             rcContact=RECT(pointerInfo.ptPixelLocation.x-5,
                                  pointerInfo.ptPixelLocation.y-5,
                                  pointerInfo.ptPixelLocation.x+5,
                                  pointerInfo.ptPixelLocation.y+5),
                             orientation=90,
                             pressure=32000)


if (windll.user32.InitializeTouchInjection(1,1) != 0):
    print "Initialized Touch Injection"
#Press Down
touchInfo.pointerInfo.pointerFlags=(POINTER_FLAG_DOWN|
                                    POINTER_FLAG_INRANGE|
                                    POINTER_FLAG_INCONTACT)
if (windll.user32.InjectTouchInput(1, byref(touchInfo))==0):
    print "Failed with Error: "+ FormatError()

else:
    print "Touch Down Succeeded!"

#Pull Up
touchInfo.pointerInfo.pointerFlags=POINTER_FLAG_UP
if (windll.user32.InjectTouchInput(1,byref(touchInfo))==0):
    print "Failed with Error: "+FormatError()

else:
    print "Pull Up Succeeded!"

每次输入参数出错时都失败。 我查了所有的参考资料,找不到一个似乎不正确的类型。有人看到明显的东西吗?在

谢谢


Tags: infononeptformasklongpointflag
1条回答
网友
1楼 · 发布于 2024-04-25 12:23:19

多亏了丹毒和Xyroid,我才得以让它发挥作用。感谢你忍受我对C-type/Windows的无知。下面是将触摸仿真打包为函数的最终脚本(以及额外的常量):

^{1}$

相关问题 更多 >