Imports NetFwTypeLib Public Class PageLinkLeft Private IsLoad As Boolean = False Private IsPageSwitched As Boolean = False '如果在 Loaded 前切换到其他页面,会导致触发 Loaded 时再次切换一次 Private Sub PageLinkLeft_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded If IsLoad Then Exit Sub IsLoad = True '切换默认页面 If IsPageSwitched Then Exit Sub ItemHiper.SetChecked(True, False, False) End Sub Private Sub PageOtherLeft_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.Unloaded IsPageSwitched = False End Sub #Region "Windows 防火墙" '为联机模块添加防火墙通行权限的函数库 '不加防火墙权限你要我怎么办,这联机根本连都连不上,球球你们别看到防火墙就说是后门了,真的很恼火…… ''' ''' 获取某个文件是否被 Windows 防火墙阻止。 ''' Public Shared Function FirewallIsBlock(FilePath As String) As Boolean '获取配置 If FirewallPolicy Is Nothing Then Try FirewallPolicy = FirewallPolicyGet() Catch ex As Exception Log(ex, "Windows 防火墙:可能关闭得太死了,根本检测不到,笑死", LogLevel.Normal) Return False End Try End If '检查是否开启 If Not FirewallPolicy.CurrentProfile.FirewallEnabled Then Log("[Link] Windows 防火墙:防火墙关闭") Return False End If '检查是否允许例外 If FirewallPolicy.CurrentProfile.ExceptionsNotAllowed Then Log("[Link] Windows 防火墙:防火墙开启,不允许例外") Return True End If '检查白名单 Dim Target As String = FilePath.Replace(PathTemp.Split("\").First, "").ToLower For Each App As INetFwAuthorizedApplication In FirewallPolicy.CurrentProfile.AuthorizedApplications If ModeDebug Then Log("[Link] 防火墙白名单(" & App.Enabled & "):" & App.ProcessImageFileName) If Not App.Enabled Then Continue For '信标的奇妙盘符 E:0/xxxxx/xxx 导致误判…… Dim FileNameTrimmed As String = App.ProcessImageFileName.Replace(App.ProcessImageFileName.Split("\").First, "") If App.ProcessImageFileName.ToLower.Contains(FilePath) Then Log("[Link] Windows 防火墙:开启,已在白名单中(" & FilePath & ")") Return False End If Next Log("[Link] Windows 防火墙:开启,未在白名单中(" & FilePath & ")") Return True End Function ''' ''' 添加防火墙通行权限。需要管理员权限。 ''' Public Shared Sub FirewallAddAuthorized(DisplayName As String, FilePath As String) Log("[Link] Windows 防火墙:添加通行权限(" & FilePath & ")") '获取配置 If FirewallPolicy Is Nothing Then FirewallPolicy = FirewallPolicyGet() '添加项目 FirewallPolicy.GetProfileByType(NET_FW_PROFILE_TYPE_.NET_FW_PROFILE_DOMAIN).AuthorizedApplications.Add(New FirewallApp(DisplayName, FilePath)) FirewallPolicy.GetProfileByType(NET_FW_PROFILE_TYPE_.NET_FW_PROFILE_STANDARD).AuthorizedApplications.Add(New FirewallApp(DisplayName, FilePath)) FirewallPolicy.CurrentProfile.AuthorizedApplications.Add(New FirewallApp(DisplayName, FilePath)) End Sub Private Class FirewallApp Implements INetFwAuthorizedApplication Public Property Name As String Implements INetFwAuthorizedApplication.Name Public Property ProcessImageFileName As String Implements INetFwAuthorizedApplication.ProcessImageFileName Public Property IpVersion As NET_FW_IP_VERSION_ = NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY Implements INetFwAuthorizedApplication.IpVersion Public Property Scope As NET_FW_SCOPE_ = NET_FW_SCOPE_.NET_FW_SCOPE_ALL Implements INetFwAuthorizedApplication.Scope Public Property RemoteAddresses As String = "*" Implements INetFwAuthorizedApplication.RemoteAddresses Public Property Enabled As Boolean = True Implements INetFwAuthorizedApplication.Enabled Public Sub New(DisplayName As String, FilePath As String) Name = DisplayName ProcessImageFileName = FilePath End Sub End Class '获取防火墙配置 Public Shared FirewallPolicy As INetFwPolicy = Nothing Public Shared Function FirewallPolicyGet() As INetFwPolicy Const CLSID_FIREWALL_MANAGER As String = "{304CE942-6E39-40D8-943A-B913C40C9CD4}" Dim objType As Type = Type.GetTypeFromCLSID(New Guid(CLSID_FIREWALL_MANAGER)) Return TryCast(Activator.CreateInstance(objType), INetFwMgr).LocalPolicy End Function #End Region #Region "页面切换" ''' ''' 当前页面的编号。 ''' Public PageID As FormMain.PageSubType = FormMain.PageSubType.LinkHiper ''' ''' 勾选事件改变页面。 ''' Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemHiper.Check, ItemIoi.Check, ItemSetup.Check, ItemHelp.Check, ItemFeedback.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) End Sub Public Function PageGet(Optional ID As FormMain.PageSubType = -1) If ID = -1 Then ID = PageID Select Case ID Case 0, FormMain.PageSubType.LinkHiper If FrmLinkHiper Is Nothing Then FrmLinkHiper = New PageLinkHiper Return FrmLinkHiper Case FormMain.PageSubType.LinkIoi If FrmLinkIoi Is Nothing Then FrmLinkIoi = New PageLinkIoi Return FrmLinkIoi Case FormMain.PageSubType.LinkSetup If FrmSetupLink Is Nothing Then FrmSetupLink = New PageSetupLink Return FrmSetupLink Case FormMain.PageSubType.LinkHelp If FrmLinkHelp Is Nothing Then FrmLinkHelp = PageOtherHelp.GetHelpPage(PathTemp & "Help\启动器\联机.json") Return FrmLinkHelp Case FormMain.PageSubType.LinkFeedback If FrmLinkFeedback Is Nothing Then FrmLinkFeedback = New PageLinkFeedback Return FrmLinkFeedback Case Else Throw New Exception("未知的更多子页面种类:" & ID) End Select End Function ''' ''' 切换现有页面。 ''' Public Sub PageChange(ID As FormMain.PageSubType) If PageID = ID Then Exit Sub AniControlEnabled += 1 IsPageSwitched = True Try PageChangeRun(PageGet(ID)) PageID = ID Catch ex As Exception Log(ex, "切换设置分页面失败(ID " & ID & ")", LogLevel.Feedback) Finally AniControlEnabled -= 1 End Try End Sub Private Shared Sub PageChangeRun(Target As MyPageRight) AniStop("FrmMain PageChangeRight") '停止主页面的右页面切换动画,防止它与本动画一起触发多次 PageOnEnter If Target.Parent IsNot Nothing Then Target.SetValue(ContentPresenter.ContentProperty, Nothing) FrmMain.PageRight = Target CType(FrmMain.PanMainRight.Child, MyPageRight).PageOnExit() AniStart({ AaCode(Sub() CType(FrmMain.PanMainRight.Child, MyPageRight).PageOnForceExit() FrmMain.PanMainRight.Child = FrmMain.PageRight FrmMain.PageRight.Opacity = 0 End Sub, 130), AaCode(Sub() '延迟触发页面通用动画,以使得在 Loaded 事件中加载的控件得以处理 FrmMain.PageRight.Opacity = 1 FrmMain.PageRight.PageOnEnter() End Sub, 30, True) }, "PageLeft PageChange") End Sub #End Region Public Sub Reset(sender As Object, e As EventArgs) If MyMsgBox("是否要初始化联机页的所有设置?该操作不可撤销。", "初始化确认",, "取消", IsWarn:=True) = 1 Then If IsNothing(FrmSetupLink) Then FrmSetupLink = New PageSetupLink FrmSetupLink.Reset() End If End Sub Private Sub BtnHiperStop_Loaded(sender As Object, e As RoutedEventArgs) sender.Visibility = If(PageLinkHiper.HiperState = LoadState.Finished OrElse PageLinkHiper.HiperState = LoadState.Loading, Visibility.Visible, Visibility.Collapsed) End Sub Private Sub BtnHiperStop_Click(sender As Object, e As EventArgs) PageLinkHiper.ModuleStopManually() End Sub Private Sub BtnIoiStop_Loaded(sender As Object, e As RoutedEventArgs) sender.Visibility = If(PageLinkIoi.InitLoader.State = LoadState.Finished, Visibility.Visible, Visibility.Collapsed) End Sub Private Sub BtnIoiStop_Click(sender As Object, e As EventArgs) PageLinkIoi.ModuleStopManually() End Sub End Class