InjectTouchInput Windows 8的C#不工作(返回false) [英] InjectTouchInput Windows 8 C# not working (returns false)

查看:858
本文介绍了InjectTouchInput Windows 8的C#不工作(返回false)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近刚开始与InjectTouchInput的Windows 8消费者预览播放。我已经走了一圈又一圈的圆圈试图让混账东西来工作,但似乎仍不能得到它的实际互动。我工作在C#和此刻的我只创造了两个文本框和调用下面的功能在这些坐标在屏幕上触摸按键与X和Y坐标的Metro界面。这是去了解这个干什么?

I've just recently started playing with the InjectTouchInput for Windows 8 Consumer Preview. I've gone round and round in circles trying to get the darn thing to work but just can't seem to get it to actually interact. I'm working in c# and at the moment am only creating a metro interface with x and y coordinates in two text boxes and buttons which call the functions below to touch on the screen at those coordinates. Is this the right way to go about doing this?

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我在网上找到解除。我可以InitializeTouchInject罚款,其注入位这就是返回false,我不知道为什么。

Almost all of that I've tried to lift from the InjectTouchInput API I found online. I can InitializeTouchInject fine, its the Inject bit thats returning false and I have no idea why.

推荐答案

我继续创造一些在C ++中的自定义功能,根据微软提供的,然后就去使用相同的定义很多像以前一样,但没有放屁有关的所有类型检查,指针和论点是之前引起头痛进口的成C#的样品。

I went ahead and create some custom functions in c++ based on the sample Microsoft provided and then went and imported that into C# using alot of the same definitions as before but without farting about with all the type checking, pointers and arguments that were causing headaches before.

这是我使用的DLL文件是TouchInjectionDriver.dll并可以在这里找到:

The DLL file that I've used is TouchInjectionDriver.dll and can be found here:

http://www.mediafire.com/file/do2h6m04omjweb3/TouchInjectionDriver.zip

下面是我用来实现它的C#代码

Below is the C# code I used to implement it.

        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, POINTER_FLAGS pointerFlags, 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, 0, 0, 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, y, POINTER_INPUT_TYPE.PT_TOUCH, 3200, 0, 0, x - 4, x + 4, y - 4, y + 4, POINTER_FLAGS.POINTER_FLAG_UP, TOUCH_MASK.TOUCH_MASK_CONTACTAREA | TOUCH_MASK.TOUCH_MASK_ORIENTATION | TOUCH_MASK.TOUCH_MASK_PRESSURE);
            }
            else
            {
                MessageBeep(0);
            }
        }

这篇关于InjectTouchInput Windows 8的C#不工作(返回false)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆