I have dealt with the same issue and it is very annoying. I'd use RDP in a heartbeat if I could but instead I wrote this script in AutoHotKey (AHK). I have found that AWS Workspaces captures the keyboard but could still get the mouse position so to minimize AWS in fullscreen or any program you simply swipe left on the top of the screen with your mouse and the program will minimize to the taskbar
Simply copy and paste the code below into a text editor, save as Slide Minimize.ahk, run and enjoy.
; Slide Minimize
; A handy tool for minimizing windows with a swipe mouse gesture
; Written By Travis Steichen
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
SetBatchLines -1
ListLines Off
CoordMode, Mouse, Screen
; Settings
global TopSlideArea := 16
global SlideDistance := 750
global SlideTime := 250
global TickRate := 10
global HelpMsg = ""
global State := "Waiting"
global CurrentSlideDistance := 0
global SlideLastX := 0
Menu, Tray, NoStandard
menu, tray, icon, C:\Windows\System32\SHELL32.dll,35
menu, Adjust Slide Minimize Sensitivity, add, Slide Activation Distance, GUI_SlideActivationDistance
menu, Adjust Slide Minimize Sensitivity, add, Slide Activation Time, GUI_SlideActivationTime
menu, Adjust Slide Minimize Sensitivity, add, Slide Activation Area, GUI_SlideActivationArea
menu, tray, add, Adjust Slide Minimize Sensitivity, :Adjust Slide Minimize Sensitivity
menu, tray, add ; Create a separator line.
menu, tray, add, About, HelpAbout
menu, tray, add, Reload Program, TrayReloadProgram
menu, tray, add, Exit, TrayExitProgram
SettingsLoad()
HelpMsg =
(
Slide Minimize
Version 1.0.0
Written By Travis Steichen
Email: [email protected]
=== Instructions ===
Just move your mouse to the top of the screen and swipe somewhat fast and the window in focus will minimize
)
SetTimer, Tick, %TickRate%
#Z::
MsgBox, Ok...
return
;===============================================================================================================================================
;======== END OF AUTO EXECUTE ===================================================================================================
;===============================================================================================================================================
return
;===============================================================================================================================================
~^#F24::
; This does nothing other than prevent the script from existing as soon as it is started
return
;===============================================================================================================================================
SettingsLoad()
{
if ( FileExist("Settings.ini") != "" )
{
iniSection := "Gestures"
IniRead, TopSlideArea, Settings.ini, %iniSection%, TopSlideArea
IniRead, SlideDistance, Settings.ini, %iniSection%, SlideDistance
IniRead, SlideTime, Settings.ini, %iniSection%, SlideTime
}
else
{
SettingsSave()
}
}
SettingsSave()
{
iniSection := "Gestures"
IniWrite, %TopSlideArea%, Settings.ini, %iniSection%, TopSlideArea
IniWrite, %SlideDistance%, Settings.ini, %iniSection%, SlideDistance
IniWrite, %SlideTime%, Settings.ini, %iniSection%, SlideTime
}
GUI_SlideActivationDistance:
msgCaption := "Set Slide Activation Distance"
msgText := "Slide Activation Distance is how many pixels the mouse must move left to minimize the current window in focus"
InputBox, SlideDistance, %msgCaption%, %msgText%,,,,,,,,%SlideDistance%
SettingsSave()
return
GUI_SlideActivationTime:
msgCaption := "Set Slide Activation Time"
msgText := "Slide Activation Time is how much time measured in milliseconds the mouse has to swipe left to minimize the current window in focus"
InputBox, SlideTime, %msgCaption%, %msgText%,,,,,,,,%SlideTime%
SettingsSave()
return
GUI_SlideActivationArea:
msgCaption := "Set Slide Activation Area"
msgText := "Slide Activation Area is how many pixels high from the top of the screen the mouse has to swipe left in minimize the current window in focus"
InputBox, TopSlideArea, %msgCaption%, %msgText%,,,,,,,,%TopSlideArea%
SettingsSave()
return
TrayExitProgram:
ExitApp
return
TrayReloadProgram:
Reload
return
HelpAbout:
HelpAbout()
return
Tick()
{
MouseGetPos, mouseX, mouseY
if ( mouseY < TopSlideArea )
{
if ( State == "Waiting" )
{
State := "Waiting For Slide"
SetTimer, ResetSlide, %SlideTime%
SlideLastX := mouseX
}
else if ( State == "Waiting For Slide" )
{
SlideDifference := SlideLastX - mouseX
SlideLastX := mouseX
if ( SlideDifference >= 0 )
{
CurrentSlideDistance += SlideDifference
if ( CurrentSlideDistance > SlideDistance )
{
WinMinimize, A
ResetSlide()
}
}
else
ResetSlide()
}
}
else if ( State != "Waiting" )
{
if ( State != "Reset" )
ResetSlide()
else
State := "Waiting"
}
}
ResetSlide()
{
State := "Reset"
CurrentSlideDistance := 0
SetTimer, ResetSlide, OFF
}
HelpAbout()
{
MsgBox, 64, Slide Minimize, %HelpMsg%
}
This is not a perfect solution but it fits my needs. Issues can occur with multiple monitors as Workspaces treats treats each monitor as a window in the task bar so when you slide minimize Workspaces in full screen you minimize the Workspaces window on that monitor. You can get around this by clicking the other screens and swipe minimize those. Also another issue is sometimes Workspaces forgets which monitor each workspace window is on which can cause more than one workspace window to appear on the same monitor which the only solution then is to switch Workspaces to full screen and back again.
Hope this is helpful
WinActivate
. – David Metcalfe