PageLinkLeft.xaml.vb 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. Imports NetFwTypeLib
  2. Public Class PageLinkLeft
  3. Private IsLoad As Boolean = False
  4. Private IsPageSwitched As Boolean = False '如果在 Loaded 前切换到其他页面,会导致触发 Loaded 时再次切换一次
  5. Private Sub PageLinkLeft_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  6. If IsLoad Then Exit Sub
  7. IsLoad = True
  8. '切换默认页面
  9. If IsPageSwitched Then Exit Sub
  10. ItemHiper.SetChecked(True, False, False)
  11. End Sub
  12. Private Sub PageOtherLeft_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded
  13. IsPageSwitched = False
  14. End Sub
  15. #Region "Windows 防火墙"
  16. '为联机模块添加防火墙通行权限的函数库
  17. '不加防火墙权限你要我怎么办,这联机根本连都连不上,球球你们别看到防火墙就说是后门了,真的很恼火……
  18. ''' <summary>
  19. ''' 获取某个文件是否被 Windows 防火墙阻止。
  20. ''' </summary>
  21. Public Shared Function FirewallIsBlock(FilePath As String) As Boolean
  22. '获取配置
  23. If FirewallPolicy Is Nothing Then
  24. Try
  25. FirewallPolicy = FirewallPolicyGet()
  26. Catch ex As Exception
  27. Log(ex, "Windows 防火墙:可能关闭得太死了,根本检测不到,笑死", LogLevel.Normal)
  28. Return False
  29. End Try
  30. End If
  31. '检查是否开启
  32. If Not FirewallPolicy.CurrentProfile.FirewallEnabled Then
  33. Log("[Link] Windows 防火墙:防火墙关闭")
  34. Return False
  35. End If
  36. '检查是否允许例外
  37. If FirewallPolicy.CurrentProfile.ExceptionsNotAllowed Then
  38. Log("[Link] Windows 防火墙:防火墙开启,不允许例外")
  39. Return True
  40. End If
  41. '检查白名单
  42. Dim Target As String = FilePath.Replace(PathTemp.Split("\").First, "").ToLower
  43. For Each App As INetFwAuthorizedApplication In FirewallPolicy.CurrentProfile.AuthorizedApplications
  44. If ModeDebug Then Log("[Link] 防火墙白名单(" & App.Enabled & "):" & App.ProcessImageFileName)
  45. If Not App.Enabled Then Continue For
  46. '信标的奇妙盘符 E:0/xxxxx/xxx 导致误判……
  47. Dim FileNameTrimmed As String = App.ProcessImageFileName.Replace(App.ProcessImageFileName.Split("\").First, "")
  48. If App.ProcessImageFileName.ToLower.Contains(FilePath) Then
  49. Log("[Link] Windows 防火墙:开启,已在白名单中(" & FilePath & ")")
  50. Return False
  51. End If
  52. Next
  53. Log("[Link] Windows 防火墙:开启,未在白名单中(" & FilePath & ")")
  54. Return True
  55. End Function
  56. ''' <summary>
  57. ''' 添加防火墙通行权限。需要管理员权限。
  58. ''' </summary>
  59. Public Shared Sub FirewallAddAuthorized(DisplayName As String, FilePath As String)
  60. Log("[Link] Windows 防火墙:添加通行权限(" & FilePath & ")")
  61. '获取配置
  62. If FirewallPolicy Is Nothing Then FirewallPolicy = FirewallPolicyGet()
  63. '添加项目
  64. FirewallPolicy.GetProfileByType(NET_FW_PROFILE_TYPE_.NET_FW_PROFILE_DOMAIN).AuthorizedApplications.Add(New FirewallApp(DisplayName, FilePath))
  65. FirewallPolicy.GetProfileByType(NET_FW_PROFILE_TYPE_.NET_FW_PROFILE_STANDARD).AuthorizedApplications.Add(New FirewallApp(DisplayName, FilePath))
  66. FirewallPolicy.CurrentProfile.AuthorizedApplications.Add(New FirewallApp(DisplayName, FilePath))
  67. End Sub
  68. Private Class FirewallApp
  69. Implements INetFwAuthorizedApplication
  70. Public Property Name As String Implements INetFwAuthorizedApplication.Name
  71. Public Property ProcessImageFileName As String Implements INetFwAuthorizedApplication.ProcessImageFileName
  72. Public Property IpVersion As NET_FW_IP_VERSION_ = NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY Implements INetFwAuthorizedApplication.IpVersion
  73. Public Property Scope As NET_FW_SCOPE_ = NET_FW_SCOPE_.NET_FW_SCOPE_ALL Implements INetFwAuthorizedApplication.Scope
  74. Public Property RemoteAddresses As String = "*" Implements INetFwAuthorizedApplication.RemoteAddresses
  75. Public Property Enabled As Boolean = True Implements INetFwAuthorizedApplication.Enabled
  76. Public Sub New(DisplayName As String, FilePath As String)
  77. Name = DisplayName
  78. ProcessImageFileName = FilePath
  79. End Sub
  80. End Class
  81. '获取防火墙配置
  82. Public Shared FirewallPolicy As INetFwPolicy = Nothing
  83. Public Shared Function FirewallPolicyGet() As INetFwPolicy
  84. Const CLSID_FIREWALL_MANAGER As String = "{304CE942-6E39-40D8-943A-B913C40C9CD4}"
  85. Dim objType As Type = Type.GetTypeFromCLSID(New Guid(CLSID_FIREWALL_MANAGER))
  86. Return TryCast(Activator.CreateInstance(objType), INetFwMgr).LocalPolicy
  87. End Function
  88. #End Region
  89. #Region "页面切换"
  90. ''' <summary>
  91. ''' 当前页面的编号。
  92. ''' </summary>
  93. Public PageID As FormMain.PageSubType = FormMain.PageSubType.LinkHiper
  94. ''' <summary>
  95. ''' 勾选事件改变页面。
  96. ''' </summary>
  97. Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemHiper.Check, ItemIoi.Check, ItemSetup.Check, ItemHelp.Check, ItemFeedback.Check
  98. '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0
  99. '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False)
  100. If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag))
  101. End Sub
  102. Public Function PageGet(Optional ID As FormMain.PageSubType = -1)
  103. If ID = -1 Then ID = PageID
  104. Select Case ID
  105. Case 0, FormMain.PageSubType.LinkHiper
  106. If FrmLinkHiper Is Nothing Then FrmLinkHiper = New PageLinkHiper
  107. Return FrmLinkHiper
  108. Case FormMain.PageSubType.LinkIoi
  109. If FrmLinkIoi Is Nothing Then FrmLinkIoi = New PageLinkIoi
  110. Return FrmLinkIoi
  111. Case FormMain.PageSubType.LinkSetup
  112. If FrmSetupLink Is Nothing Then FrmSetupLink = New PageSetupLink
  113. Return FrmSetupLink
  114. Case FormMain.PageSubType.LinkHelp
  115. If FrmLinkHelp Is Nothing Then FrmLinkHelp = PageOtherHelp.GetHelpPage(PathTemp & "Help\启动器\联机.json")
  116. Return FrmLinkHelp
  117. Case FormMain.PageSubType.LinkFeedback
  118. If FrmLinkFeedback Is Nothing Then FrmLinkFeedback = New PageLinkFeedback
  119. Return FrmLinkFeedback
  120. Case Else
  121. Throw New Exception("未知的更多子页面种类:" & ID)
  122. End Select
  123. End Function
  124. ''' <summary>
  125. ''' 切换现有页面。
  126. ''' </summary>
  127. Public Sub PageChange(ID As FormMain.PageSubType)
  128. If PageID = ID Then Exit Sub
  129. AniControlEnabled += 1
  130. IsPageSwitched = True
  131. Try
  132. PageChangeRun(PageGet(ID))
  133. PageID = ID
  134. Catch ex As Exception
  135. Log(ex, "切换设置分页面失败(ID " & ID & ")", LogLevel.Feedback)
  136. Finally
  137. AniControlEnabled -= 1
  138. End Try
  139. End Sub
  140. Private Shared Sub PageChangeRun(Target As MyPageRight)
  141. AniStop("FrmMain PageChangeRight") '停止主页面的右页面切换动画,防止它与本动画一起触发多次 PageOnEnter
  142. If Target.Parent IsNot Nothing Then Target.SetValue(ContentPresenter.ContentProperty, Nothing)
  143. FrmMain.PageRight = Target
  144. CType(FrmMain.PanMainRight.Child, MyPageRight).PageOnExit()
  145. AniStart({
  146. AaCode(Sub()
  147. CType(FrmMain.PanMainRight.Child, MyPageRight).PageOnForceExit()
  148. FrmMain.PanMainRight.Child = FrmMain.PageRight
  149. FrmMain.PageRight.Opacity = 0
  150. End Sub, 130),
  151. AaCode(Sub()
  152. '延迟触发页面通用动画,以使得在 Loaded 事件中加载的控件得以处理
  153. FrmMain.PageRight.Opacity = 1
  154. FrmMain.PageRight.PageOnEnter()
  155. End Sub, 30, True)
  156. }, "PageLeft PageChange")
  157. End Sub
  158. #End Region
  159. Public Sub Reset(sender As Object, e As EventArgs)
  160. If MyMsgBox("是否要初始化联机页的所有设置?该操作不可撤销。", "初始化确认",, "取消", IsWarn:=True) = 1 Then
  161. If IsNothing(FrmSetupLink) Then FrmSetupLink = New PageSetupLink
  162. FrmSetupLink.Reset()
  163. End If
  164. End Sub
  165. Private Sub BtnHiperStop_Loaded(sender As Object, e As RoutedEventArgs)
  166. sender.Visibility = If(PageLinkHiper.HiperState = LoadState.Finished OrElse PageLinkHiper.HiperState = LoadState.Loading, Visibility.Visible, Visibility.Collapsed)
  167. End Sub
  168. Private Sub BtnHiperStop_Click(sender As Object, e As EventArgs)
  169. PageLinkHiper.ModuleStopManually()
  170. End Sub
  171. Private Sub BtnIoiStop_Loaded(sender As Object, e As RoutedEventArgs)
  172. sender.Visibility = If(PageLinkIoi.InitLoader.State = LoadState.Finished, Visibility.Visible, Visibility.Collapsed)
  173. End Sub
  174. Private Sub BtnIoiStop_Click(sender As Object, e As EventArgs)
  175. PageLinkIoi.ModuleStopManually()
  176. End Sub
  177. End Class