-
Notifications
You must be signed in to change notification settings - Fork 1
/
Desktop.pas
290 lines (233 loc) · 11.1 KB
/
Desktop.pas
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
unit Desktop;
interface
uses
Winapi.Windows, Winapi.Messages, System.Classes,
Vcl.Dialogs;
type
TEventStateChange = procedure(Sender: TObject; Capable: Boolean; State: Boolean) of object;
TDesktopManager = class
private
class var FMsgWindow: HWND;
class var FDisableOverlappedContent: Boolean;
class var FIsDisableOverlappedContentCapable: Boolean;
class var FClientAreaAnimation: Boolean;
class var FIsClientAreaAnimationCapable: Boolean;
class var FUIEffects: Boolean;
class var FIsUIEffectsCapable: Boolean;
class var FListboxSmoothScrolling: Boolean;
class var FIsListboxSmoothScrollingCapable: Boolean;
class var FOnDisableOverlappedContent: TEventStateChange;
class var FOnClientAreaAnimation: TEventStateChange;
class var FOnUIEffects: TEventStateChange;
class var FOnListboxSmoothScrolling: TEventStateChange;
class constructor Create;
class destructor Destroy;
class procedure MsgWindowHandle(var Message: TMessage);
class function GetSystemParametersInfo(uiAction, uiParam: UINT; var Value: Boolean): Boolean;
class function SetSystemParametersInfo(uiAction, uiParam: UINT; Value: Boolean): Boolean;
class function GetDisableOverlappedContent(var Value: Boolean): Boolean;
class function SetDisableOverlappedContent(Value: Boolean): Boolean;
class function GetClientAreaAnimation(var Value: Boolean): Boolean;
class function SetClientAreaAnimation(Value: Boolean): Boolean;
class function GetUIEffects(var Value: Boolean): Boolean;
class function SetUIEffects(Value: Boolean): Boolean;
class function GetListboxSmoothScrolling(var Value: Boolean): Boolean;
class function SetListboxSmoothScrolling(Value: Boolean): Boolean;
class procedure SetDisableOverlappedContentProp(const Value: Boolean); static;
class procedure SetClientAreaAnimationProp(const Value: Boolean); static;
class procedure SetUIEffectsProp(const Value: Boolean); static;
class procedure SetListboxSmoothScrollingProp(const Value: Boolean); static;
class procedure SetOnDisableOverlappedContent(
const Value: TEventStateChange); static;
class procedure SetOnClientAreaAnimation(
const Value: TEventStateChange); static;
class procedure SetOnUIEffects(
const Value: TEventStateChange); static;
class procedure SetOnListboxSmoothScrolling(
const Value: TEventStateChange); static;
public
class property DisableOverlappedContent: Boolean read FDisableOverlappedContent write SetDisableOverlappedContentProp;
class property ClientAreaAnimation: Boolean read FClientAreaAnimation write SetClientAreaAnimationProp;
class property UIEffects: Boolean read FUIEffects write SetUIEffectsProp;
class property ListboxSmoothScrolling: Boolean read FListboxSmoothScrolling write SetListboxSmoothScrollingProp;
class property IsDisableOverlappedContentCapable: Boolean read FIsDisableOverlappedContentCapable;
class property IsClientAreaAnimationCapable: Boolean read FIsClientAreaAnimationCapable;
class property IsUIEffectsCapable: Boolean read FIsUIEffectsCapable;
class property IsListboxSmoothScrollingCapable: Boolean read FIsListboxSmoothScrollingCapable;
class property OnDisableOverlappedContent: TEventStateChange read FOnDisableOverlappedContent write SetOnDisableOverlappedContent;
class property OnClientAreaAnimation: TEventStateChange read FOnClientAreaAnimation write SetOnClientAreaAnimation;
class property OnUIEffects: TEventStateChange read FOnUIEffects write SetOnUIEffects;
class property OnListboxSmoothScrolling: TEventStateChange read FOnListboxSmoothScrolling write SetOnListboxSmoothScrolling;
end;
implementation
{$REGION 'Setter and Getter'}
class procedure TDesktopManager.SetDisableOverlappedContentProp(const Value: Boolean);
begin
FIsDisableOverlappedContentCapable := SetDisableOverlappedContent(Value);
if not FIsDisableOverlappedContentCapable then FDisableOverlappedContent := False;
end;
class procedure TDesktopManager.SetClientAreaAnimationProp(
const Value: Boolean);
begin
FIsClientAreaAnimationCapable := SetClientAreaAnimation(Value);
if not FIsClientAreaAnimationCapable then FClientAreaAnimation := False;
end;
class procedure TDesktopManager.SetUIEffectsProp(const Value: Boolean);
begin
FIsUIEffectsCapable := SetUIEffects(Value);
if not FIsUIEffectsCapable then FUIEffects := False;
end;
class procedure TDesktopManager.SetListboxSmoothScrollingProp(
const Value: Boolean);
begin
FIsListboxSmoothScrollingCapable := SetListboxSmoothScrolling(Value);
if not FIsListboxSmoothScrollingCapable then begin
FListboxSmoothScrolling := False;
if Assigned(FOnListboxSmoothScrolling) then
FOnListboxSmoothScrolling(nil, FIsListboxSmoothScrollingCapable, FListboxSmoothScrolling);
end;
end;
{$ENDREGION}
{$REGION 'Events'}
class procedure TDesktopManager.SetOnDisableOverlappedContent(
const Value: TEventStateChange);
begin
FOnDisableOverlappedContent := Value;
if Assigned(FOnDisableOverlappedContent) then
FOnDisableOverlappedContent(nil, FIsDisableOverlappedContentCapable, FDisableOverlappedContent);
end;
class procedure TDesktopManager.SetOnClientAreaAnimation(
const Value: TEventStateChange);
begin
FOnClientAreaAnimation := Value;
if Assigned(FOnClientAreaAnimation) then
FOnClientAreaAnimation(nil, FIsClientAreaAnimationCapable, FClientAreaAnimation);
end;
class procedure TDesktopManager.SetOnUIEffects(
const Value: TEventStateChange);
begin
FOnUIEffects := Value;
if Assigned(FOnUIEffects) then
FOnUIEffects(nil, FIsUIEffectsCapable, FUIEffects);
end;
class procedure TDesktopManager.SetOnListboxSmoothScrolling(
const Value: TEventStateChange);
begin
FOnListboxSmoothScrolling := Value;
if Assigned(FOnListboxSmoothScrolling) then
FOnListboxSmoothScrolling(nil, FIsListboxSmoothScrollingCapable, FListboxSmoothScrolling);
end;
{$ENDREGION}
class function TDesktopManager.GetSystemParametersInfo(uiAction, uiParam: UINT; var Value: Boolean): Boolean;
var
pvParam: Pointer;
Val: BOOL;
begin
pvParam := @Val;
Result := SystemParametersInfo(uiAction, uiParam, pvParam, 0);
Value := Val;
end;
class function TDesktopManager.SetSystemParametersInfo(uiAction, uiParam: UINT; Value: Boolean): Boolean;
var
pvParam: Pointer;
Val: BOOL;
begin
Val := Value;
if Val then pvParam := @Val else pvParam := nil;
Result := SystemParametersInfo(uiAction, uiParam, pvParam, SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE);
end;
{ Disable Overlapped Content }
class function TDesktopManager.GetDisableOverlappedContent(var Value: Boolean): Boolean;
begin
Result := GetSystemParametersInfo(SPI_GETDISABLEOVERLAPPEDCONTENT, 0, Value);
end;
class function TDesktopManager.SetDisableOverlappedContent(Value: Boolean): Boolean;
begin
if Value = FDisableOverlappedContent then Exit(True);
Result := SetSystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT, 0, Value);
end;
{ Client Area Animation }
class function TDesktopManager.GetClientAreaAnimation(var Value: Boolean): Boolean;
begin
Result := GetSystemParametersInfo(SPI_GETCLIENTAREAANIMATION, 0, Value);
end;
class function TDesktopManager.SetClientAreaAnimation(Value: Boolean): Boolean;
begin
if Value = FClientAreaAnimation then Exit(True);
Result := SetSystemParametersInfo(SPI_SETCLIENTAREAANIMATION, 0, Value);
end;
{ UI Effects }
class function TDesktopManager.GetUIEffects(var Value: Boolean): Boolean;
begin
Result := GetSystemParametersInfo(SPI_GETUIEFFECTS, 0, Value);
end;
class function TDesktopManager.SetUIEffects(Value: Boolean): Boolean;
begin
if Value = FUIEffects then Exit(True);
Result := SetSystemParametersInfo(SPI_SETUIEFFECTS, 0, Value);
end;
{ Listbox Smooth Scrolling }
class function TDesktopManager.GetListboxSmoothScrolling(var Value: Boolean): Boolean;
begin
Result := GetSystemParametersInfo(SPI_GETLISTBOXSMOOTHSCROLLING, 0, Value);
end;
class function TDesktopManager.SetListboxSmoothScrolling(Value: Boolean): Boolean;
begin
if Value = FListboxSmoothScrolling then Exit(True);
Result := SetSystemParametersInfo(SPI_SETLISTBOXSMOOTHSCROLLING, 0, Value);
end;
class procedure TDesktopManager.MsgWindowHandle(var Message: TMessage);
begin
if Message.Msg = WM_SETTINGCHANGE then begin
Message.Result := 0;
case Message.WParam of
SPI_SETDISABLEOVERLAPPEDCONTENT: begin
FIsDisableOverlappedContentCapable := GetDisableOverlappedContent(FDisableOverlappedContent);
if not FIsDisableOverlappedContentCapable then FDisableOverlappedContent := False;
if Assigned(FOnDisableOverlappedContent) then
FOnDisableOverlappedContent(nil, FIsDisableOverlappedContentCapable, FDisableOverlappedContent);
end;
SPI_SETCLIENTAREAANIMATION: begin
FIsClientAreaAnimationCapable := GetClientAreaAnimation(FClientAreaAnimation);
if not FIsClientAreaAnimationCapable then FClientAreaAnimation := False;
if Assigned(FOnClientAreaAnimation) then
FOnClientAreaAnimation(nil, FIsClientAreaAnimationCapable, FClientAreaAnimation);
end;
SPI_SETUIEFFECTS: begin
FIsUIEffectsCapable := GetUIEffects(FUIEffects);
if not FIsUIEffectsCapable then FUIEffects := False;
if Assigned(FOnUIEffects) then
FOnUIEffects(nil, FIsUIEffectsCapable, FUIEffects);
FIsListboxSmoothScrollingCapable := GetListboxSmoothScrolling(FListboxSmoothScrolling);
if not FIsListboxSmoothScrollingCapable then FListboxSmoothScrolling := False;
if Assigned(FOnListboxSmoothScrolling) then
FOnListboxSmoothScrolling(nil, FIsListboxSmoothScrollingCapable, FListboxSmoothScrolling);
end;
SPI_SETLISTBOXSMOOTHSCROLLING: begin
FIsListboxSmoothScrollingCapable := GetListboxSmoothScrolling(FListboxSmoothScrolling);
if not FIsListboxSmoothScrollingCapable then FListboxSmoothScrolling := False;
if Assigned(FOnListboxSmoothScrolling) then
FOnListboxSmoothScrolling(nil, FIsListboxSmoothScrollingCapable, FListboxSmoothScrolling);
end;
else Message.Result := 1;
end;
end else
Message.Result := DefWindowProc(FMsgWindow, Message.Msg, Message.WParam, Message.LParam);
end;
class constructor TDesktopManager.Create;
begin
FIsDisableOverlappedContentCapable := GetDisableOverlappedContent(FDisableOverlappedContent);
if not FIsDisableOverlappedContentCapable then FDisableOverlappedContent := False;
FIsClientAreaAnimationCapable := GetClientAreaAnimation(FClientAreaAnimation);
if not FIsClientAreaAnimationCapable then FClientAreaAnimation := False;
FIsUIEffectsCapable := GetUIEffects(FUIEffects);
if not FIsUIEffectsCapable then FUIEffects := False;
FIsListboxSmoothScrollingCapable := GetListboxSmoothScrolling(FListboxSmoothScrolling);
if not FIsListboxSmoothScrollingCapable then FListboxSmoothScrolling := False;
FMsgWindow := AllocateHWnd(MsgWindowHandle);
end;
class destructor TDesktopManager.Destroy;
begin
DeallocateHWnd(FMsgWindow);
end;
end.