InjectTouchInput Windows 8 C#无法正常工作(返回false)
发布时间:2020-12-14 05:28:33 所属栏目:Windows 来源:网络整理
导读:我刚刚开始使用InjectTouchInput for Windows 8 Consumer Preview.我已经四处乱逛,试图让这个糟糕的事情发挥作用,但似乎无法让它实际上互动.我正在使用c#,目前只在两个文本框和按钮中创建一个带有x和y坐标的metro接口,这些按钮调用下面的函数在这些坐标处触
我刚刚开始使用InjectTouchInput for
Windows 8 Consumer Preview.我已经四处乱逛,试图让这个糟糕的事情发挥作用,但似乎无法让它实际上互动.我正在使用c#,目前只在两个文本框和按钮中创建一个带有x和y坐标的metro接口,这些按钮调用下面的函数在这些坐标处触摸屏幕.这是正确的方法吗?
protected unsafe class TouchDriver { public struct POINTER_TOUCH_INFO { public POINTER_INFO pointerInfo; // An embedded POINTER_INFO header structure. public TOUCH_FLAGS touchFlags; // Currently none. public Rect rcContact; // Pointer contact area in pixel screen coordinates. By default,if the device does not report a contact area,this field defaults to a 0-by-0 rectangle centered around the pointer location. public UInt32 orientation; // A pointer orientation,with a value between 0 and 359,where 0 indicates a touch pointer aligned with the x-axis and pointing from left to right; increasing values indicate degrees of rotation in the clockwise direction. // This field defaults to 0 if the device does not report orientation. public UInt32 pressure; // Pointer pressure normalized in a range of 0 to 256. // This field defaults to 128 if the device does not report pressure. // Question: Can this go from 0 to 1024 to match pen pressure? } public enum TOUCH_FLAGS { TOUCH_FLAGS_NONE = 0x00000000 } public POINTER_TOUCH_INFO create_pointer_touch_info(POINTER_INFO pointerInfo,TOUCH_FLAGS touchFlags,RECT rcContact,UInt32 orientation,UInt32 pressure) { POINTER_TOUCH_INFO mi = new POINTER_TOUCH_INFO(); mi.pointerInfo = pointerInfo; mi.touchFlags = touchFlags; mi.rcContact = rcContact; mi.orientation = orientation; mi.pressure = pressure; return mi; } public enum POINTER_INPUT_TYPE { PT_POINTER = 0x00000001,PT_TOUCH = 0x00000002,PT_PEN = 0x00000003,PT_MOUSE = 0x00000004 } public struct POINTER_INFO { public POINTER_INPUT_TYPE pointerType; public UInt32 pointerId; public UInt32 frameId; public HANDLE sourceDevice; public HWND hwndTarget; public Point ptPixelLocation; public Point ptHimetricLocation; public Point ptPixelLocationPredicted; public Point ptHimetricLocationPredicted; public POINTER_FLAGS pointerFlags; public DWORD dwTime; public UInt32 historyCount; // public UInt32 inputData; public DWORD dwKeyStates; public ULONGLONG Reserved; } public POINTER_INFO create_pointer_info( POINTER_INPUT_TYPE pointerType,UInt32 pointerId,UInt32 frameId,HANDLE sourceDevice,HWND hwndTarget,Point ptPixelLocation,Point ptHimetricLocation,Point ptPixelLocationPredicted,Point ptHimetricLocationPredicted,POINTER_FLAGS pointerFlags,DWORD dwTime,UInt32 historyCount,// UInt32 inputData,DWORD dwKeyStates,ULONGLONG Reserved) { POINTER_INFO mi = new POINTER_INFO(); mi.pointerType = pointerType; mi.pointerId = pointerId; mi.frameId = frameId; mi.sourceDevice = sourceDevice; mi.hwndTarget = hwndTarget; mi.ptPixelLocation = ptPixelLocation; mi.ptHimetricLocation = ptHimetricLocation; mi.ptPixelLocationPredicted = ptPixelLocationPredicted; mi.ptHimetricLocationPredicted = ptHimetricLocationPredicted; mi.pointerFlags = pointerFlags; mi.dwTime = dwTime; mi.historyCount = historyCount; // mi.inputData = inputData; mi.dwKeyStates = dwKeyStates; mi.Reserved = Reserved; return mi; } public enum POINTER_FLAGS { POINTER_FLAG_NONE = 0x00000000,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_OTHERBUTTON = 0x00000080,POINTER_FLAG_PRIMARY = 0x00000100,POINTER_FLAG_CONFIDENCE = 0x00000200,POINTER_FLAG_CANCELLED = 0x00000400,POINTER_FLAG_DOWN = 0x00010000,POINTER_FLAG_UPDATE = 0x00020000,POINTER_FLAG_UP = 0x00040000,POINTER_FLAG_WHEEL = 0x00080000,POINTER_FLAG_HWHEEL = 0x00100000 } [System.Runtime.InteropServices.DllImport("user32.dll",CallingConvention = CallingConvention.StdCall)] private static extern Boolean InjectTouchInput(UInt32 count,POINTER_TOUCH_INFO* pntTchInfo); [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern Boolean InitializeTouchInjection(UInt32 maxCount,DWORD dwMode); private const UInt32 MAX_TOUCH_COUNT = 256; // Can be as high as 256 private const UInt32 TOUCH_FEEDBACK_DEFAULT = 0x1; private const UInt32 TOUCH_FEEDBACK_INDIRECT = 0x2; private const UInt32 TOUCH_FEEDBACK_NONE = 0x3; public unsafe static void MouseTouch(int x,int y) { bool ret = false; ret = InitializeTouchInjection(1,TOUCH_FEEDBACK_DEFAULT); if (!ret) { throw new NotSupportedException(); } Point point = new Point(x,y); POINTER_INFO ptrInfo = new POINTER_INFO(); POINTER_TOUCH_INFO* ptrTchInfo; ptrInfo.pointerType = POINTER_INPUT_TYPE.PT_TOUCH; ptrInfo.pointerId = 1; ptrInfo.ptPixelLocation = point; ptrInfo.pointerFlags = POINTER_FLAGS.POINTER_FLAG_PRIMARY; POINTER_TOUCH_INFO ptrTchInfobase = new POINTER_TOUCH_INFO(); ptrTchInfo = &ptrTchInfobase; ptrTchInfo->pointerInfo = ptrInfo; ptrTchInfo->touchFlags = TOUCH_FLAGS.TOUCH_FLAGS_NONE; ptrTchInfo->rcContact.X = x - 2; ptrTchInfo->rcContact.Y = y - 2; ptrTchInfo->rcContact.Width = 4; ptrTchInfo->rcContact.Height = 4; ptrTchInfo->pressure = 128; ptrTchInfo->orientation = 0; ret = InjectTouchInput(1,ptrTchInfo); if (!ret) { throw new NotImplementedException(); } } } 几乎所有这些我都尝试从我在网上找到的InjectTouchInput API中解脱出来.我可以初始化InitialInTouchInject,它的Inject位返回false,我不知道为什么. 解决方法
我继续根据Microsoft提供的示例在c中创建一些自定义函数,然后使用与以前相同的定义将其导入C#但没有放弃所有导致头痛的类型检查,指针和参数.
我使用的DLL文件是TouchInjectionDriver.dll,可以在这里找到: http://www.mediafire.com/file/do2h6m04omjweb3/TouchInjectionDriver.zip 下面是我用来实现它的C#代码. public enum TOUCH_MASK : uint { TOUCH_MASK_NONE = 0x00000000,TOUCH_MASK_CONTACTAREA = 0x00000001,TOUCH_MASK_ORIENTATION = 0x00000002,TOUCH_MASK_PRESSURE = 0x00000004 } public enum POINTER_INPUT_TYPE : uint { PT_POINTER = 0x00000001,PT_TOUCH = 0x00000002,PT_PEN = 0x00000003,PT_MOUSE = 0x00000004 } public enum POINTER_FLAGS : uint { POINTER_FLAG_NONE = 0x00000000,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_OTHERBUTTON = 0x00000080,POINTER_FLAG_PRIMARY = 0x00000100,POINTER_FLAG_CONFIDENCE = 0x00000200,POINTER_FLAG_CANCELLED = 0x00000400,POINTER_FLAG_DOWN = 0x00010000,POINTER_FLAG_UPDATE = 0x00020000,POINTER_FLAG_UP = 0x00040000,POINTER_FLAG_WHEEL = 0x00080000,POINTER_FLAG_HWHEEL = 0x00100000 } public enum TOUCH_FEEDBACK : uint { TOUCH_FEEDBACK_DEFAULT = 0x1,TOUCH_FEEDBACK_INDIRECT = 0x2,TOUCH_FEEDBACK_NONE = 0x3 } [DllImport("TouchInjectionDriver.dll",CallingConvention = CallingConvention.Cdecl)] private static extern bool InjectTouch(int x,int y,POINTER_INPUT_TYPE pt_input,int pressure,int orientation,int id,int rcContactTop,int rcContactBottom,int rcContactLeft,int rcContactRight,TOUCH_MASK touchMask); [DllImport("TouchInjectionDriver.dll",CallingConvention = CallingConvention.Cdecl)] private static extern void setTouchFeedback(TOUCH_FEEDBACK fb); [DllImport("TouchInjectionDriver.dll",CallingConvention = CallingConvention.Cdecl)] private static extern void setDefaultRectSize(int size); [DllImport("TouchInjectionDriver.dll",CallingConvention = CallingConvention.Cdecl)] private static extern void setDefaultPressure(int pres); [DllImport("TouchInjectionDriver.dll",CallingConvention = CallingConvention.Cdecl)] private static extern void setDefaultOrientation(int or); [DllImport("User32.dll")] static extern Boolean MessageBeep(UInt32 beepType); public static void mouseclick(int x,int y) { bool ret; setTouchFeedback(TOUCH_FEEDBACK.TOUCH_FEEDBACK_INDIRECT); ret = InjectTouch(x,y,POINTER_INPUT_TYPE.PT_TOUCH,3200,x - 4,x + 4,y - 4,y + 4,POINTER_FLAGS.POINTER_FLAG_DOWN|POINTER_FLAGS.POINTER_FLAG_INCONTACT|POINTER_FLAGS.POINTER_FLAG_INRANGE,TOUCH_MASK.TOUCH_MASK_CONTACTAREA|TOUCH_MASK.TOUCH_MASK_ORIENTATION|TOUCH_MASK.TOUCH_MASK_PRESSURE); if (ret) { ret = InjectTouch(x,POINTER_FLAGS.POINTER_FLAG_UP,TOUCH_MASK.TOUCH_MASK_CONTACTAREA | TOUCH_MASK.TOUCH_MASK_ORIENTATION | TOUCH_MASK.TOUCH_MASK_PRESSURE); } else { MessageBeep(0); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 通过Internet在Windows上安装Linux文件系统的最佳方法?
- 从Windows上的C#迁移到Mac上的Objective-C
- 那里有没有工作和完整的1-Wire .NET库?
- [转帖]win10 .Net Runtime Optimization Service占用大量CP
- Azure WCF服务使用Azure WCF服务
- ionic2 – 在Windows Phone 10上运行Ionic 2应用程序
- windows – 禁用提示“单击继续以永久访问此文件夹”(例如,
- windows – 在没有Assembly Manifest的情况下在GAC中注册DL
- windows – 是否可以远程检查PC主板中填充了多少个DIMM插槽
- 升级到Windows 10后,Git-Bash命令提示符将无法打开