-
Notifications
You must be signed in to change notification settings - Fork 140
Expand file tree
/
Copy pathFormMain.xaml.vb
More file actions
1692 lines (1611 loc) · 77.5 KB
/
Copy pathFormMain.xaml.vb
File metadata and controls
1692 lines (1611 loc) · 77.5 KB
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
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Imports System.ComponentModel
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Windows.Interop
Imports System.Windows.Media.Effects
Imports PCL.Core.App
Imports PCL.Core.App.IoC
Imports PCL.Core.Logging
Imports PCL.Core.UI
Imports PCL.Core.UI.Theme
Imports PCL.Core.Utils
Imports PCL.Core.Utils.OS
Public Class FormMain
#Region "基础"
'更新日志
Private Sub ShowUpdateLog()
RunInNewThread(
Sub()
Dim ChangelogFile = $"{PathTemp}CEUpdateLog.md"
Dim Changelog As String
If File.Exists(ChangelogFile) Then
Changelog = ReadFile(ChangelogFile)
Else
Changelog = "欢迎使用呀~"
End If
If MyMsgBoxMarkdown(Changelog, "PCL CE 已更新至 " & VersionBranchName & " " & VersionBaseName, "确定", "完整更新日志") = 2 Then
OpenWebsite("https://github.com/PCL-Community/PCL2-CE/releases")
End If
End Sub, "UpdateLog Output")
End Sub
'窗口加载
Private IsWindowLoadFinished As Boolean = False
Public Sub New()
ApplicationStartTick = TimeUtils.GetTimeTick()
'刷新主题
'ThemeCheckAll(False)
'ThemeRefreshColor()
AddHandler ThemeService.ColorModeChanged, Sub(mode, theme) ThemeRefresh()
AddHandler ThemeService.ColorThemeChanged, AddressOf ThemeRefresh
'窗体参数初始化
FrmMain = Me
FrmLaunchLeft = New PageLaunchLeft
FrmLaunchRight = New PageLaunchRight
'版本号改变
Dim LastVersion As Integer = States.System.LastVersion
If LastVersion < VersionCode Then
'重新询问是否启用遥测数据收集
If LastVersion <= 511 Then
If Not Config.System.TelemetryConfig.IsDefault() AndAlso Config.System.Telemetry Then
Config.System.TelemetryConfig.Reset()
Log("[Start] 遥测策略变更:由旧版本升级到含新版遥测的版本,已重置遥测设置")
End If
End If
'触发升级
UpgradeSub(LastVersion)
ElseIf LastVersion > VersionCode Then
'触发降级
DowngradeSub(LastVersion)
End If
'版本隔离设置迁移
If Setup.IsUnset("LaunchArgumentIndieV2") Then
If Not Setup.IsUnset("LaunchArgumentIndie") Then
Log("[Start] 从老 PCL 迁移版本隔离")
Setup.Set("LaunchArgumentIndieV2", Setup.Get("LaunchArgumentIndie"))
ElseIf Not Setup.IsUnset("WindowHeight") Then
Log("[Start] 从老 PCL 升级,但此前未调整版本隔离,使用老的版本隔离默认值")
Setup.Set("LaunchArgumentIndieV2", Setup.GetDefault("LaunchArgumentIndie"))
Else
Log("[Start] 全新的 PCL,使用新的版本隔离默认值")
Setup.Set("LaunchArgumentIndieV2", Setup.GetDefault("LaunchArgumentIndieV2"))
End If
End If
Setup.Load("UiLauncherTheme")
'注册拖拽事件(不能直接加 Handles,否则没用;#6340)
[AddHandler](DragDrop.DragEnterEvent, New DragEventHandler(AddressOf HandleDrag), handledEventsToo:=True)
[AddHandler](DragDrop.DragOverEvent, New DragEventHandler(AddressOf HandleDrag), handledEventsToo:=True)
'注册 MsgBox 事件
AddHandler MsgBoxWrapper.OnShow, AddressOf MsgBoxWrapper_OnShow
'注册 Hint 事件
AddHandler HintWrapper.OnShow, AddressOf HintWrapper_OnShow
'加载 UI
InitializeComponent()
Opacity = 0
Try
Height = Setup.Get("WindowHeight")
Width = Setup.Get("WindowWidth")
Catch ex As Exception '修复 #2019
Log(ex, "读取窗口默认大小失败", LogLevel.Hint)
Height = MinHeight + 100
Width = MinWidth + 100
End Try
'管理员权限下文件拖拽
If ProcessInterop.IsAdmin() Then
Log("[Start] PCL 当前正以管理员权限运行")
Static helper As New DragHelper()
AddHandler Me.SourceInitialized,
Sub()
Dim windowInterop As New WindowInteropHelper(Me)
helper.HwndSource = HwndSource.FromHwnd(windowInterop.Handle)
helper.AddHook()
End Sub
AddHandler Me.Closing,Sub() helper.RemoveHook()
AddHandler Helper.DragDrop, Sub() FileDrag(helper.DropFilePaths)
End If
If Not IsNothing(FrmLaunchLeft.Parent) Then FrmLaunchLeft.SetValue(ContentPresenter.ContentProperty, Nothing)
If Not IsNothing(FrmLaunchRight.Parent) Then FrmLaunchRight.SetValue(ContentPresenter.ContentProperty, Nothing)
PanMainLeft.Child = FrmLaunchLeft
PageLeft = FrmLaunchLeft
PanMainRight.Child = FrmLaunchRight
PageRight = FrmLaunchRight
FrmLaunchRight.PageState = MyPageRight.PageStates.ContentStay
'调试模式提醒
If ModeDebug Then Hint("[调试模式] PCL 正以调试模式运行,这可能会导致性能下降,若无必要请不要开启!")
'尽早执行的加载池
McFolderListLoader.Start(0) '为了让下载已存在文件检测可以正常运行,必须跑一次;为了让启动按钮尽快可用,需要尽早执行;为了与 PageLaunchLeft 联动,需要为 0 而不是 GetUuid
Log("[Start] 第二阶段加载用时:" & TimeUtils.GetTimeTick() - ApplicationStartTick & " ms")
'注册生命周期状态事件
Lifecycle.When(LifecycleState.WindowCreated, AddressOf FormMain_Loaded)
End Sub
Private Sub FormMain_Loaded() '(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
FormMain_SizeChanged()
ApplicationStartTick = TimeUtils.GetTimeTick()
FrmHandle = New WindowInteropHelper(Me).Handle
'读取设置
Setup.Load("UiBackgroundOpacity")
Setup.Load("UiBackgroundBlur")
Setup.Load("UiLogoType")
Setup.Load("UiHiddenPageDownload")
Setup.Load("UiAutoPauseVideo") '智能暂停视频背景
PageSetupUI.HiddenRefresh()
PageSetupUI.BackgroundRefresh(False, True)
MusicRefreshPlay(False, True)
'扩展按钮
BtnExtraUpdateRestart.ShowCheck = AddressOf BtnExtraUpdateRestart_ShowCheck
BtnExtraDownload.ShowCheck = AddressOf BtnExtraDownload_ShowCheck
BtnExtraBack.ShowCheck = AddressOf BtnExtraBack_ShowCheck
BtnExtraApril.ShowCheck = AddressOf BtnExtraApril_ShowCheck
BtnExtraShutdown.ShowCheck = AddressOf BtnExtraShutdown_ShowCheck
BtnExtraLog.ShowCheck = AddressOf BtnExtraLog_ShowCheck
BtnExtraApril.ShowRefresh()
'初始化尺寸改变
If Not Setup.Get("UiLockWindowSize") Then
AddResizer()
Else
RemoveResizer()
End If
'PLC 彩蛋
If RandomUtils.NextInt(1, 1000) = 233 Then
ShapeTitleLogo.Data = New GeometryConverter().ConvertFromString("M26,29 v-25 h6 a7,7 180 0 1 0,14 h-6 M83,6.5 a10,11.5 180 1 0 0,18 M48,2.5 v24.5 h13.5")
End If
'加载窗口
ThemeRefresh()
Application.Current.Resources("BlurSamplingRate") = Setup.Get("UiBlurSamplingRate") * 0.01
Application.Current.Resources("BlurType") = CType(Setup.Get("UiBlurType"), KernelType)
If Setup.Get("UiBlur") Then
Application.Current.Resources("BlurRadius") = Setup.Get("UiBlurValue") * 1.0
Else
Application.Current.Resources("BlurRadius") = 0.0
End If
'#If DEBUG Then
' MinHeight = 50
' MinWidth = 50
'#End If
Topmost = False
If FrmStart IsNot Nothing Then FrmStart.Close(New TimeSpan(0, 0, 0, 0, 400 / AniSpeed))
'更改窗口
'Top = (GetWPFSize(My.Computer.Screen.WorkingArea.Height) - Height) / 2
'Left = (GetWPFSize(My.Computer.Screen.WorkingArea.Width) - Width) / 2
IsSizeSaveable = True
ShowWindowToTop()
Dim HwndSource As Interop.HwndSource = PresentationSource.FromVisual(Me)
HwndSource.AddHook(New Interop.HwndSourceHook(AddressOf WndProc))
AniStart({
AaCode(Sub() AniControlEnabled -= 1, 50),
AaOpacity(Me, Setup.Get("UiLauncherTransparent") / 1000 + 0.4, 250, 100),
AaDouble(Sub(i) TransformPos.Y += i, -TransformPos.Y, 600, 100, New AniEaseOutBack(AniEasePower.Weak)),
AaDouble(Sub(i) TransformRotate.Angle += i, -TransformRotate.Angle, 500, 100, New AniEaseOutBack(AniEasePower.Weak)),
AaCode(
Sub()
RenderTransform = Nothing
IsWindowLoadFinished = True
Log($"[System] DPI:{DPI},系统版本:{Environment.OSVersion.VersionString},PCL 位置:{ExePathWithName}")
End Sub, , True)
}, "Form Show")
'Timer 启动
AniStart()
TimerMainStart()
RunInNewThread(
Sub()
Try
'特殊版本提示
#If DEBUG Or DEBUGCI Then
If Environment.GetEnvironmentVariable("PCL_DISABLE_DEBUG_HINT") Is Nothing Then
#If DEBUG Then
Const hint = "当前运行的 PCL 社区版为 Debug 版本。" & vbCrLf &
"该版本仅适合开发者调试运行,可能会有严重的性能下降以及各种奇怪的网络问题。" & vbCrLf &
vbCrLf &
"非开发者用户使用该版本造成的一切问题均不被社区支持,相关 issue 可能会被直接关闭。" & vbCrLf &
"除非您是开发者,否则请立即删除该版本,并下载最新稳定版使用。"
#Else
Const hint = "当前运行的 PCL 社区版为 CI 自动构建版本。" & vbCrLf &
"该版本包含最新的漏洞修复、优化和新特性,但性能和稳定性较差,不适合日常使用和制作整合包。" & vbCrLf &
vbCrLf &
"除非社区开发者要求或您自己想要这么做,否则请下载最新稳定版使用。"
#End If
MyMsgBox($"{hint}{vbCrLf}{vbCrLf}可以添加 PCL_DISABLE_DEBUG_HINT 环境变量 (任意值) 来隐藏这个提示。",
"特殊版本提示", "我清楚我在做什么", "打开最新版下载页并退出", IsWarn:=True,
Button2Action:=Sub()
OpenWebsite("https://github.com/PCL-Community/PCL2-CE/releases/latest")
EndProgram(False)
End Sub)
End If
#End If
'EULA 提示
If Not Setup.Get("SystemEula") Then
Select Case MyMsgBox("在使用 PCL 前,请同意 PCL 的用户协议与免责声明。", "协议授权", "同意", "拒绝", "查看用户协议与免责声明",
Button3Action:=Sub() OpenWebsite("https://shimo.im/docs/rGrd8pY8xWkt6ryW"))
Case 1
Setup.Set("SystemEula", True)
Case 2
EndProgram(False)
End Select
End If
'遥测提示
If Config.System.TelemetryConfig.IsDefault() Then
Dim selection = MyMsgBox("启用遥测数据收集后,启动器将会收集并上报错误与设备环境信息,这可以帮助开发者修复潜在的问题、更好的进行规划和开发。" & vbCrLf &
"若启用此功能,我们将会收集以下信息:" & vbCrLf & vbCrLf &
"- 启动器内出现的错误" & vbCrLf &
"- 启动器版本信息与识别码" & vbCrLf &
"- Windows 系统版本与架构" & vbCrLf &
"- 已安装的物理内存大小" & vbCrLf &
"- NAT 与 IPv6 支持情况" & vbCrLf &
"- 是否使用过官方版 PCL、HMCL 或 BakaXL" & vbCrLf & vbCrLf &
"这些数据均不与你关联,我们也绝不会向第三方出售数据。" & vbCrLf &
"如果不希望启用遥测,可以选择拒绝。这不会影响其他功能的正常使用,但可能会影响开发者修复潜在 Bug。" & vbCrLf &
"你可以随时在启动器设置中调整这项设置。", "启用遥测数据收集", "同意", "拒绝")
Config.System.TelemetryConfig.SetValue(selection = 1, forceNewValue:=True)
End If
Catch ex As Exception
Log(ex, "初始弹窗提示运行失败", LogLevel.Feedback)
End Try
End Sub, "Start MsgBox", ThreadPriority.Lowest)
'加载池
RunInNewThread(
Sub()
'启动加载器池
Try
DlClientListMojangLoader.Start(1) 'PCL 会同时根据这里的加载结果决定是否使用官方源进行下载
RunCountSub()
ServerLoader.Start(1)
RunInNewThread(AddressOf TryClearTaskTemp, "TryClearTaskTemp", ThreadPriority.BelowNormal)
Catch ex As Exception
Log(ex, "初始化加载池运行失败", LogLevel.Feedback)
End Try
GetSystemInfo()
End Sub, "Start Loader", ThreadPriority.BelowNormal)
Log("[Start] 第三阶段加载用时:" & TimeUtils.GetTimeTick() - ApplicationStartTick & " ms")
End Sub
'根据打开次数触发的事件
Private Sub RunCountSub()
Setup.Set("SystemCount", Setup.Get("SystemCount") + 1)
If Setup.Get("SystemCount") >= 99 Then
If ThemeUnlock(6, False) Then
MyMsgBox("你已经打开了 99 次 PCL 社区版啦,感谢你长期以来的支持!" & vbCrLf &
"隐藏主题 铁杆粉 未解锁!社区版不包含隐藏主题!", "提示")
End If
End If
End Sub
'升级与降级事件
Private Sub UpgradeSub(LastVersionCode As Integer)
Log("[Start] 版本号从 " & LastVersionCode & " 升高到 " & VersionCode)
Setup.Set("SystemLastVersionReg", VersionCode)
'检查有记录的最高版本号
Dim LowerVersionCode As Integer
#If BETA Then
LowerVersionCode = Setup.Get("SystemHighestBetaVersionReg")
If LowerVersionCode < VersionCode Then
Setup.Set("SystemHighestBetaVersionReg", VersionCode)
Log("[Start] 最高版本号从 " & LowerVersionCode & " 升高到 " & VersionCode)
End If
#Else
LowerVersionCode = Setup.Get("SystemHighestAlphaVersionReg")
If LowerVersionCode < VersionCode Then
Setup.Set("SystemHighestAlphaVersionReg", VersionCode)
Log("[Start] 最高版本号从 " & LowerVersionCode & " 升高到 " & VersionCode)
End If
#End If
'被移除的窗口设置选项
If Setup.Get("LaunchArgumentWindowType") = 5 Then Setup.Set("LaunchArgumentWindowType", 1)
'修改主题设置项名称
If LowerVersionCode <= 207 Then
Dim UnlockedTheme As New List(Of String) From {"2"}
UnlockedTheme.AddRange(New List(Of String)(Setup.Get("UiLauncherThemeHide").ToString.Split("|")))
UnlockedTheme.AddRange(New List(Of String)(Setup.Get("UiLauncherThemeHide2").ToString.Split("|")))
Setup.Set("UiLauncherThemeHide2", Join(UnlockedTheme.Distinct.ToList, "|"))
End If
'重置欧皇彩
If LastVersionCode <= 115 AndAlso Setup.Get("UiLauncherThemeHide2").ToString.Split("|").Contains("13") Then
Dim UnlockedTheme As New List(Of String)(Setup.Get("UiLauncherThemeHide2").ToString.Split("|"))
UnlockedTheme.Remove("13")
Setup.Set("UiLauncherThemeHide2", Join(UnlockedTheme, "|"))
MyMsgBox("由于新版 PCL 修改了欧皇彩的解锁方式,你需要重新解锁欧皇彩。" & vbCrLf &
"多谢各位的理解啦!", "重新解锁提醒")
End If
'重置滑稽彩
If LastVersionCode <= 152 AndAlso Setup.Get("UiLauncherThemeHide2").ToString.Split("|").Contains("12") Then
Dim UnlockedTheme As New List(Of String)(Setup.Get("UiLauncherThemeHide2").ToString.Split("|"))
UnlockedTheme.Remove("12")
Setup.Set("UiLauncherThemeHide2", Join(UnlockedTheme, "|"))
MyMsgBox("由于新版 PCL 修改了滑稽彩的解锁方式,你需要重新解锁滑稽彩。" & vbCrLf &
"多谢各位的理解啦!", "重新解锁提醒")
End If
'移动自定义皮肤
If LastVersionCode <= 161 AndAlso File.Exists(ExePath & "PCL\CustomSkin.png") AndAlso Not File.Exists(PathAppdata & "CustomSkin.png") Then
CopyFile(ExePath & "PCL\CustomSkin.png", PathAppdata & "CustomSkin.png")
Log("[Start] 已移动离线自定义皮肤 (162)")
End If
If LastVersionCode <= 263 AndAlso File.Exists(PathTemp & "CustomSkin.png") AndAlso Not File.Exists(PathAppdata & "CustomSkin.png") Then
CopyFile(PathTemp & "CustomSkin.png", PathAppdata & "CustomSkin.png")
Log("[Start] 已移动离线自定义皮肤 (264)")
End If
'解除帮助页面的隐藏
If LastVersionCode <= 205 Then
Config.Preference.Hide.SetupAbout = False
Log("[Start] 已解除帮助页面的隐藏")
End If
'迁移旧版用户档案
If LastVersionCode <= 368 Then
RunInNewThread(Sub() MigrateOldProfile())
End If
'Mod 命名设置迁移
If Not Setup.IsUnset("ToolDownloadTranslate") AndAlso Setup.IsUnset("ToolDownloadTranslateV2") Then
Setup.Set("ToolDownloadTranslateV2", Setup.Get("ToolDownloadTranslate") + 1)
Log("[Start] 已从老版本迁移 Mod 命名设置")
End If
'更新后展示社区版提示
ShowCEAnnounce()
'输出更新日志
If LastVersionCode <= 0 Then Return
If LowerVersionCode >= VersionCode Then Return
ShowUpdateLog()
End Sub
Private Sub DowngradeSub(LastVersionCode As Integer)
Log("[Start] 版本号从 " & LastVersionCode & " 降低到 " & VersionCode)
Setup.Set("SystemLastVersionReg", VersionCode)
End Sub
#End Region
#Region "自定义窗口"
Private CanResize As Boolean = True
' 重写窗口边缘判定以使 DWM 自带的 resizer 行为看起来比较正常
Private Function _SizeWndProc(hWnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr
' 窗口活动常量
Const WM_NCHITTEST = &H84
Const HTCLIENT = 1
Const HTLEFT = 10
Const HTRIGHT = 11
Const HTTOP = 12
Const HTTOPLEFT = 13
Const HTTOPRIGHT = 14
Const HTBOTTOM = 15
Const HTBOTTOMLEFT = 16
Const HTBOTTOMRIGHT = 17
' WPF 尺寸的 offset
Const offsetWpf = 6
Const hitWidthWpf = 5
' 过滤非 WM_NCHITTEST 事件
If msg <> WM_NCHITTEST Then Return IntPtr.Zero
' 提取鼠标坐标
' 没妈的 VB 强转还得检查一下幻想的妈是不是还活着
Dim mouseBytes As Byte() = BitConverter.GetBytes(lParam.ToInt64())
Dim xMouse As Short = BitConverter.ToInt16(mouseBytes, 0)
Dim yMouse As Short = BitConverter.ToInt16(mouseBytes, 2)
' 获取窗口参数
Dim windowRect = WindowInterop.GetWindowRectangle(hWnd)
Dim windowBounds = windowRect.ToWindowBounds()
' 判断鼠标是否在窗口范围内
Dim isInWindow As Boolean = _
(xMouse >= windowRect.Left AndAlso xMouse <= windowRect.Right) AndAlso
(yMouse >= windowRect.Top AndAlso yMouse <= windowRect.Bottom)
' 过滤不在窗口内的请求
If Not isInWindow Then Return IntPtr.Zero
' 如果 CanResize 为 False,直接返回 HTCLIENT
If Not CanResize Then Return New IntPtr(HTCLIENT)
' 真实像素尺寸的 offset
Dim dpi = VisualTreeHelper.GetDpi(Me)
Dim offsetPxX = offsetWpf * dpi.DpiScaleX
Dim offsetPxY = offsetWpf * dpi.DpiScaleY
Dim hitWidthPxX = hitWidthWpf * dpi.DpiScaleX
Dim hitWidthPxY = hitWidthWpf * dpi.DpiScaleY
' 计算鼠标相对于窗口左上角的物理像素位置
Dim relX As Integer = xMouse - windowRect.Left
Dim relY As Integer = yMouse - windowRect.Top
Dim w As Integer = windowBounds.Width
Dim h As Integer = windowBounds.Height
' 判定是否命中偏移后的热区
Dim inLeft As Boolean = (relX >= offsetPxX AndAlso relX <= offsetPxX + hitWidthPxX)
Dim inRight As Boolean = (relX <= w - offsetPxX AndAlso relX >= w - offsetPxX - hitWidthPxX)
Dim inTop As Boolean = (relY >= offsetPxY AndAlso relY <= offsetPxY + hitWidthPxY)
Dim inBottom As Boolean = (relY <= h - offsetPxY AndAlso relY >= h - offsetPxY - hitWidthPxY)
handled = True ' 接管该区域的消息
' 返回结果
If inTop AndAlso inLeft Then Return New IntPtr(HTTOPLEFT)
If inTop AndAlso inRight Then Return New IntPtr(HTTOPRIGHT)
If inBottom AndAlso inLeft Then Return New IntPtr(HTBOTTOMLEFT)
If inBottom AndAlso inRight Then Return New IntPtr(HTBOTTOMRIGHT)
If inLeft Then Return New IntPtr(HTLEFT)
If inRight Then Return New IntPtr(HTRIGHT)
If inTop Then Return New IntPtr(HTTOP)
If inBottom Then Return New IntPtr(HTBOTTOM)
' 如果在 0-offset 范围内,返回 HTCLIENT 杀掉默认缩放
Return New IntPtr(HTCLIENT)
End Function
Protected Overrides Sub OnSourceInitialized(e As EventArgs)
'硬件加速
If Setup.Get("SystemDisableHardwareAcceleration") Then
Dim hwndSource As HwndSource = TryCast(PresentationSource.FromVisual(Me), HwndSource)
If hwndSource IsNot Nothing Then
hwndSource.CompositionTarget.RenderMode = RenderMode.SoftwareOnly
End If
End If
MyBase.OnSourceInitialized(e)
' 获取当前窗口句柄
Dim hwnd As IntPtr = New WindowInteropHelper(Me).Handle
Dim source As HwndSource = HwndSource.FromHwnd(hwnd)
If source IsNot Nothing Then
' 渲染层允许 Alpha 通道通过
source.CompositionTarget.BackgroundColor = Colors.Transparent
' 魔改窗口边缘判定
source.AddHook(AddressOf _SizeWndProc)
End If
' 设置 DWM 窗口框架
Try
WindowInterop.ExtendFrameIntoClientArea(hwnd, -1)
Catch ex As Exception
LogWrapper.Error("DWM 窗口框架应用失败: " & ex.Message)
End Try
End Sub
'关闭
Private Sub FormMain_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
EndProgram(True)
e.Cancel = True
End Sub
''' <summary>
''' 正常关闭程序。程序将在执行此方法后约 0.3s 退出。
''' </summary>
''' <param name="SendWarning">是否在还有下载任务未完成时发出警告。</param>
''' <param name="isUpdating">是否正在更新重启</param>
Public Sub EndProgram(SendWarning As Boolean, Optional isUpdating As Boolean = False)
'发出警告
If SendWarning AndAlso HasDownloadingTask() Then
If MyMsgBox("还有下载任务尚未完成,是否确定退出?", "提示", "确定", "取消") = 1 Then
'强行结束下载任务
RunInNewThread(
Sub()
Log("[System] 正在强行停止任务")
For Each Task As LoaderBase In LoaderTaskbar.ToList()
Task.Abort()
Next
End Sub, "强行停止下载任务")
Else
Return
End If
End If
'关闭联机大厅
'Await LobbyController.CloseAsync().ConfigureAwait(False)
'存储上次使用的档案编号
SaveProfile()
'关闭
RunInUiWait(
Sub()
'清理视频背景
VideoBack.Stop()
VideoBack.Source = Nothing
VideoBack.Close()
IsHitTestVisible = False
If RenderTransform Is Nothing Then
Dim TransformPos As New TranslateTransform(0, 0)
Dim TransformRotate As New RotateTransform(0)
Dim TransformScale As New ScaleTransform(1, 1)
TransformScale.CenterX = Width / 2
TransformScale.CenterY = Height / 2
RenderTransform = New TransformGroup() With {.Children = New TransformCollection({TransformRotate, TransformPos, TransformScale})}
AniStart({
AaOpacity(Me, -Opacity, 140, 40, New AniEaseOutFluent(AniEasePower.Weak)),
AaDouble(
Sub(i)
TransformScale.ScaleX += i
TransformScale.ScaleY += i
End Sub, 0.88 - TransformScale.ScaleX, 180),
AaDouble(Sub(i) TransformPos.Y += i, 20 - TransformPos.Y, 180, 0, New AniEaseOutFluent(AniEasePower.Weak)),
AaDouble(Sub(i) TransformRotate.Angle += i, 0.6 - TransformRotate.Angle, 180, 0, New AniEaseInoutFluent(AniEasePower.Weak)),
AaCode(
Sub()
IsHitTestVisible = False
Visibility = Visibility.Collapsed
ShowInTaskbar = False
End Sub, 210),
AaCode(Sub() EndProgramForce(force:=False, isUpdating:=isUpdating), 230)
}, "Form Close")
Else
EndProgramForce(force:=False, isUpdating:=isUpdating)
End If
Log("[System] 收到关闭指令")
End Sub)
End Sub
Private Shared IsLogShown As Boolean = False
Public Shared Sub EndProgramForce(
Optional ReturnCode As ProcessReturnValues = ProcessReturnValues.Success,
Optional force As Boolean = True,
Optional isUpdating As Boolean = False)
'On Error Resume Next
'关闭联机大厅
'Await LobbyController.CloseAsync().ConfigureAwait(False)
IsProgramEnded = True
AniControlEnabled += 1
If IsUpdateWaitingRestart AndAlso Not isUpdating Then UpdateRestart(False, triggerRestart := False)
If ReturnCode = ProcessReturnValues.Exception Then
If Not IsLogShown Then
FeedbackInfo()
Log("请在 https://github.com/PCL-Community/PCL2-CE/issues 提交错误报告,以便于社区解决此问题!(这也有可能是原版 PCL 的问题)")
IsLogShown = True
ShellOnly(LogWrapper.CurrentLogger.CurrentLogFiles.Last())
End If
Thread.Sleep(500) '防止 PCL 在记事本打开前就被掐掉
End If
Log("[System] 程序已退出,返回值:" & GetStringFromEnum(ReturnCode))
'If ReturnCode <> ProcessReturnValues.Success Then Environment.Exit(ReturnCode)
'Process.GetCurrentProcess.Kill()
Lifecycle.Shutdown(ReturnCode, force)
End Sub
Private Sub BtnTitleClose_Click(sender As Object, e As RoutedEventArgs) Handles BtnTitleClose.Click
EndProgram(True)
End Sub
'移动
Private Sub FormDragMove(sender As Object, e As MouseButtonEventArgs) Handles PanTitle.MouseLeftButtonDown, PanMsg.MouseLeftButtonDown
'On Error Resume Next
If sender.IsMouseDirectlyOver Then DragMove()
End Sub
'改变大小
''' <summary>
''' 是否可以向注册表储存尺寸改变信息。以此避免初始化时误储存。
''' </summary>
Public IsSizeSaveable As Boolean = False
Private Sub FormMain_SizeChanged() Handles Me.SizeChanged
If IsSizeSaveable Then
States.UI.WindowHeight = Height
States.UI.WindowWidth = Width
End If
If PanBack IsNot Nothing Then
RectForm.Rect = New Rect(0, 0, PanBack.ActualWidth, PanBack.ActualHeight)
Dim formWidth As Double = PanBack.ActualWidth + 0.001
Dim formHeight As Double = PanBack.ActualHeight + 0.001
PanForm.Width = formWidth
PanForm.Height = formHeight
PanMain.Width = formWidth
If PanTitle IsNot Nothing Then
PanMain.Height = Math.Max(0, formHeight - PanTitle.ActualHeight)
Else
PanMain.Height = formHeight
End If
VideoBack.Width = formWidth
VideoBack.Height = formHeight
End If
If WindowState = WindowState.Maximized Then WindowState = WindowState.Normal '修复 #1938
End Sub
'标题栏改变大小
Private Sub PanTitle_SizeChanged() Handles PanTitleLeft.SizeChanged
If PanTitleMain.ColumnDefinitions(0).ActualWidth - 30 <= 0 Then
PanTitleLeft.ColumnDefinitions(0).MaxWidth = 0
Else
PanTitleLeft.ColumnDefinitions(0).MaxWidth = PanTitleMain.ColumnDefinitions(0).ActualWidth - 30
End If
End Sub
'最小化
Private Sub BtnTitleMin_Click() Handles BtnTitleMin.Click
WindowState = WindowState.Minimized
End Sub
'“帮助”
Private Sub BtnTitleHelp_Click() Handles BtnTitleHelp.Click
OpenWebsite("https://www.bilibili.com/video/BV1uT4y1P7CX")
End Sub
#End Region
#Region "窗体事件"
Public Sub AddResizer()
CanResize = True
End Sub
Public Sub RemoveResizer()
CanResize = False
End Sub
'按键事件
Private Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
If e.IsRepeat Then Return
'调用弹窗:回车选择第一个,Esc 选择最后一个
If PanMsg.Children.Count > 0 Then
If e.Key = Key.Enter Then
CType(PanMsg.Children(0), Object).Btn1_Click()
Return
ElseIf e.Key = Key.Escape Then
Dim Msg As Object = PanMsg.Children(0)
If TypeOf Msg IsNot MyMsgInput AndAlso TypeOf Msg IsNot MyMsgSelect AndAlso Msg.Btn3.Visibility = Visibility.Visible Then
Msg.Btn3_Click()
ElseIf Msg.Btn2.Visibility = Visibility.Visible Then
Msg.Btn2_Click()
Else
Msg.Btn1_Click()
End If
Return
End If
End If
'按 ESC 返回上一级
If e.Key = Key.Escape Then TriggerPageBack()
'更改隐藏实例可见性
If e.Key = Key.F11 AndAlso PageCurrent = FormMain.PageType.InstanceSelect Then
FrmSelectRight.ShowHidden = Not FrmSelectRight.ShowHidden
LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
Return
End If
'更改功能隐藏可见性
If e.Key = Key.F12 Then
PageSetupUI.HiddenForceShow = Not PageSetupUI.HiddenForceShow
If PageSetupUI.HiddenForceShow Then
Hint("功能隐藏设置已暂时关闭!", HintType.Finish)
Else
Hint("功能隐藏设置已重新开启!", HintType.Finish)
End If
PageSetupUI.HiddenRefresh()
Return
End If
'按 F5 刷新页面
If e.Key = Key.F5 Then
If TypeOf PageLeft Is IRefreshable Then CType(PageLeft, IRefreshable).Refresh()
If TypeOf PageRight Is IRefreshable Then CType(PageRight, IRefreshable).Refresh()
Return
End If
'调用启动游戏
If e.Key = Key.Enter AndAlso PageCurrent = FormMain.PageType.Launch Then
If IsAprilEnabled AndAlso Not IsAprilGiveup Then
Hint("木大!")
Else
FrmLaunchLeft.LaunchButtonClick()
End If
End If
'修复按下 Alt 后误认为弹出系统菜单导致的冻结
If e.SystemKey = Key.LeftAlt OrElse e.SystemKey = Key.RightAlt Then e.Handled = True
End Sub
Private Sub FormMain_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles Me.MouseDown
'鼠标侧键返回上一级
If FrmMain.PanMsg.Children.Count > 0 OrElse WaitingMyMsgBox.Any Then Return '弹窗中(#5513)
If e.ChangedButton = MouseButton.XButton1 OrElse e.ChangedButton = MouseButton.XButton2 Then TriggerPageBack()
End Sub
Private Sub TriggerPageBack()
If PageCurrent = PageType.Download AndAlso PageCurrentSub = PageSubType.DownloadInstall AndAlso FrmDownloadInstall.IsInSelectPage Then
FrmDownloadInstall.ExitSelectPage()
ElseIf PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.VersionInstall AndAlso FrmInstanceInstall.IsInSelectPage Then
FrmInstanceInstall.ExitSelectPage()
Else
PageBack()
End If
End Sub
'切回窗口
Private Sub FormMain_Activated() Handles Me.Activated
Try
If Setup.Get("ToolDownloadClipboard") Then CompClipboard.GetClipboardResource()
If PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.VersionMod Then
'Mod 管理自动刷新
FrmInstanceMod.ReloadCompFileList()
ElseIf PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.VersionResourcePack Then
'资源包管理自动刷新
If FrmInstanceResourcePack IsNot Nothing Then FrmInstanceResourcePack.ReloadCompFileList()
ElseIf PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.VersionShader Then
'光影包管理自动刷新
If FrmInstanceShader IsNot Nothing Then FrmInstanceShader.ReloadCompFileList()
ElseIf PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.VersionSchematic Then
'投影原理图管理自动刷新
If FrmInstanceSchematic IsNot Nothing Then FrmInstanceSchematic.ReloadCompFileList()
ElseIf PageCurrent = PageType.InstanceSelect Then
'实例选择自动刷新
LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\")
ElseIf TypeOf FrmMain.PageRight Is PageInstanceSavesDatapack AndAlso FrmInstanceSavesDatapack IsNot Nothing Then
'数据包管理自动刷新
FrmInstanceSavesDatapack.ReloadDatapackFileList()
End If
Catch ex As Exception
Log(ex, "切回窗口时出错", LogLevel.Feedback)
End Try
End Sub
'文件拖放
Private Sub HandleDrag(sender As Object, e As DragEventArgs)
Try
If e.Handled AndAlso (e.Effects <> DragDropEffects.None) Then Return
e.Handled = True
'缓存
Static PrevData As IDataObject, PrevEffects As DragDropEffects
If e.Data Is PrevData Then
e.Effects = PrevEffects
Return
End If
PrevData = e.Data
'确定拖放效果
e.Effects = DragDropEffects.None
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim Files As String() = e.Data.GetData(DataFormats.FileDrop)
If Files IsNot Nothing AndAlso Files.Length > 0 Then
e.Effects = DragDropEffects.Link
End If
ElseIf e.Data.GetDataPresent(DataFormats.Text) Then
Dim Str As String = TryCast(e.Data.GetData(DataFormats.Text), String)
If Str Is Nothing Then
Return
End If
If Str.StartsWithF("authlib-injector:yggdrasil-server:") Then
e.Effects = DragDropEffects.Copy
ElseIf Str.StartsWithF("file:///") Then
e.Effects = DragDropEffects.Copy
ElseIf (Path.IsPathRooted(Str) OrElse Str.StartsWith("\\")) AndAlso File.Exists(Str) Then
e.Effects = DragDropEffects.Copy
End If
End If
PrevEffects = e.Effects
Log("[System] 设置拖放类型:" & GetStringFromEnum(e.Effects))
Catch ex As Exception
Log(ex, "处理拖放时出错", LogLevel.Feedback)
End Try
End Sub
Private Sub FrmMain_Drop(sender As Object, e As DragEventArgs) Handles Me.Drop
Try
If e.Data.GetDataPresent(DataFormats.Text) Then
'获取文本
Try
Dim Str As String = e.Data.GetData(DataFormats.Text)
Log("[System] 接受文本拖拽:" & Str)
If Str.StartsWithF("authlib-injector:yggdrasil-server:") Then
'Authlib 拖拽
e.Handled = True
e.Effects = DragDropEffects.Copy
Dim AuthlibServer As String = Net.WebUtility.UrlDecode(Str.Substring("authlib-injector:yggdrasil-server:".Length))
Log("[System] Authlib 拖拽:" & AuthlibServer)
If Not String.IsNullOrEmpty(New ValidateHttp().Validate(AuthlibServer)) Then
Hint($"输入的 Authlib 验证服务器不符合网址格式({AuthlibServer})!", HintType.Critical)
Return
End If
If MyMsgBox($"是否要创建新的第三方验证档案?{vbCrLf}验证服务器地址:{AuthlibServer}", "创建新的第三方验证档案", "确定", "取消") = 2 Then Exit Sub
SelectedProfile = Nothing
RunInUi(Sub()
PageLoginAuth.DraggedAuthServer = AuthlibServer
FrmLaunchLeft.RefreshPage(True, McLoginType.Auth)
End Sub)
If PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.VersionSetup Then
'正在服务器选项页,需要刷新设置项显示
FrmInstanceSetup.Reload()
End If
ElseIf Str.StartsWithF("file:///") Then
'文件拖拽(例如从浏览器下载窗口拖入)
Dim FilePath = Net.WebUtility.UrlDecode(Str).Substring("file:///".Length).Replace("/", "\")
e.Handled = True
e.Effects = DragDropEffects.Copy
FileDrag(New List(Of String) From {FilePath})
End If
Catch ex As Exception
Log(ex, "无法接取文本拖拽事件", LogLevel.Developer)
Return
End Try
ElseIf e.Data.GetDataPresent(DataFormats.FileDrop) Then
'获取文件并检查
Dim FilePathRaw = e.Data.GetData(DataFormats.FileDrop)
If FilePathRaw Is Nothing Then '#2690
Hint("请将文件解压后再拖入!", HintType.Critical)
Return
End If
e.Handled = True
e.Effects = DragDropEffects.Link
FileDrag(CType(FilePathRaw, IEnumerable(Of String)))
End If
Catch ex As Exception
Log(ex, "接取拖拽事件失败", LogLevel.Feedback)
End Try
End Sub
Private Sub FileDrag(FilePathList As IEnumerable(Of String))
RunInNewThread(
Sub()
Dim FilePath As String = FilePathList.First
Log("[System] 接受文件拖拽:" & FilePath & If(FilePathList.Any, $" 等 {FilePathList.Count} 个文件", ""), LogLevel.Developer)
'基础检查
If Directory.Exists(FilePathList.First) AndAlso Not File.Exists(FilePathList.First) Then
Hint("请拖入一个文件,而非文件夹!", HintType.Critical)
Return
ElseIf Not File.Exists(FilePathList.First) Then
Hint("拖入的文件不存在:" & FilePathList.First, HintType.Critical)
Return
End If
'多文件拖拽
If FilePathList.Count > 1 Then
'检查是否为同类型文件
Dim FirstExtension = FilePathList.First.AfterLast(".").ToLower
Dim AllSameType = FilePathList.All(Function(f) f.AfterLast(".").ToLower = FirstExtension)
If AllSameType AndAlso {"jar", "litemod", "disabled", "old", "litematic", "nbt", "schematic", "schem"}.Contains(FirstExtension) Then
'允许同类型的 Mod 文件或投影文件批量拖拽
Else
Hint("一次请只拖入相同类型的文件!", HintType.Critical)
Return
End If
End If
'主页
Dim Extension As String = FilePath.AfterLast(".").ToLower
If Extension = "xaml" Then
Log("[System] 文件后缀为 XAML,作为主页加载")
If File.Exists(ExePath & "PCL\Custom.xaml") Then
If MyMsgBox("已存在一个主页文件,是否要将它覆盖?", "覆盖确认", "覆盖", "取消") = 2 Then
Return
End If
End If
CopyFile(FilePath, ExePath & "PCL\Custom.xaml")
RunInUi(
Sub()
Setup.Set("UiCustomType", 1)
FrmLaunchRight.ForceRefresh()
Hint("已加载主页自定义文件!", HintType.Finish)
End Sub)
Return
End If
'安装 Mod
If PageInstanceCompResource.InstallMods(FilePathList) Then Exit Sub
'安装投影文件
If {"litematic", "nbt", "schematic", "schem"}.Contains(Extension) Then
Log($"[System] 文件为 {Extension} 格式,尝试作为原理图安装")
' 获取当前文件夹路径(如果在资源管理页面)
Dim targetFolderPath As String = Nothing
If PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.VersionSchematic AndAlso
FrmInstanceSchematic IsNot Nothing AndAlso TypeOf FrmInstanceSchematic Is PageInstanceCompResource Then
targetFolderPath = DirectCast(FrmInstanceSchematic, PageInstanceCompResource).CurrentFolderPath
End If
PageInstanceCompResource.InstallCompFiles(FilePathList, CompType.Schematic, targetFolderPath)
Exit Sub
End If
'处理资源安装
If PageCurrent = PageType.InstanceSetup AndAlso {"zip"}.Any(Function(i) i = Extension) Then
Select Case PageCurrentSub
Case PageSubType.VersionWorld
Dim DestFolder = PageInstanceLeft.Instance.PathIndie + "saves\" + GetFileNameWithoutExtentionFromPath(FilePath)
If Directory.Exists(DestFolder) Then
Hint("发现同名文件夹,无法粘贴:" + DestFolder, HintType.Critical)
Exit Sub
End If
ExtractFile(FilePath, DestFolder)
Hint($"已导入 {GetFileNameWithoutExtentionFromPath(FilePath)}", HintType.Finish)
If FrmInstanceSaves IsNot Nothing Then RunInUi(Sub() FrmInstanceSaves.Reload())
Exit Sub
Case PageSubType.VersionResourcePack
Dim DestFile = PageInstanceLeft.Instance.PathIndie + "resourcepacks\" + GetFileNameFromPath(FilePath)
If File.Exists(DestFile) Then
Hint("已存在同名文件:" + DestFile, HintType.Critical)
Exit Sub
End If
CopyFile(FilePath, DestFile)
Hint($"已导入 {GetFileNameFromPath(FilePath)}", HintType.Finish)
If FrmInstanceResourcePack IsNot Nothing Then RunInUi(Sub() FrmInstanceResourcePack.ReloadCompFileList())
Exit Sub
Case PageSubType.VersionShader
Dim DestFile = PageInstanceLeft.Instance.PathIndie + "shaderpacks\" + GetFileNameFromPath(FilePath)
If File.Exists(DestFile) Then
Hint("已存在同名文件:" + DestFile, HintType.Critical)
Exit Sub
End If
CopyFile(FilePath, DestFile)
Hint($"已导入 {GetFileNameFromPath(FilePath)}", HintType.Finish)
If FrmInstanceShader IsNot Nothing Then RunInUi(Sub() FrmInstanceShader.ReloadCompFileList())
Exit Sub
End Select
End If
'处理投影文件
If PageCurrent = PageType.InstanceSetup AndAlso {"litematic", "nbt", "schematic", "schem"}.Contains(Extension) AndAlso PageCurrentSub = PageSubType.VersionSchematic Then
Dim DestFile = PageInstanceLeft.Instance.PathIndie + "schematics\" + GetFileNameFromPath(FilePath)
If File.Exists(DestFile) Then
Hint("已存在同名文件:" + DestFile, HintType.Critical)
Exit Sub
End If
Directory.CreateDirectory(PageInstanceLeft.Instance.PathIndie + "schematics\")
CopyFile(FilePath, DestFile)
Hint($"已导入 {GetFileNameFromPath(FilePath)}", HintType.Finish)
If FrmInstanceSchematic IsNot Nothing Then RunInUi(Sub() FrmInstanceSchematic.ReloadCompFileList())
Exit Sub
End If
'安装整合包
If {"zip", "rar", "mrpack"}.Any(Function(t) t = Extension) Then '部分压缩包是 zip 格式但后缀为 rar,总之试一试
Log("[System] 文件为压缩包,尝试作为整合包安装")
Try
ModpackInstall(FilePath)
Return
Catch ex As CancelledException
Return '用户主动取消
Catch ex As Exception
'安装失败,继续往后尝试
End Try
End If
If {"zip", "rar"}.Any(Function(t) t = Extension) Then
Log("[System] 文件为压缩包,尝试作为存档分析")
Try
ReadWorld(FilePath)
Return
Catch ex As CancelledException
Return '是存档,但是损坏了
Catch ex As Exception
'不是存档(或遇到了其他问题),继续往后尝试
End Try
End If
'错误报告分析
Try
Log("[System] 尝试进行错误报告分析")
Dim Analyzer As New CrashAnalyzer(GetUuid())
Analyzer.Import(FilePath)
If Not Analyzer.Prepare() Then Exit Try
Analyzer.Analyze()
Analyzer.Output(True, New List(Of String))
Return
Catch ex As Exception
Log(ex, "自主错误报告分析失败", LogLevel.Feedback)
End Try
'未知操作
Hint("PCL 无法确定应当执行的文件拖拽操作……")
End Sub, "文件拖拽")
End Sub
'接受到 Windows 窗体事件
Public IsSystemTimeChanged As Boolean = False
Private Function WndProc(hwnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr
If msg = 30 Then
Dim NowDate = Date.Now
If NowDate.Date = ApplicationOpenTime.Date Then
Log("[System] 系统时间微调为:" & NowDate.ToLongDateString & " " & NowDate.ToLongTimeString)
IsSystemTimeChanged = False
Else
Log("[System] 系统时间修改为:" & NowDate.ToLongDateString & " " & NowDate.ToLongTimeString)
IsSystemTimeChanged = True
End If
ElseIf msg = 400 * 16 + 2 Then
Log("[System] 收到置顶信息:" & hwnd.ToInt64)
If Not IsWindowLoadFinished Then
Log("[System] 窗口尚未加载完成,忽略置顶请求")
Return IntPtr.Zero
End If
ShowWindowToTop()
handled = True
ElseIf msg = 26 Then 'WM_SETTINGCHANGE
If Marshal.PtrToStringAuto(lParam) = "ImmersiveColorSet" Then
Log($"[System] 系统主题更改,深色模式:{SystemTheme.IsSystemInDarkMode()}")
If Setup.Get("UiDarkMode") = 2 And IsDarkMode <> SystemTheme.IsSystemInDarkMode() Then
ThemeService.RefreshColorMode()
End If
End If
End If
Return IntPtr.Zero
End Function