I have assembled a script for forcing programs into borderless fullscreen mode and thought I'd share it.
1. Purpose / Intended function
The script is intended to simulate borderless windowed mode / fullscreen by
- Hiding window decorations
- Making the program span the whole screen
- Making the program sit in front of the taskbar.
It should work in theory for both games and desktop programs, across multiple monitors (the program should fill the monitor it's center currently resides on) and should correctly restore position, size and decorations of windows by storing their state in an associative array.
It can also be used as an approximation of the "distraction free editing" concept, as it reduces screen clutter.
For games:
- Start the game in windowed mode.
- Make the game resolution and the screen resolution match (not needed for games like minecraft that support arbitrary windows sizes).
- Press your ToggleFakeFullscreen hotkey. (Default: F12).
2. Limitations
- If the program has modified the decorations (e.g. by putting control elements into the title bar as seen in Microsofts Ribbon UI or Chrome, which replaces the title bar by the tab bar) the results will look bad.
- Some programs (observed for Emacs) will sit behind the taskbar. An additional "hide taskbar" script or enabling "autohide taskbar" will be needed when using this script with such programs.
- Doesn't work for programs that don't support normal resizing, such as cmd.exe
- Some programs may require maximizing the window first before the fullscreen mode works correctly.
2.1. Help wanted!
If anyone has an idea how to force windows to sit in front of the taskbar WITHOUT hiding the taskbar, please let me know. Currently most programs will correctly be in front when resized to fullscreen size (just like a browser when going into fullscreen mode) while some may not (observed only for Emacs so far).
3. The script
#SingleInstance force ;;; Known issues: ;;; ;;; - Weird results for windows with custom decorations such as ;;; Chrome, or programs with a Ribbon interface. ;;; - Emacs will be maximized behind instead of in front of ;;; the taskbar. Workaround: WinHide ahk_class Shell_TrayWnd ToggleFakeFullscreen() { CoordMode Screen, Window static WINDOW_STYLE_UNDECORATED := -0xC40000 static savedInfo := Object() ;; Associative array! WinGet, id, ID, A if (savedInfo[id]) { inf := savedInfo[id] WinSet, Style, % inf["style"], ahk_id %id% WinMove, ahk_id %id%,, % inf["x"], % inf["y"], % inf["width"], % inf["height"] savedInfo[id] := "" } else { savedInfo[id] := inf := Object() WinGet, ltmp, Style, A inf["style"] := ltmp WinGetPos, ltmpX, ltmpY, ltmpWidth, ltmpHeight, ahk_id %id% inf["x"] := ltmpX inf["y"] := ltmpY inf["width"] := ltmpWidth inf["height"] := ltmpHeight WinSet, Style, %WINDOW_STYLE_UNDECORATED%, ahk_id %id% mon := GetMonitorActiveWindow() SysGet, mon, Monitor, %mon% WinMove, A,, %monLeft%, %monTop%, % monRight-monLeft, % monBottom-monTop } } GetMonitorAtPos(x,y) { ;; Monitor number at position x,y or -1 if x,y outside monitors. SysGet monitorCount, MonitorCount i := 0 while(i < monitorCount) { SysGet area, Monitor, %i% if ( areaLeft <= x && x <= areaRight && areaTop <= y && y <= areaBottom ) { return i } i := i+1 } return -1 } GetMonitorActiveWindow(){ ;; Get Monitor number at the center position of the Active window. WinGetPos x,y,width,height, A return GetMonitorAtPos(x+width/2, y+height/2) } F12::ToggleFakeFullscreen()
4. Screenshots
I wanted to post one / some, but I failed to find out how to upload attachments...
Edits
2015-07-22
Found out that emacs behaves correctly when it is maxized first.
Corrected the default hotkey in the description.
Remark on distraction free editing.