Ejemplo n.º 1
0
        internal unsafe static bool TryRegisterPS4Controller(IntPtr handle, out Ps4Controller controller)
        {
            controller = null;
            var devName = GetRawInputDeviceName(handle);

            char[] arr       = new char[126];
            string product   = "";
            var    devHandle = CreateFileW(devName, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);

            fixed(char *p = arr)
            {
                if (HidD_GetProductString(devHandle, p, 126))
                {
                    product = new string(p);
                    var index = product.IndexOf('\0');
                    if (index != -1)
                    {
                        product.Remove(index);
                    }
                }
            }

            if (product == "Wireless Controller")
            {
                var preparsedData = IntPtr.Zero;
                if (!HidD_GetPreparsedData(devHandle, ref preparsedData))
                {
                    devHandle.Close();
                    return(false);
                }

                HidPCaps caps = new HidPCaps();
                if (HidP_GetCaps(preparsedData, ref caps) != NTStatus.Success)
                {
                    HidD_FreePreparsedData(ref preparsedData);
                    devHandle.Close();
                    return(false);
                }

                if (caps.InputReportByteLength == 64)
                {
                    HidD_FreePreparsedData(ref preparsedData);
                    controller = new Ps4Controller(devHandle, caps);
                    return(true);
                }
                else
                {
                    devHandle.Close();
                    return(false);
                }
            }
            devHandle.Close();
            return(false);
        }
Ejemplo n.º 2
0
        internal static void OnControllerConnected(Ps4Controller controller)
        {
            if (controller.Index == _controllers.Count)
            {
                _controllers.Add(controller);
            }
            else
            {
                _controllers[controller.Index] = controller;
            }

            ++Ps4Count;

            Ps4Connected?.Invoke(null, controller.Index);
        }