A:增加Web窗口分析展示
This commit is contained in:
1 parent
7655d25080
commit
355dd1044f
3 files changed
+304
-2
No files matched your search
@@ -8,8 +8,8 @@
|
|||||||
xmlns:userControls="clr-namespace:Shell.UserControls"
|
xmlns:userControls="clr-namespace:Shell.UserControls"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="NetVizor - 网速监控"
|
Title="NetVizor - 网速监控"
|
||||||
Height="60"
|
Height="70"
|
||||||
Width="100"
|
Width="120"
|
||||||
WindowStyle="None"
|
WindowStyle="None"
|
||||||
AllowsTransparency="True"
|
AllowsTransparency="True"
|
||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
<Window
|
||||||
|
x:Class="Shell.Views.TrafficAnalysisWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:userControls="clr-namespace:Shell.UserControls"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Title="流量统计与分析 - NetVizor"
|
||||||
|
Height="800"
|
||||||
|
Width="1200"
|
||||||
|
MinHeight="600"
|
||||||
|
MinWidth="800"
|
||||||
|
WindowStartupLocation="CenterScreen"
|
||||||
|
Icon="pack://application:,,,/Assets/Icons/app.ico">
|
||||||
|
|
||||||
|
<Window.Resources>
|
||||||
|
<Style x:Key="ModernWindowStyle" TargetType="Window">
|
||||||
|
<Setter Property="Background" Value="#F5F5F5"/>
|
||||||
|
<Setter Property="BorderBrush" Value="#E0E0E0"/>
|
||||||
|
<Setter Property="BorderThickness" Value="1"/>
|
||||||
|
</Style>
|
||||||
|
</Window.Resources>
|
||||||
|
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="*"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<!-- Header -->
|
||||||
|
<Border Grid.Row="0" Background="#2C3E50" Padding="15,10">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<StackPanel Grid.Column="0" Orientation="Horizontal">
|
||||||
|
<TextBlock Text="" FontFamily="Segoe Fluent Icons"
|
||||||
|
FontSize="20" Foreground="White"
|
||||||
|
VerticalAlignment="Center" Margin="0,0,10,0"/>
|
||||||
|
<TextBlock Text="流量统计与分析" FontSize="18"
|
||||||
|
FontWeight="SemiBold" Foreground="White"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<TextBlock Grid.Column="1" Text="网络流量实时监控与深度分析"
|
||||||
|
FontSize="12" Foreground="#BDC3C7"
|
||||||
|
VerticalAlignment="Center" HorizontalAlignment="Center"/>
|
||||||
|
|
||||||
|
<StackPanel Grid.Column="2" Orientation="Horizontal">
|
||||||
|
<Button Content="刷新" Click="Refresh_Click"
|
||||||
|
Style="{DynamicResource ModernButtonStyle}"
|
||||||
|
Margin="0,0,10,0" Padding="10,5"/>
|
||||||
|
<Button Content="关闭" Click="Close_Click"
|
||||||
|
Style="{DynamicResource ModernButtonStyle}"
|
||||||
|
Padding="10,5"/>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- Main Content - WebPanel -->
|
||||||
|
<Border Grid.Row="1" Background="White" BorderBrush="#E0E0E0" BorderThickness="0,1,0,1">
|
||||||
|
<userControls:WebPanel x:Name="WebPanel" />
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
<Border Grid.Row="2" Background="#34495E" Padding="10,5">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<TextBlock Grid.Column="0" Text="需要管理员权限以获取完整的网络统计信息"
|
||||||
|
FontSize="11" Foreground="#BDC3C7"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
|
||||||
|
<StackPanel Grid.Column="1" Orientation="Horizontal">
|
||||||
|
<TextBlock Text="状态: " FontSize="11" Foreground="#BDC3C7"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
<TextBlock x:Name="StatusText" Text="正在加载..." FontSize="11"
|
||||||
|
Foreground="#27AE60" VerticalAlignment="Center"/>
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
||||||
@@ -0,0 +1,211 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Security.Principal;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
using Common.Logger;
|
||||||
|
|
||||||
|
namespace Shell.Views;
|
||||||
|
|
||||||
|
public partial class TrafficAnalysisWindow : Window
|
||||||
|
{
|
||||||
|
private static TrafficAnalysisWindow? _instance;
|
||||||
|
private static bool _hasRequestedElevation = false;
|
||||||
|
|
||||||
|
// Win32 API for checking admin rights
|
||||||
|
[DllImport("shell32.dll")]
|
||||||
|
static extern bool IsUserAnAdmin();
|
||||||
|
|
||||||
|
public static TrafficAnalysisWindow Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_instance == null || !_instance.IsLoaded)
|
||||||
|
{
|
||||||
|
_instance = new TrafficAnalysisWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TrafficAnalysisWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
this.Loaded += TrafficAnalysisWindow_Loaded;
|
||||||
|
this.Closing += TrafficAnalysisWindow_Closing;
|
||||||
|
|
||||||
|
Log.Info("TrafficAnalysisWindow 初始化");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowWindow()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var window = Instance;
|
||||||
|
|
||||||
|
// Check if we need admin rights and haven't requested yet
|
||||||
|
if (!IsRunningAsAdmin() && !_hasRequestedElevation)
|
||||||
|
{
|
||||||
|
var result = System.Windows.MessageBox.Show(
|
||||||
|
"流量分析功能需要管理员权限以获取完整的网络统计信息。\n\n是否要以管理员身份重新启动应用程序?",
|
||||||
|
"需要管理员权限",
|
||||||
|
MessageBoxButton.YesNo,
|
||||||
|
MessageBoxImage.Question);
|
||||||
|
|
||||||
|
if (result == MessageBoxResult.Yes)
|
||||||
|
{
|
||||||
|
RequestElevation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_hasRequestedElevation = true; // User declined, don't ask again
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.Show();
|
||||||
|
window.Activate();
|
||||||
|
window.Focus();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Error4Ctx($"打开流量分析窗口时发生错误: {ex.Message}");
|
||||||
|
System.Windows.MessageBox.Show($"无法打开流量分析窗口: {ex.Message}", "错误",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsRunningAsAdmin()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return IsUserAnAdmin();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Fallback method
|
||||||
|
var identity = WindowsIdentity.GetCurrent();
|
||||||
|
var principal = new WindowsPrincipal(identity);
|
||||||
|
return principal.IsInRole(WindowsBuiltInRole.Administrator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RequestElevation()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var processInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = Process.GetCurrentProcess().MainModule?.FileName ?? Environment.ProcessPath,
|
||||||
|
UseShellExecute = true,
|
||||||
|
Verb = "runas", // Request elevation
|
||||||
|
Arguments = "--traffic-analysis" // Flag to indicate this was started for traffic analysis
|
||||||
|
};
|
||||||
|
|
||||||
|
Process.Start(processInfo);
|
||||||
|
|
||||||
|
// Close current application
|
||||||
|
System.Windows.Application.Current.Shutdown();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Warning($"请求管理员权限失败: {ex.Message}");
|
||||||
|
System.Windows.MessageBox.Show("无法请求管理员权限。请手动以管理员身份运行程序。", "权限请求失败",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||||
|
_hasRequestedElevation = true; // Don't ask again in this session
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TrafficAnalysisWindow_Loaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Log.Info("TrafficAnalysisWindow 加载完成");
|
||||||
|
|
||||||
|
// Update status based on admin rights
|
||||||
|
UpdateStatus();
|
||||||
|
|
||||||
|
// Initialize WebPanel if needed
|
||||||
|
InitializeWebPanel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateStatus()
|
||||||
|
{
|
||||||
|
if (IsRunningAsAdmin())
|
||||||
|
{
|
||||||
|
StatusText.Text = "管理员模式 - 完整功能可用";
|
||||||
|
StatusText.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Green);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StatusText.Text = "普通模式 - 功能受限";
|
||||||
|
StatusText.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Orange);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeWebPanel()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// WebPanel should automatically load the Vue3 application
|
||||||
|
// The WebView2 control will handle the web content
|
||||||
|
Log.Info("WebPanel 初始化完成");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Error4Ctx($"WebPanel 初始化失败: {ex.Message}");
|
||||||
|
StatusText.Text = "初始化失败";
|
||||||
|
StatusText.Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Red);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TrafficAnalysisWindow_Closing(object sender, CancelEventArgs e)
|
||||||
|
{
|
||||||
|
// Don't actually close, just hide the window for better performance
|
||||||
|
e.Cancel = true;
|
||||||
|
this.Hide();
|
||||||
|
Log.Info("TrafficAnalysisWindow 隐藏");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Refresh_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Refresh the WebPanel content
|
||||||
|
if (WebPanel != null)
|
||||||
|
{
|
||||||
|
// The WebPanel should handle its own refresh logic
|
||||||
|
Log.Info("刷新流量分析数据");
|
||||||
|
StatusText.Text = "正在刷新...";
|
||||||
|
|
||||||
|
// Use a timer to reset status after refresh
|
||||||
|
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };
|
||||||
|
timer.Tick += (s, args) =>
|
||||||
|
{
|
||||||
|
UpdateStatus();
|
||||||
|
timer.Stop();
|
||||||
|
};
|
||||||
|
timer.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Error4Ctx($"刷新失败: {ex.Message}");
|
||||||
|
System.Windows.MessageBox.Show($"刷新失败: {ex.Message}", "错误",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Close_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
this.Hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force close method for application shutdown
|
||||||
|
public void ForceClose()
|
||||||
|
{
|
||||||
|
this.Closing -= TrafficAnalysisWindow_Closing; // Remove the cancel logic
|
||||||
|
this.Close();
|
||||||
|
_instance = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user