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); }
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); }