mirror of
https://github.com/kangyu-california/PersistentWindows.git
synced 2025-05-11 13:05:38 +02:00
refactor foregroundTimerCallback()
This commit is contained in:
parent
b519812fa5
commit
886182afc1
1 changed files with 134 additions and 132 deletions
|
@ -386,7 +386,7 @@ namespace PersistentWindows.Common
|
||||||
{
|
{
|
||||||
CleanupDisplayRegKeyCore(key);
|
CleanupDisplayRegKeyCore(key);
|
||||||
}
|
}
|
||||||
catch(Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Log.Error(ex.ToString());
|
Log.Error(ex.ToString());
|
||||||
}
|
}
|
||||||
|
@ -457,6 +457,138 @@ namespace PersistentWindows.Common
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void foregroundTimerCallback(object state)
|
||||||
|
{
|
||||||
|
IntPtr hwnd = foreGroundWindow;
|
||||||
|
|
||||||
|
// Occasionaly OS might bring a window to foreground upon sleep
|
||||||
|
// If the window move is initiated by OS (before sleep),
|
||||||
|
// keep restart capture timer would eventually discard these moves
|
||||||
|
// either by power suspend event handler calling CancelCaptureTimer()
|
||||||
|
// or due to capture timer handler found too many window moves
|
||||||
|
|
||||||
|
// If the window move is caused by user snapping window to screen edge,
|
||||||
|
// delay capture by a few seconds should be fine.
|
||||||
|
|
||||||
|
if (monitorApplications.ContainsKey(curDisplayKey) && monitorApplications[curDisplayKey].ContainsKey(hwnd))
|
||||||
|
{
|
||||||
|
//capture with slight delay inperceivable by user, required for full screen mode recovery
|
||||||
|
userMove = true;
|
||||||
|
StartCaptureTimer(UserMoveLatency / 2);
|
||||||
|
}
|
||||||
|
else if (fullScreenGamingWindow == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
StartCaptureTimer();
|
||||||
|
|
||||||
|
//speed up initial capture
|
||||||
|
POINT cursorPos;
|
||||||
|
User32.GetCursorPos(out cursorPos);
|
||||||
|
if (!cursorPos.Equals(initCursorPos))
|
||||||
|
userMove = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sessionActive) //disable foreground event handling
|
||||||
|
return;
|
||||||
|
if (!User32.IsWindow(hwnd))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (hwnd == fullScreenGamingWindow)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (noRestoreWindows.Contains(hwnd))
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool ctrl_key_pressed = (User32.GetKeyState(0x11) & 0x8000) != 0;
|
||||||
|
bool alt_key_pressed = (User32.GetKeyState(0x12) & 0x8000) != 0;
|
||||||
|
bool shift_key_pressed = (User32.GetKeyState(0x10) & 0x8000) != 0;
|
||||||
|
|
||||||
|
int leftClicks = leftButtonClicks;
|
||||||
|
leftButtonClicks = 0;
|
||||||
|
|
||||||
|
if (realForeGroundWindow == vacantDeskWindow)
|
||||||
|
{
|
||||||
|
if (leftClicks != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!ctrl_key_pressed && !alt_key_pressed)
|
||||||
|
{
|
||||||
|
//restore window to previous background position
|
||||||
|
SwitchForeBackground(hwnd, secondBackGround:shift_key_pressed);
|
||||||
|
}
|
||||||
|
else if (ctrl_key_pressed && !alt_key_pressed)
|
||||||
|
{
|
||||||
|
//restore to previous background zorder with current size/pos
|
||||||
|
SwitchForeBackground(hwnd, strict_dps_check: false, updateBackgroundPos: true, secondBackGround:shift_key_pressed);
|
||||||
|
}
|
||||||
|
else if (!ctrl_key_pressed && alt_key_pressed && !shift_key_pressed)
|
||||||
|
{
|
||||||
|
FgWindowToBottom();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!ctrl_key_pressed && !shift_key_pressed)
|
||||||
|
{
|
||||||
|
if (fullScreenGamingWindows.Contains(hwnd))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ActivateWindow(hwnd); //window could be active on alt-tab
|
||||||
|
if (IsFullScreen(hwnd) || IsRdpWindow(hwnd))
|
||||||
|
{
|
||||||
|
if (User32.IsWindowVisible(HotKeyWindow.commanderWnd))
|
||||||
|
{
|
||||||
|
RECT hkwinPos = new RECT();
|
||||||
|
User32.GetWindowRect(HotKeyWindow.commanderWnd, ref hkwinPos);
|
||||||
|
|
||||||
|
RECT fgwinPos = new RECT();
|
||||||
|
User32.GetWindowRect(hwnd, ref fgwinPos);
|
||||||
|
|
||||||
|
RECT intersect = new RECT();
|
||||||
|
bool overlap = User32.IntersectRect(out intersect, ref hkwinPos, ref fgwinPos);
|
||||||
|
if (overlap)
|
||||||
|
{
|
||||||
|
User32.ShowWindow(HotKeyWindow.commanderWnd, (int)ShowWindowCommands.Hide);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!alt_key_pressed)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if (pendingMoveEvents.Count > 1)
|
||||||
|
return;
|
||||||
|
*/
|
||||||
|
|
||||||
|
//restore window to previous foreground position
|
||||||
|
SwitchForeBackground(hwnd, toForeground: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (freezeCapture || !monitorApplications.ContainsKey(curDisplayKey))
|
||||||
|
return;
|
||||||
|
|
||||||
|
string proc_name = windowProcessName[hwnd];
|
||||||
|
if (!fullScreenGamingProcesses.Contains(proc_name))
|
||||||
|
{
|
||||||
|
var appWindows = CaptureWindowsOfInterest();
|
||||||
|
DateTime now = DateTime.Now;
|
||||||
|
foreach (var h in appWindows)
|
||||||
|
{
|
||||||
|
//restore windows of the same process name
|
||||||
|
if (!windowProcessName.ContainsKey(h))
|
||||||
|
continue;
|
||||||
|
if (proc_name != windowProcessName[h])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ApplicationDisplayMetrics curDisplayMetrics;
|
||||||
|
ApplicationDisplayMetrics prevDisplayMetrics;
|
||||||
|
//try to inherit from killed window database
|
||||||
|
bool isMoved = IsWindowMoved(curDisplayKey, h, 0, now, out curDisplayMetrics, out prevDisplayMetrics);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (normalSessions.Contains(curDisplayKey))
|
||||||
|
CaptureApplicationsOnCurrentDisplays(curDisplayKey, immediateCapture:true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool Start(bool auto_restore_from_db, bool auto_restore_last_capture_at_startup)
|
public bool Start(bool auto_restore_from_db, bool auto_restore_last_capture_at_startup)
|
||||||
{
|
{
|
||||||
process = Process.GetCurrentProcess();
|
process = Process.GetCurrentProcess();
|
||||||
|
@ -537,137 +669,7 @@ namespace PersistentWindows.Common
|
||||||
debugTimer.Change(2000, 2000);
|
debugTimer.Change(2000, 2000);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
foregroundTimer = new Timer(state =>
|
foregroundTimer = new Timer(foregroundTimerCallback);
|
||||||
{
|
|
||||||
IntPtr hwnd = foreGroundWindow;
|
|
||||||
|
|
||||||
// Occasionaly OS might bring a window to foreground upon sleep
|
|
||||||
// If the window move is initiated by OS (before sleep),
|
|
||||||
// keep restart capture timer would eventually discard these moves
|
|
||||||
// either by power suspend event handler calling CancelCaptureTimer()
|
|
||||||
// or due to capture timer handler found too many window moves
|
|
||||||
|
|
||||||
// If the window move is caused by user snapping window to screen edge,
|
|
||||||
// delay capture by a few seconds should be fine.
|
|
||||||
|
|
||||||
if (monitorApplications.ContainsKey(curDisplayKey) && monitorApplications[curDisplayKey].ContainsKey(hwnd))
|
|
||||||
{
|
|
||||||
//capture with slight delay inperceivable by user, required for full screen mode recovery
|
|
||||||
userMove = true;
|
|
||||||
StartCaptureTimer(UserMoveLatency / 2);
|
|
||||||
}
|
|
||||||
else if (fullScreenGamingWindow == IntPtr.Zero)
|
|
||||||
{
|
|
||||||
StartCaptureTimer();
|
|
||||||
|
|
||||||
//speed up initial capture
|
|
||||||
POINT cursorPos;
|
|
||||||
User32.GetCursorPos(out cursorPos);
|
|
||||||
if (!cursorPos.Equals(initCursorPos))
|
|
||||||
userMove = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sessionActive) //disable foreground event handling
|
|
||||||
return;
|
|
||||||
if (!User32.IsWindow(hwnd))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (hwnd == fullScreenGamingWindow)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (noRestoreWindows.Contains(hwnd))
|
|
||||||
return;
|
|
||||||
|
|
||||||
bool ctrl_key_pressed = (User32.GetKeyState(0x11) & 0x8000) != 0;
|
|
||||||
bool alt_key_pressed = (User32.GetKeyState(0x12) & 0x8000) != 0;
|
|
||||||
bool shift_key_pressed = (User32.GetKeyState(0x10) & 0x8000) != 0;
|
|
||||||
|
|
||||||
int leftClicks = leftButtonClicks;
|
|
||||||
leftButtonClicks = 0;
|
|
||||||
|
|
||||||
if (realForeGroundWindow == vacantDeskWindow)
|
|
||||||
{
|
|
||||||
if (leftClicks != 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!ctrl_key_pressed && !alt_key_pressed)
|
|
||||||
{
|
|
||||||
//restore window to previous background position
|
|
||||||
SwitchForeBackground(hwnd, secondBackGround:shift_key_pressed);
|
|
||||||
}
|
|
||||||
else if (ctrl_key_pressed && !alt_key_pressed)
|
|
||||||
{
|
|
||||||
//restore to previous background zorder with current size/pos
|
|
||||||
SwitchForeBackground(hwnd, strict_dps_check: false, updateBackgroundPos: true, secondBackGround:shift_key_pressed);
|
|
||||||
}
|
|
||||||
else if (!ctrl_key_pressed && alt_key_pressed && !shift_key_pressed)
|
|
||||||
{
|
|
||||||
FgWindowToBottom();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!ctrl_key_pressed && !shift_key_pressed)
|
|
||||||
{
|
|
||||||
if (fullScreenGamingWindows.Contains(hwnd))
|
|
||||||
return;
|
|
||||||
|
|
||||||
ActivateWindow(hwnd); //window could be active on alt-tab
|
|
||||||
if (IsFullScreen(hwnd) || IsRdpWindow(hwnd))
|
|
||||||
{
|
|
||||||
if (User32.IsWindowVisible(HotKeyWindow.commanderWnd))
|
|
||||||
{
|
|
||||||
RECT hkwinPos = new RECT();
|
|
||||||
User32.GetWindowRect(HotKeyWindow.commanderWnd, ref hkwinPos);
|
|
||||||
|
|
||||||
RECT fgwinPos = new RECT();
|
|
||||||
User32.GetWindowRect(hwnd, ref fgwinPos);
|
|
||||||
|
|
||||||
RECT intersect = new RECT();
|
|
||||||
bool overlap = User32.IntersectRect(out intersect, ref hkwinPos, ref fgwinPos);
|
|
||||||
if (overlap)
|
|
||||||
{
|
|
||||||
User32.ShowWindow(HotKeyWindow.commanderWnd, (int)ShowWindowCommands.Hide);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!alt_key_pressed)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
if (pendingMoveEvents.Count > 1)
|
|
||||||
return;
|
|
||||||
*/
|
|
||||||
|
|
||||||
//restore window to previous foreground position
|
|
||||||
SwitchForeBackground(hwnd, toForeground: true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (freezeCapture || !monitorApplications.ContainsKey(curDisplayKey))
|
|
||||||
return;
|
|
||||||
|
|
||||||
string proc_name = windowProcessName[hwnd];
|
|
||||||
if (!fullScreenGamingProcesses.Contains(proc_name))
|
|
||||||
{
|
|
||||||
var appWindows = CaptureWindowsOfInterest();
|
|
||||||
DateTime now = DateTime.Now;
|
|
||||||
foreach (var h in appWindows)
|
|
||||||
{
|
|
||||||
//restore windows of the same process name
|
|
||||||
if (!windowProcessName.ContainsKey(h))
|
|
||||||
continue;
|
|
||||||
if (proc_name != windowProcessName[h])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ApplicationDisplayMetrics curDisplayMetrics;
|
|
||||||
ApplicationDisplayMetrics prevDisplayMetrics;
|
|
||||||
//try to inherit from killed window database
|
|
||||||
bool isMoved = IsWindowMoved(curDisplayKey, h, 0, now, out curDisplayMetrics, out prevDisplayMetrics);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (normalSessions.Contains(curDisplayKey))
|
|
||||||
CaptureApplicationsOnCurrentDisplays(curDisplayKey, immediateCapture:true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
captureTimer = new Timer(state =>
|
captureTimer = new Timer(state =>
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue