diff --git a/ArduinoAgent/ArduinoAgent.csproj b/ArduinoAgent/ArduinoAgent.csproj
index b60e669..2bb3723 100644
--- a/ArduinoAgent/ArduinoAgent.csproj
+++ b/ArduinoAgent/ArduinoAgent.csproj
@@ -10,9 +10,9 @@
https://github.com/hawkeye-stan/msfs-popout-panel-manager
MSFSPopoutPanelManager.ArduinoAgent
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
Embedded
Debug;Release;DebugTouchPanel;ReleaseTouchPanel
diff --git a/Orchestration/Orchestration.csproj b/Orchestration/Orchestration.csproj
index f5bb39d..930bc35 100644
--- a/Orchestration/Orchestration.csproj
+++ b/Orchestration/Orchestration.csproj
@@ -10,9 +10,9 @@
https://github.com/hawkeye-stan/msfs-popout-panel-manager
MSFSPopoutPanelManager.Orchestration
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
Embedded
Debug;Release;DebugTouchPanel;ReleaseTouchPanel
diff --git a/Orchestration/PanelConfigurationOrchestrator.cs b/Orchestration/PanelConfigurationOrchestrator.cs
index 2f405f5..33445aa 100644
--- a/Orchestration/PanelConfigurationOrchestrator.cs
+++ b/Orchestration/PanelConfigurationOrchestrator.cs
@@ -4,6 +4,8 @@ using MSFSPopoutPanelManager.WindowsAgent;
using System;
using System.Drawing;
using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
namespace MSFSPopoutPanelManager.Orchestration
{
@@ -14,6 +16,11 @@ namespace MSFSPopoutPanelManager.Orchestration
private Rectangle _lastWindowRectangle;
private IntPtr _panelHandleDisableRefresh = IntPtr.Zero;
+ private uint _prevWinEvent = PInvokeConstant.EVENT_SYSTEM_CAPTUREEND;
+ private int _winEventClickLock = 0;
+ private object _hookLock = new object();
+ private bool _isHookMouseDown = false;
+
public PanelConfigurationOrchestrator()
{
_winEvent = new PInvoke.WinEventProc(EventCallback);
@@ -199,7 +206,10 @@ namespace MSFSPopoutPanelManager.Orchestration
return;
// Setup panel config event hooks
- _winEventHook = PInvoke.SetWinEventHook(PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND, PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE, IntPtr.Zero, _winEvent, 0, 0, PInvokeConstant.WINEVENT_OUTOFCONTEXT);
+ if (!ActiveProfile.RealSimGearGTN750Gen1Override)
+ _winEventHook = PInvoke.SetWinEventHook(PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND, PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE, IntPtr.Zero, _winEvent, 0, 0, PInvokeConstant.WINEVENT_OUTOFCONTEXT);
+ else
+ _winEventHook = PInvoke.SetWinEventHook(PInvokeConstant.EVENT_SYSTEM_CAPTURESTART, PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE, IntPtr.Zero, _winEvent, 0, 0, PInvokeConstant.WINEVENT_OUTOFCONTEXT);
}
private void UnhookWinEvent()
@@ -214,6 +224,8 @@ namespace MSFSPopoutPanelManager.Orchestration
{
case PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE:
case PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND:
+ case PInvokeConstant.EVENT_SYSTEM_CAPTURESTART:
+ case PInvokeConstant.EVENT_SYSTEM_CAPTUREEND:
// check by priority to speed up comparing of escaping constraints
if (hwnd == IntPtr.Zero || idObject != 0 || hWinEventHook != _winEventHook || !AllowEdit)
return;
@@ -253,6 +265,17 @@ namespace MSFSPopoutPanelManager.Orchestration
PInvoke.ShowWindow(hwnd, PInvokeConstant.SW_RESTORE);
}
break;
+ case PInvokeConstant.EVENT_SYSTEM_CAPTURESTART:
+ if (!panelConfig.HasTouchableEvent || _prevWinEvent == PInvokeConstant.EVENT_SYSTEM_CAPTURESTART)
+ break;
+
+ HandleTouchDownEvent(panelConfig);
+ break;
+ case PInvokeConstant.EVENT_SYSTEM_CAPTUREEND:
+ if (!panelConfig.TouchEnabled || _prevWinEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE)
+ break;
+ HandleTouchUpEvent(panelConfig);
+ break;
}
}
else
@@ -301,6 +324,75 @@ namespace MSFSPopoutPanelManager.Orchestration
case PInvokeConstant.EVENT_SYSTEM_MOVESIZEEND:
ProfileData.WriteProfiles();
break;
+ case PInvokeConstant.EVENT_SYSTEM_CAPTURESTART:
+ if (!panelConfig.HasTouchableEvent || _prevWinEvent == PInvokeConstant.EVENT_SYSTEM_CAPTURESTART)
+ break;
+
+ HandleTouchDownEvent(panelConfig);
+ break;
+ case PInvokeConstant.EVENT_SYSTEM_CAPTUREEND:
+ if (!panelConfig.TouchEnabled || _prevWinEvent == PInvokeConstant.EVENT_OBJECT_LOCATIONCHANGE)
+ break;
+ HandleTouchUpEvent(panelConfig);
+ break;
+ }
+ }
+ }
+
+ private void HandleTouchDownEvent(PanelConfig panelConfig)
+ {
+ if (!_isHookMouseDown)
+ {
+ lock (_hookLock)
+ {
+ Point point;
+ PInvoke.GetCursorPos(out point);
+
+ // Disable left clicking if user is touching the title bar area
+ if (point.Y - panelConfig.Top > (panelConfig.HideTitlebar ? 5 : 31))
+ _isHookMouseDown = true;
+ }
+ }
+ }
+
+
+ private void HandleTouchUpEvent(PanelConfig panelConfig)
+ {
+ if (_isHookMouseDown)
+ {
+ Thread.Sleep(AppSettingData.AppSetting.TouchScreenSettings.TouchDownUpDelay);
+
+ lock (_hookLock)
+ {
+ _isHookMouseDown = false;
+
+ Point point;
+ PInvoke.GetCursorPos(out point);
+
+ // Disable left clicking if user is touching the title bar area
+ if (point.Y - panelConfig.Top > (panelConfig.HideTitlebar ? 5 : 31))
+ {
+ var prevWinEventClickLock = ++_winEventClickLock;
+
+ if (prevWinEventClickLock == _winEventClickLock && AppSettingData.AppSetting.TouchScreenSettings.RefocusGameWindow)
+ {
+ Task.Run(() => RefocusMsfs(panelConfig.PanelHandle, prevWinEventClickLock));
+ }
+ }
+ }
+ }
+ }
+
+ private void RefocusMsfs(IntPtr panelConfigHandle, int prevWinEventClickLock)
+ {
+ Thread.Sleep(AppSettingData.AppSetting.TouchScreenSettings.RefocusGameWindowDelay);
+
+ if (prevWinEventClickLock == _winEventClickLock)
+ {
+ if (!_isHookMouseDown)
+ {
+ var rectangle = WindowActionManager.GetWindowRect(panelConfigHandle);
+ PInvoke.SetCursorPos(rectangle.X - 5, rectangle.Y + 5);
}
}
}
diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj
index fd5dae5..14973d7 100644
--- a/Shared/Shared.csproj
+++ b/Shared/Shared.csproj
@@ -11,9 +11,9 @@
https://github.com/hawkeye-stan/msfs-popout-panel-manager
MSFSPopoutPanelManager.Shared
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
Embedded
Debug;Release;DebugTouchPanel;ReleaseTouchPanel
diff --git a/SimconnectAgent/SimconnectAgent.csproj b/SimconnectAgent/SimconnectAgent.csproj
index 37e5933..bc3b447 100644
--- a/SimconnectAgent/SimconnectAgent.csproj
+++ b/SimconnectAgent/SimconnectAgent.csproj
@@ -11,9 +11,9 @@
https://github.com/hawkeye-stan/msfs-popout-panel-manager
MSFSPopoutPanelManager.SimConnectAgent
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
Embedded
Debug;Release;DebugTouchPanel;ReleaseTouchPanel
diff --git a/TouchPanelAgent/TouchPanelAgent.csproj b/TouchPanelAgent/TouchPanelAgent.csproj
index 9ab27bf..a4d8841 100644
--- a/TouchPanelAgent/TouchPanelAgent.csproj
+++ b/TouchPanelAgent/TouchPanelAgent.csproj
@@ -11,9 +11,9 @@
https://github.com/hawkeye-stan/msfs-popout-panel-manager
MSFSPopoutPanelManager.TouchPanelAgent
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
Embedded
Debug;Release;DebugTouchPanel;ReleaseTouchPanel
diff --git a/UserDataAgent/AppSetting.cs b/UserDataAgent/AppSetting.cs
index b4e4f6c..5ee52d4 100644
--- a/UserDataAgent/AppSetting.cs
+++ b/UserDataAgent/AppSetting.cs
@@ -140,6 +140,7 @@ namespace MSFSPopoutPanelManager.UserDataAgent
TouchDownUpDelay = 0;
RefocusGameWindow = true;
RefocusGameWindowDelay = 500;
+ RealSimGearGTN750Gen1Override = false;
}
public int TouchDownUpDelay { get; set; }
@@ -147,6 +148,8 @@ namespace MSFSPopoutPanelManager.UserDataAgent
public bool RefocusGameWindow { get; set; }
public int RefocusGameWindowDelay { get; set; }
+
+ public bool RealSimGearGTN750Gen1Override { get; set; }
}
public class TouchPanelSettings : ObservableObject
diff --git a/UserDataAgent/Profile.cs b/UserDataAgent/Profile.cs
index e8ba3a3..158984e 100644
--- a/UserDataAgent/Profile.cs
+++ b/UserDataAgent/Profile.cs
@@ -16,6 +16,7 @@ namespace MSFSPopoutPanelManager.UserDataAgent
IsLocked = false;
PowerOnRequiredForColdStart = false;
IncludeInGamePanels = false;
+ RealSimGearGTN750Gen1Override = false;
MsfsGameWindowConfig = new MsfsGameWindowConfig();
@@ -46,6 +47,8 @@ namespace MSFSPopoutPanelManager.UserDataAgent
public bool IncludeInGamePanels { get; set; }
+ public bool RealSimGearGTN750Gen1Override { get; set; }
+
public MsfsGameWindowConfig MsfsGameWindowConfig { get; set; }
[JsonIgnore]
diff --git a/UserDataAgent/UserDataAgent.csproj b/UserDataAgent/UserDataAgent.csproj
index d856481..9509917 100644
--- a/UserDataAgent/UserDataAgent.csproj
+++ b/UserDataAgent/UserDataAgent.csproj
@@ -10,9 +10,9 @@
https://github.com/hawkeye-stan/msfs-popout-panel-manager
MSFSPopoutPanelManager.UserDataAgent
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
Embedded
Debug;Release;DebugTouchPanel;ReleaseTouchPanel
diff --git a/WebServer/WebServer.csproj b/WebServer/WebServer.csproj
index a5d31c9..11ce67e 100644
--- a/WebServer/WebServer.csproj
+++ b/WebServer/WebServer.csproj
@@ -11,9 +11,9 @@
https://github.com/hawkeye-stan/msfs-popout-panel-manager
MSFSPopoutPanelManager.WebServer
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
Embedded
Debug;Release;DebugTouchPanel;ReleaseTouchPanel
diff --git a/WindowsAgent/PInvoke.cs b/WindowsAgent/PInvoke.cs
index f4a471e..ef65c6e 100644
--- a/WindowsAgent/PInvoke.cs
+++ b/WindowsAgent/PInvoke.cs
@@ -16,6 +16,9 @@ namespace MSFSPopoutPanelManager.WindowsAgent
public const int SW_MINIMIZE = 6;
public const int SW_RESTORE = 9;
+ public const uint EVENT_SYSTEM_CAPTURESTART = 0x0008;
+ public const uint EVENT_SYSTEM_CAPTUREEND = 0x0009;
+ public const uint EVENT_SYSTEM_MOVESIZESTART = 0x000A;
public const uint EVENT_SYSTEM_MOVESIZEEND = 0x000B;
public const uint EVENT_OBJECT_LOCATIONCHANGE = 0x800B;
diff --git a/WindowsAgent/TouchEventManager.cs b/WindowsAgent/TouchEventManager.cs
index 8f97e78..172ea08 100644
--- a/WindowsAgent/TouchEventManager.cs
+++ b/WindowsAgent/TouchEventManager.cs
@@ -15,10 +15,9 @@ namespace MSFSPopoutPanelManager.WindowsAgent
private static PInvoke.WindowsHookExProc callbackDelegate = HookCallBack;
private static bool _isTouchDown;
private static int _mouseMoveCount;
- private static bool _isMouseMoveBlock = false;
private static object _mouseTouchLock = new object();
private static bool _isDragged = false;
- private static bool _refocused = true;
+ private static int _refocusedTaskIndex = 0;
private const int PANEL_MENUBAR_HEIGHT = 31;
private const uint TOUCH_FLAG = 0xFF515700;
@@ -37,18 +36,30 @@ namespace MSFSPopoutPanelManager.WindowsAgent
public static void Hook()
{
+ // If using RSG GT750 Gen 1, disable touch support
+ if (ActiveProfile != null && ActiveProfile.RealSimGearGTN750Gen1Override)
+ return;
+
_simulatorProcess = WindowProcessManager.GetSimulatorProcess();
Process curProcess = Process.GetCurrentProcess();
ProcessModule curModule = curProcess.MainModule;
var hookWindowPtr = PInvoke.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
+
_hHook = PInvoke.SetWindowsHookEx(HookType.WH_MOUSE_LL, callbackDelegate, hookWindowPtr, 0);
}
public static void UnHook()
{
- PInvoke.UnhookWindowsHookEx(_hHook);
- _hHook = IntPtr.Zero;
+ // If using RSG GT750 Gen 1, disable touch support
+ if (ActiveProfile != null && ActiveProfile.RealSimGearGTN750Gen1Override)
+ return;
+
+ if (_hHook != IntPtr.Zero)
+ {
+ PInvoke.UnhookWindowsHookEx(_hHook);
+ _hHook = IntPtr.Zero;
+ }
}
public static bool IsHooked { get { return _hHook != IntPtr.Zero; } }
@@ -58,7 +69,6 @@ namespace MSFSPopoutPanelManager.WindowsAgent
if (code != 0)
return PInvoke.CallNextHookEx(_hHook, code, wParam, lParam);
-
var info = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
var extraInfo = (uint)info.dwExtraInfo;
var isTouched = (extraInfo & TOUCH_FLAG) == TOUCH_FLAG;
@@ -104,9 +114,7 @@ namespace MSFSPopoutPanelManager.WindowsAgent
case WM_LBUTTONDOWN:
if (!_isTouchDown)
{
- _refocused = false;
_isTouchDown = true;
- _isMouseMoveBlock = true;
lock (_mouseTouchLock)
{
@@ -121,7 +129,6 @@ namespace MSFSPopoutPanelManager.WindowsAgent
Thread.Sleep(AppSetting.TouchScreenSettings.TouchDownUpDelay + 25);
PInvoke.mouse_event(MOUSEEVENTF_LEFTDOWN, info.pt.X, info.pt.Y, 0, 0);
Thread.Sleep(AppSetting.TouchScreenSettings.TouchDownUpDelay + 50);
- _isMouseMoveBlock = false;
_isTouchDown = false;
});
}
@@ -142,11 +149,25 @@ namespace MSFSPopoutPanelManager.WindowsAgent
_isDragged = false;
}
_mouseMoveCount = 0;
- RefocusMsfsGameWindow(panelConfig);
+
+ // Refocus game window
+ if (AppSetting.TouchScreenSettings.RefocusGameWindow && !panelConfig.DisableGameRefocus)
+ {
+ _refocusedTaskIndex++;
+ var currentRefocusIndex = _refocusedTaskIndex;
+
+ Thread.Sleep(AppSetting.TouchScreenSettings.RefocusGameWindowDelay);
+
+ if (currentRefocusIndex == _refocusedTaskIndex)
+ {
+ var rectangle = WindowActionManager.GetWindowRect(panelConfig.PanelHandle);
+ PInvoke.SetCursorPos(rectangle.X - 5, rectangle.Y + 5);
+ }
+ }
});
return 1;
case WM_MOUSEMOVE:
- if (_isMouseMoveBlock)
+ if (_isTouchDown)
return 1;
_mouseMoveCount++;
@@ -156,19 +177,5 @@ namespace MSFSPopoutPanelManager.WindowsAgent
return PInvoke.CallNextHookEx(_hHook, code, wParam, lParam);
}
-
- private static void RefocusMsfsGameWindow(PanelConfig panelConfig)
- {
- Thread.Sleep(AppSetting.TouchScreenSettings.RefocusGameWindowDelay);
-
- if (!_refocused && !_isTouchDown && AppSetting.TouchScreenSettings.RefocusGameWindow && !panelConfig.DisableGameRefocus)
- {
- _refocused = true;
- var rectangle = WindowActionManager.GetWindowRect(_simulatorProcess.Handle);
- var clientRectangle = WindowActionManager.GetClientRect(_simulatorProcess.Handle);
-
- PInvoke.SetCursorPos(rectangle.X + clientRectangle.Width / 2, rectangle.Y + clientRectangle.Height / 2);
- }
- }
}
}
diff --git a/WindowsAgent/WindowsAgent.csproj b/WindowsAgent/WindowsAgent.csproj
index b7e2765..6e9b07a 100644
--- a/WindowsAgent/WindowsAgent.csproj
+++ b/WindowsAgent/WindowsAgent.csproj
@@ -11,9 +11,9 @@
https://github.com/hawkeye-stan/msfs-popout-panel-manager
MSFSPopoutPanelManager.WindowsAgent
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
Embedded
Debug;Release;DebugTouchPanel;ReleaseTouchPanel
diff --git a/WpfApp/PreferencesDialog.xaml b/WpfApp/PreferencesDialog.xaml
index d5d091e..5d0ca6d 100644
--- a/WpfApp/PreferencesDialog.xaml
+++ b/WpfApp/PreferencesDialog.xaml
@@ -262,17 +262,22 @@
-
- Refocus Game Window
-
-
- Automactically set focus back to game window after a period of inactivity on touch enabled panel. This will give your flight control back when using pop out panel.
-
-
-
- Amount of time in milliseconds to wait for touch inactivity before input focus goes back to game window.
+
+ Refocus Game Window
+
+
+ Automactically set focus back to game window after a period of inactivity on touch enabled panel. This will give your flight control back when using pop out panel.
+
+
+
+ Amount of time in milliseconds to wait for touch inactivity before input focus goes back to game window.
+
+
+
+ Use custom refocus logic for RealSimGear GTN750 Gen1.
+
+
-
Touch Down Touch Up Delay
diff --git a/WpfApp/UserControlPanelSelection.xaml b/WpfApp/UserControlPanelSelection.xaml
index 9d8cb38..6103cad 100644
--- a/WpfApp/UserControlPanelSelection.xaml
+++ b/WpfApp/UserControlPanelSelection.xaml
@@ -78,6 +78,9 @@
+
+
+
diff --git a/WpfApp/WpfApp.csproj b/WpfApp/WpfApp.csproj
index e693b54..a334842 100644
--- a/WpfApp/WpfApp.csproj
+++ b/WpfApp/WpfApp.csproj
@@ -14,9 +14,9 @@
MSFSPopoutPanelManager.WpfApp
logo.ico
x64
- 3.4.3.0911
- 3.4.3.0911
- 3.4.3.0911
+ 3.4.4.0925
+ 3.4.4.0925
+ 3.4.4.0925
win-x64
embedded
en