@@ -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+
918type
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
5572implementation
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+
5982procedure Tray (ActInd: integer); // 1 - Add, 2 - Update, 3 - Remove
6083var
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);
242282end ;
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+
244302end .
0 commit comments