1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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
}
|