mirror of
https://github.com/cemu-project/DS4Windows.git
synced 2024-11-26 19:14:20 +01:00
Merge branch 'jay' into udpserver
This commit is contained in:
commit
7a45df4a30
@ -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;
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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).
|
||||
|
Loading…
Reference in New Issue
Block a user