aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2020-10-20 00:42:21 +0200
committerJohn Ankarström <john@ankarstrom.se>2020-10-23 01:22:27 +0200
commit784957540217d2cacd2a74fbd78689c6b9dcdc76 (patch)
treeea9d8a77ee961d816b371e1eb7dc0a2c51499734
downloaddrm-784957540217d2cacd2a74fbd78689c6b9dcdc76.tar.gz
release 1.0
-rw-r--r--drm.ahk165
-rw-r--r--drm.exebin0 -> 830976 bytes
2 files changed, 165 insertions, 0 deletions
diff --git a/drm.ahk b/drm.ahk
new file mode 100644
index 0000000..f214ea1
--- /dev/null
+++ b/drm.ahk
@@ -0,0 +1,165 @@
+#NoEnv
+#SingleInstance Force
+#Persistent
+
+; Try to retrieve user-set resolutions
+
+RegRead, ResolutionsString, HKEY_CURRENT_USER\Software\JohnAJ\DRM, Resolutions
+
+if (ErrorLevel != 1)
+ goto Start
+
+; Fall back on default resolutions
+
+ResolutionsString = 1600x1200|1024x768|800x600|640x480 ; 4:3
+if (A_ScreenWidth/A_ScreenHeight = 1.6)
+ ResolutionsString = 1920x1200|1680x1050|1440x900|1280x800 ; 16:10
+if (Round(A_ScreenWidth/A_ScreenHeight, 2) = 1.77)
+ ResolutionsString = 1920x1080|1366x768|1280x720|854x480 ; 16:9
+
+RegWrite, REG_SZ, HKEY_CURRENT_USER\Software\JohnAJ\DRM, Resolutions, %ResolutionsString%
+
+; Set up tray menu
+
+Start:
+Resolutions := StrSplit(ResolutionsString, "|")
+Menu, Tray, NoStandard
+Menu, Tray, Tip, Dynamic Resolution Manager
+Menu, Tray, Icon, % "HBITMAP:*" . Create_tray_ico()
+for k, res in Resolutions
+ Menu, Tray, Add, %res%, SelectMenuResolution
+Menu, Tray, Add
+Menu, Tray, Add, E&xit, ButtonExit
+return
+
+ButtonExit:
+ExitApp
+
+; Select resolution from tray menu
+
+SelectMenuResolution(ItemName, ItemPos, MenuName)
+{
+ ResArray := StrSplit(ItemName, "x")
+ SwitchToResolutionFrom(ResArray[1], ResArray[2], A_ScreenWidth, A_ScreenHeight)
+}
+
+; Save window positions, switch to given resolution, restore window positions
+
+SwitchToResolutionFrom(WidthNew, HeightNew, WidthOrig, HeightOrig)
+{
+ Positions := {}
+
+ Save(Positions)
+ SetResolution(WidthNew, HeightNew)
+ Sleep, 500
+ Restore(Positions)
+
+ TrayTip, Resolution changed, % "Press Escape within 3 seconds to revert."
+ KeyWait, Esc, D T3
+ TrayTip
+ if (ErrorLevel = 1) ; user didn't press escape
+ return
+
+ SetResolution(%WidthOrig%, %HeightOrig%)
+ Sleep, 500
+ Restore(Positions)
+}
+
+; Set screen resolution
+
+SetResolution(Width, Height, ColorDepth := 32)
+{
+ VarSetCapacity(DeviceMode, 156, 0)
+ NumPut(156, DeviceMode, 36)
+ DllCall("EnumDisplaySettingsA", UInt, 0, UInt, -1, UInt, &DeviceMode)
+ NumPut(0x5c0000, DeviceMode, 40)
+ NumPut(ColorDepth, DeviceMode, 104)
+ NumPut(Width, DeviceMode, 108)
+ NumPut(Height, DeviceMode, 112)
+ DllCall("ChangeDisplaySettingsA", UInt, &DeviceMode, UInt, 0)
+}
+
+Save(ByRef Positions)
+{
+ Positions := {}
+ WinGet, id, list,,, ahk_exe 2KCLIENT.EXE
+ Loop, %id%
+ {
+ i := id%A_Index%
+ WinReallyGetPos(i, x, y, w, h)
+ WinGetTitle, title, ahk_id %i%
+ Positions[i] := [x / A_ScreenWidth, y / A_ScreenHeight, w / A_ScreenWidth, h / A_ScreenHeight]
+ }
+}
+
+Restore(Positions)
+{
+ for i, props in Positions
+ {
+ x := props[1]
+ y := props[2]
+ w := props[3]
+ h := props[4]
+ WinReallyMove(i, x * A_ScreenWidth, y * A_ScreenHeight, w * A_ScreenWidth, h * A_ScreenHeight)
+ }
+}
+
+; Get position of any window, even a minimized one
+
+WinReallyGetPos(hwnd, ByRef x, ByRef y, ByRef w="", ByRef h="")
+{
+ VarSetCapacity(wp, 44), NumPut(44, wp)
+ DllCall("GetWindowPlacement", "uint", hwnd, "uint", &wp)
+ x := NumGet(wp, 28, "int")
+ y := NumGet(wp, 32, "int")
+ w := NumGet(wp, 36, "int") - x
+ h := NumGet(wp, 40, "int") - y
+}
+
+; Set position of any window, even a minimized one
+
+WinReallyMove(hwnd, x, y, w, h)
+{
+ VarSetCapacity(wp, 44, 0), NumPut(44, wp, "uint")
+ NumPut(5, wp, 8, "uint")
+ NumPut(x, wp, 28, "int")
+ NumPut(y, wp, 32, "int")
+ NumPut(w + x, wp, 36, "int")
+ NumPut(h + y, wp, 40, "int")
+ DllCall("SetWindowPlacement", "ptr", hwnd, "ptr", &wp)
+}
+
+; ##################################################################################
+; # This #Include file was generated by Image2Include.ahk, you must not change it! #
+; ##################################################################################
+Create_tray_ico(NewHandle := False) {
+Static hBitmap := 0
+If (NewHandle)
+ hBitmap := 0
+If (hBitmap)
+ Return hBitmap
+VarSetCapacity(B64, 2984 << !!A_IsUnicode)
+B64 := "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"
+If !DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", 0, "UInt", 0x01, "Ptr", 0, "UIntP", DecLen, "Ptr", 0, "Ptr", 0)
+ Return False
+VarSetCapacity(Dec, DecLen, 0)
+If !DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", 0, "UInt", 0x01, "Ptr", &Dec, "UIntP", DecLen, "Ptr", 0, "Ptr", 0)
+ Return False
+; Bitmap creation adopted from "How to convert Image data (JPEG/PNG/GIF) to hBITMAP?" by SKAN
+; -> http://www.autohotkey.com/board/topic/21213-how-to-convert-image-data-jpegpnggif-to-hbitmap/?p=139257
+hData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", DecLen, "UPtr")
+pData := DllCall("Kernel32.dll\GlobalLock", "Ptr", hData, "UPtr")
+DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", pData, "Ptr", &Dec, "UPtr", DecLen)
+DllCall("Kernel32.dll\GlobalUnlock", "Ptr", hData)
+DllCall("Ole32.dll\CreateStreamOnHGlobal", "Ptr", hData, "Int", True, "PtrP", pStream)
+hGdip := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
+VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
+DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &SI, "Ptr", 0)
+DllCall("Gdiplus.dll\GdipCreateBitmapFromStream", "Ptr", pStream, "PtrP", pBitmap)
+DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hBitmap, "UInt", 0)
+DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBitmap)
+DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
+DllCall("Kernel32.dll\FreeLibrary", "Ptr", hGdip)
+DllCall(NumGet(NumGet(pStream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", pStream)
+Return hBitmap
+} \ No newline at end of file
diff --git a/drm.exe b/drm.exe
new file mode 100644
index 0000000..61d5244
--- /dev/null
+++ b/drm.exe
Binary files differ