diff --git a/DS4Windows/Program.cs b/DS4Windows/Program.cs index a957344..39416bb 100644 --- a/DS4Windows/Program.cs +++ b/DS4Windows/Program.cs @@ -2,19 +2,16 @@ using System.Windows.Forms; using System.Threading; using System.Runtime.InteropServices; -using System.Diagnostics; +using Process = System.Diagnostics.Process; using System.ComponentModel; using System.Globalization; +using System.Runtime; using Microsoft.Win32.TaskScheduler; namespace DS4Windows { static class Program { - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool SetForegroundWindow(IntPtr hWnd); - // Add "global\" in front of the EventName, then only one instance is allowed on the // whole system, including other users. But the application can not be brought // into view, of course. @@ -24,6 +21,7 @@ namespace DS4Windows public static ControlService rootHub; private static Thread testThread; private static Thread controlThread; + private static DS4Form ds4form; /// /// The main entry point for the application. @@ -71,27 +69,26 @@ namespace DS4Windows } } - System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.LowLatency; + GCSettings.LatencyMode = GCLatencyMode.LowLatency; try { - Process.GetCurrentProcess().PriorityClass = - ProcessPriorityClass.High; - } - catch - { - // Ignore problems raising the priority. + Process.GetCurrentProcess().PriorityClass = + System.Diagnostics.ProcessPriorityClass.High; } + catch { } // Ignore problems raising the priority. try { // another instance is already running if OpenExsting succeeds. - threadComEvent = EventWaitHandle.OpenExisting(SingleAppComEventName); + threadComEvent = EventWaitHandle.OpenExisting(SingleAppComEventName, + System.Security.AccessControl.EventWaitHandleRights.Synchronize | + System.Security.AccessControl.EventWaitHandleRights.Modify); threadComEvent.Set(); // signal the other instance. threadComEvent.Close(); return; // return immediatly. } - catch { /* don't care about errors */ } + catch { /* don't care about errors */ } // Create the Event handle threadComEvent = new EventWaitHandle(false, EventResetMode.ManualReset, SingleAppComEventName); @@ -107,7 +104,8 @@ namespace DS4Windows rootHub.CreateHidGuardKey(); //rootHub = new ControlService(); Application.EnableVisualStyles(); - Application.Run(new DS4Form(args)); + ds4form = new DS4Form(args); + Application.Run(ds4form); rootHub.removeHidGuardKey(); //mutex.ReleaseMutex(); //} @@ -131,29 +129,26 @@ namespace DS4Windows private static void CreateTempWorkerThread() { - testThread = new Thread(singleAppComThread_DoWork); + testThread = new Thread(SingleAppComThread_DoWork); testThread.Priority = ThreadPriority.Lowest; testThread.IsBackground = true; testThread.Start(); } - private static void singleAppComThread_DoWork() + private static void SingleAppComThread_DoWork() { - WaitHandle[] waitHandles = new WaitHandle[] { threadComEvent }; - while (!exitComThread) { - // check every second for a signal. - if (WaitHandle.WaitAny(waitHandles) == 0) + // check for a signal. + if (threadComEvent.WaitOne()) { threadComEvent.Reset(); // The user tried to start another instance. We can't allow that, // so bring the other instance back into view and enable that one. // That form is created in another thread, so we need some thread sync magic. - if (!exitComThread && Application.OpenForms.Count > 0) + if (!exitComThread) { - Form mainForm = Application.OpenForms[0]; - mainForm?.Invoke(new SetFormVisableDelegate(ThreadFormVisable), mainForm); + ds4form?.Invoke(new SetFormVisableDelegate(ThreadFormVisable), ds4form); } } } @@ -167,24 +162,13 @@ namespace DS4Windows private delegate void SetFormVisableDelegate(Form frm); static private void ThreadFormVisable(Form frm) { - if (frm != null) + if (frm is DS4Form) { - if (frm is DS4Form) - { - // display the form and bring to foreground. - frm.WindowState = FormWindowState.Normal; - frm.Focus(); - } - else - { - WinProgs wp = (WinProgs)frm; - wp.form.mAllowVisible = true; - wp.ShowMainWindow(); - SetForegroundWindow(wp.form.Handle); - } + // display the form and bring to foreground. + frm.WindowState = FormWindowState.Normal; + frm.Focus(); + frm.Activate(); } - - SetForegroundWindow(frm.Handle); } } } \ No newline at end of file diff --git a/README.md b/README.md index 83ef60c..2e4f4f8 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,12 @@ You can find the latest and older versions [here](https://github.com/Ryochan7/DS UdpServer builds for using Gyro motion controls in Cemu. -http://ryochan7.xyz/ds4windows/test/DS4Windows_1.4.123_UdpServer_x64.zip -http://ryochan7.xyz/ds4windows/test/DS4Windows_1.4.123_ViGEm_UdpServer_x64.zip +http://ryochan7.xyz/ds4windows/test/DS4Windows_1.5.0_UdpServer_x64.zip +http://ryochan7.xyz/ds4windows/test/DS4Windows_1.5.0_ViGEm_UdpServer_x64.zip ViGEm build. -http://ryochan7.xyz/ds4windows/test/DS4Windows_1.4.123_ViGEm_x64.zip +http://ryochan7.xyz/ds4windows/test/DS4Windows_1.5.0_ViGEm_x64.zip This project is a fork of the work of Jays2Kings. You can find the old project website at [ds4windows.com](http://ds4windows.com).