我正在尝试使用适用于 Windows 8 的 python 编写一种驱动程序。我将通过串行接收触摸坐标,然后我想用它来使它看起来好像有人在屏幕上触摸了这些坐标(模拟触摸)。
我的第一个问题是:
Windows 8 中的触摸事件与仅在该区域单击鼠标不同吗?(我知道他们为触摸事件修改了所有内容,但不确定其中涉及到什么——可能就像一个影响区域的东西,让它对触摸屏更友好?)
第二:
如果是这样,是否有一个 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!"
每次都因输入参数错误而失败。我浏览了所有参考资料,但找不到看起来不正确的类型。有没有人看到明显的东西?
谢谢