From 784957540217d2cacd2a74fbd78689c6b9dcdc76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Tue, 20 Oct 2020 00:42:21 +0200 Subject: release 1.0 --- drm.ahk | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ drm.exe | Bin 0 -> 830976 bytes 2 files changed, 165 insertions(+) create mode 100644 drm.ahk create mode 100644 drm.exe 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 Binary files /dev/null and b/drm.exe differ -- cgit v1.2.3