Skip to content

Commit 04cc33e

Browse files
committed
Improvements: screen change modes and fixes
1 parent d5d6051 commit 04cc33e

File tree

2 files changed

+81
-5
lines changed

2 files changed

+81
-5
lines changed

HMDAssistant/Unit1.dfm

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
object Main: TMain
2-
Left = 192
3-
Top = 125
2+
Left = 193
3+
Top = 126
44
Width = 336
55
Height = 279
66
Caption = 'HMD assistant'
@@ -54,9 +54,27 @@ object Main: TMain
5454
OnClick = EditConfigBtnClick
5555
end
5656
end
57+
object ModesDisplayBtn: TMenuItem
58+
Caption = #1056#1077#1078#1080#1084#1099' '#1101#1082#1088#1072#1085#1086#1074
59+
object ExtendedBtn: TMenuItem
60+
Caption = #1056#1072#1089#1096#1080#1088#1077#1085#1085#1099#1081
61+
OnClick = ExtendedBtnClick
62+
end
63+
object CloneBtn: TMenuItem
64+
Caption = #1055#1086#1074#1090#1086#1088#1103#1102#1097#1080#1081#1089#1103
65+
OnClick = CloneBtnClick
66+
end
67+
end
5768
object N2: TMenuItem
5869
Caption = '-'
5970
end
71+
object AboutBtn: TMenuItem
72+
Caption = #1054' '#1087#1088#1086#1075#1088#1072#1084#1084#1077'...'
73+
OnClick = AboutBtnClick
74+
end
75+
object N4: TMenuItem
76+
Caption = '-'
77+
end
6078
object CloseBtn: TMenuItem
6179
Caption = #1042#1099#1093#1086#1076
6280
OnClick = CloseBtnClick

HMDAssistant/Unit1.pas

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ interface
66
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
77
Dialogs, Menus, ShellAPI, IniFiles, XPMan;
88

9+
type
10+
TDISPLAYCONFIG_PATH_INFO = record
11+
end;
12+
PDISPLAYCONFIG_PATH_INFO = ^TDISPLAYCONFIG_PATH_INFO;
13+
14+
TDISPLAYCONFIG_MODE_INFO = record
15+
end;
16+
PDISPLAYCONFIG_MODE_INFO = ^TDISPLAYCONFIG_MODE_INFO;
17+
918
type
1019
TMain = class(TForm)
1120
PopupMenu1: TPopupMenu;
@@ -22,6 +31,11 @@ TMain = class(TForm)
2231
N5: TMenuItem;
2332
N0x01: TMenuItem;
2433
XPManifest1: TXPManifest;
34+
ModesDisplayBtn: TMenuItem;
35+
ExtendedBtn: TMenuItem;
36+
CloneBtn: TMenuItem;
37+
AboutBtn: TMenuItem;
38+
N4: TMenuItem;
2539
procedure FormCreate(Sender: TObject);
2640
procedure CloseBtnClick(Sender: TObject);
2741
procedure FormClose(Sender: TObject; var Action: TCloseAction);
@@ -30,6 +44,9 @@ TMain = class(TForm)
3044
procedure MaxResBtnClick(Sender: TObject);
3145
procedure LowResBtnClick(Sender: TObject);
3246
procedure EditConfigBtnClick(Sender: TObject);
47+
procedure CloneBtnClick(Sender: TObject);
48+
procedure ExtendedBtnClick(Sender: TObject);
49+
procedure AboutBtnClick(Sender: TObject);
3350
private
3451
procedure DefaultHandler(var Message); override;
3552
procedure SetResolution(Res: string);
@@ -48,14 +65,20 @@ TMain = class(TForm)
4865
ConfigPath, EditorPath: string;
4966
HMDMonitor: integer;
5067
MaxResolution, MiddleResolution, LowResolution: string;
51-
CloseSteamVRAfterTurnOff: boolean;
68+
ActivateExtendedMode, SetMaxResolution, CloneModeAfterTurnOff, CloseSteamVRAfterTurnOff: boolean;
5269

53-
IDS_RUN, IDS_STOP, IDS_CHANGE_RES: string;
70+
IDS_RUN, IDS_STOP, IDS_CHANGE_RES, ID_ABOUT_TITLE, ID_LAST_UPDATE: string;
5471

5572
implementation
5673

5774
{$R *.dfm}
5875

76+
const
77+
SDC_TOPOLOGY_CLONE = $00000002;
78+
SDC_TOPOLOGY_EXTEND = $00000004;
79+
SDC_APPLY = $00000080;
80+
function SetDisplayConfig(numPathArrayElements: integer; pathArray: PDISPLAYCONFIG_PATH_INFO; numModeInfoArrayElements: integer; modeInfoArray: PDISPLAYCONFIG_MODE_INFO; flags: integer): longint; stdcall; external 'user32.dll'; // taken from https://github.com/CMCHTPC/WindowsAPI/blob/master/Units/Win32.WinUser.pas
81+
5982
procedure Tray(ActInd: integer); //1 - Add, 2 - Update, 3 - Remove
6083
var
6184
NIM: TNotifyIconData;
@@ -114,6 +137,9 @@ procedure TMain.FormCreate(Sender: TObject);
114137
MaxResBtn.Caption:=MaxResolution;
115138
MiddleResBtn.Caption:=MiddleResolution;
116139
LowResBtn.Caption:=LowResolution;
140+
SetMaxResolution:=Ini.ReadBool('Main', 'SetMaxResolution', false);
141+
ActivateExtendedMode:=Ini.ReadBool('Main', 'ActivateExtendedMode', false);
142+
CloneModeAfterTurnOff:=Ini.ReadBool('Main', 'CloneModeAfterTurnOff', false);
117143
CloseSteamVRAfterTurnOff:=Ini.ReadBool('Main', 'CloseSteamVRAfterTurnOff', true);
118144
Ini.Free;
119145
WM_TASKBARCREATED:=RegisterWindowMessage('TaskbarCreated');
@@ -129,13 +155,21 @@ procedure TMain.FormCreate(Sender: TObject);
129155
IDS_RUN:='Âêëþ÷èòü';
130156
IDS_STOP:='Âûêëþ÷èòü';
131157
IDS_CHANGE_RES:='Ðàçðåøåíèå èçìåíåíî íà';
158+
ID_ABOUT_TITLE:='Î ïðîãðàììå...';
159+
ID_LAST_UPDATE:='Ïîñëåäíåå îáíîâëåíèå:';
132160
end else begin
133161
IDS_RUN:='Turn on';
134162
IDS_STOP:='Turn off';
135163
RunStopBtn.Caption:=IDS_RUN;
136164
ResolutionsBtn.Caption:='Resolutions';
137165
SetupBtn.Caption:='Options';
166+
ModesDisplayBtn.Caption:='Display modes';
167+
ExtendedBtn.Caption:='Extended';
168+
CloneBtn.Caption:='Clone';
138169
EditConfigBtn.Caption:='Edit';
170+
ID_ABOUT_TITLE:='About...';
171+
AboutBtn.Caption:=ID_ABOUT_TITLE;
172+
ID_LAST_UPDATE:='Last update:';
139173
CloseBtn.Caption:='Exit';
140174
IDS_CHANGE_RES:='Resolution changed to';
141175
end;
@@ -173,10 +207,16 @@ procedure TMain.RunStopBtnClick(Sender: TObject);
173207
if EnabledIcon = false then begin
174208
EnabledIcon:=true;
175209
RunStopBtn.Caption:=IDS_STOP;
176-
ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'MultiMonitorTool.exe'), PChar('/enable \\.\DISPLAY' + IntToStr(HMDMonitor)), nil, SW_HIDE)
210+
ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'MultiMonitorTool.exe'), PChar('/enable \\.\DISPLAY' + IntToStr(HMDMonitor)), nil, SW_HIDE);
211+
if ActivateExtendedMode then
212+
ExtendedBtn.Click;
213+
if SetMaxResolution then
214+
ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'MultiMonitorTool.exe'), PChar('/setmax \\.\DISPLAY' + IntToStr(HMDMonitor)), nil, SW_HIDE);
177215
end else begin
178216
EnabledIcon:=false;
179217
RunStopBtn.Caption:=IDS_RUN;
218+
if CloneModeAfterTurnOff then
219+
CloneBtn.Click;
180220
ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'MultiMonitorTool.exe'), PChar('/disable \\.\DISPLAY' + IntToStr(HMDMonitor)), nil, SW_HIDE);
181221
if CloseSteamVRAfterTurnOff then begin
182222
WinExec('taskkill /f /im vrserver.exe', SW_HIDE);
@@ -241,4 +281,22 @@ procedure TMain.SetResolution(Res: string);
241281
Application.MessageBox(PChar(IDS_CHANGE_RES + ' "' + Res + '".'), PChar(Caption), MB_ICONINFORMATION);
242282
end;
243283

284+
procedure TMain.CloneBtnClick(Sender: TObject);
285+
begin
286+
SetDisplayConfig(0, nil, 0, nil, SDC_TOPOLOGY_CLONE or SDC_APPLY);
287+
end;
288+
289+
procedure TMain.ExtendedBtnClick(Sender: TObject);
290+
begin
291+
SetDisplayConfig(0, nil, 0, nil, SDC_TOPOLOGY_EXTEND or SDC_APPLY);
292+
end;
293+
294+
procedure TMain.AboutBtnClick(Sender: TObject);
295+
begin
296+
Application.MessageBox(PChar(Main.Caption + ' 1.2' + #13#10 +
297+
ID_LAST_UPDATE + ' 19.10.2022' + #13#10 +
298+
'https://r57zone.github.io' + #13#10 +
299+
'[email protected]'), PChar(ID_ABOUT_TITLE), MB_ICONINFORMATION);
300+
end;
301+
244302
end.

0 commit comments

Comments
 (0)