mirror of
https://github.com/ckaczor/ProcessCpuUsageStatusWindow.git
synced 2026-01-14 01:25:41 -05:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| eebd23f702 | |||
| ebd9dc607b | |||
| f93983e992 |
63
App.config
63
App.config
@@ -1,30 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="ProcessCpuUsageStatusWindow.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
||||
</startup>
|
||||
<userSettings>
|
||||
<ProcessCpuUsageStatusWindow.Properties.Settings>
|
||||
<setting name="ProcessCount" serializeAs="String">
|
||||
<value>3</value>
|
||||
</setting>
|
||||
<setting name="UpdateInterval" serializeAs="String">
|
||||
<value>00:00:02</value>
|
||||
</setting>
|
||||
<setting name="WindowSettings" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="AutoStart" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="FirstRun" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
</ProcessCpuUsageStatusWindow.Properties.Settings>
|
||||
</userSettings>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings"
|
||||
type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<section name="ProcessCpuUsageStatusWindow.Properties.Settings"
|
||||
type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
|
||||
allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
||||
</startup>
|
||||
<userSettings>
|
||||
<ProcessCpuUsageStatusWindow.Properties.Settings>
|
||||
<setting name="ProcessCount" serializeAs="String">
|
||||
<value>3</value>
|
||||
</setting>
|
||||
<setting name="UpdateInterval" serializeAs="String">
|
||||
<value>00:00:02</value>
|
||||
</setting>
|
||||
<setting name="WindowSettings" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="AutoStart" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="FirstRun" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="ShowProcessId" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</ProcessCpuUsageStatusWindow.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
@@ -15,6 +15,7 @@
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"></RowDefinition>
|
||||
<RowDefinition Height="Auto"></RowDefinition>
|
||||
<RowDefinition Height="Auto"></RowDefinition>
|
||||
<RowDefinition Height="*"></RowDefinition>
|
||||
@@ -23,20 +24,34 @@
|
||||
Name="StartWithWindows"
|
||||
VerticalAlignment="Top"
|
||||
VerticalContentAlignment="Center"
|
||||
Grid.Column="0"
|
||||
Grid.Row="0"
|
||||
Grid.ColumnSpan="2" />
|
||||
<Label Grid.Column="0"
|
||||
Grid.Row="1"
|
||||
Content="{x:Static properties:Resources.NumberOfProcesses}"
|
||||
Margin="0,4,6,0"
|
||||
Margin="0,4,6,4"
|
||||
Padding="0"
|
||||
VerticalContentAlignment="Center" VerticalAlignment="Center" Target="{x:Reference NumberOfProcesses}" />
|
||||
VerticalContentAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
Target="{x:Reference NumberOfProcesses}" />
|
||||
<xctk:IntegerUpDown Grid.Column="1"
|
||||
Grid.Row="1" x:Name="NumberOfProcesses"
|
||||
Minimum="1" Maximum="20"
|
||||
TextAlignment="Left" Margin="0,12,6,6"
|
||||
Grid.Row="1"
|
||||
x:Name="NumberOfProcesses"
|
||||
Minimum="1"
|
||||
Maximum="20"
|
||||
TextAlignment="Left"
|
||||
Margin="0,12,6,12"
|
||||
Width="50"
|
||||
VerticalContentAlignment="Center"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Left" />
|
||||
<CheckBox Content="{x:Static properties:Resources.ShowProcessId}"
|
||||
Name="ShowProcessId"
|
||||
VerticalAlignment="Top"
|
||||
VerticalContentAlignment="Center"
|
||||
Grid.Column="0"
|
||||
Grid.Row="2"
|
||||
Grid.ColumnSpan="2" />
|
||||
</Grid>
|
||||
</windows:CategoryPanel>
|
||||
@@ -5,9 +5,13 @@ namespace ProcessCpuUsageStatusWindow.Options
|
||||
{
|
||||
public partial class GeneralOptionsPanel
|
||||
{
|
||||
public GeneralOptionsPanel()
|
||||
private bool IsV2 { get; }
|
||||
|
||||
public GeneralOptionsPanel(bool isV2)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
IsV2 = isV2;
|
||||
}
|
||||
|
||||
public override void LoadPanel(object data)
|
||||
@@ -18,6 +22,9 @@ namespace ProcessCpuUsageStatusWindow.Options
|
||||
|
||||
StartWithWindows.IsChecked = settings.AutoStart;
|
||||
NumberOfProcesses.Text = settings.ProcessCount.ToString();
|
||||
ShowProcessId.IsChecked = settings.ShowProcessId;
|
||||
|
||||
ShowProcessId.Visibility = IsV2 ? Visibility.Visible : Visibility.Collapsed;
|
||||
}
|
||||
|
||||
public override bool ValidatePanel()
|
||||
@@ -34,6 +41,9 @@ namespace ProcessCpuUsageStatusWindow.Options
|
||||
|
||||
settings.ProcessCount = int.Parse(NumberOfProcesses.Text);
|
||||
|
||||
if (ShowProcessId.IsChecked.HasValue && settings.ShowProcessId != ShowProcessId.IsChecked.Value)
|
||||
settings.ShowProcessId = ShowProcessId.IsChecked.Value;
|
||||
|
||||
Application.Current.SetStartWithWindows(settings.AutoStart);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@ namespace ProcessCpuUsageStatusWindow
|
||||
|
||||
public Dictionary<string, ProcessCpuUsage> CurrentProcessList;
|
||||
|
||||
public bool IsV2 => _processCategory.CategoryName == "Process V2";
|
||||
|
||||
#endregion
|
||||
|
||||
#region Initialize and terminate
|
||||
@@ -40,18 +42,19 @@ namespace ProcessCpuUsageStatusWindow
|
||||
CurrentProcessList = new Dictionary<string, ProcessCpuUsage>();
|
||||
|
||||
// Get the category for process performance info
|
||||
_processCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == "Process");
|
||||
_processCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == "Process V2") ??
|
||||
PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == "Process");
|
||||
|
||||
if (_processCategory == null)
|
||||
return;
|
||||
|
||||
// Read the entire category
|
||||
InstanceDataCollectionCollection processCategoryData = _processCategory.ReadCategory();
|
||||
var processCategoryData = _processCategory.ReadCategory();
|
||||
|
||||
// Get the processor time data
|
||||
InstanceDataCollection processorTimeData = processCategoryData["% processor time"];
|
||||
var processorTimeData = processCategoryData["% processor time"];
|
||||
|
||||
if (processorTimeData == null || processorTimeData.Values == null)
|
||||
if (processorTimeData?.Values == null)
|
||||
return;
|
||||
|
||||
// Loop over each instance and add it to the list
|
||||
@@ -109,15 +112,15 @@ namespace ProcessCpuUsageStatusWindow
|
||||
private void UpdateCurrentProcessList()
|
||||
{
|
||||
// Get a timestamp for the current time that we can use to see if a process was found this check
|
||||
DateTime checkStart = DateTime.Now;
|
||||
var checkStart = DateTime.Now;
|
||||
|
||||
// Read the entire category
|
||||
InstanceDataCollectionCollection processCategoryData = _processCategory.ReadCategory();
|
||||
var processCategoryData = _processCategory.ReadCategory();
|
||||
|
||||
// Get the processor time data
|
||||
InstanceDataCollection processorTimeData = processCategoryData["% processor time"];
|
||||
var processorTimeData = processCategoryData["% processor time"];
|
||||
|
||||
if (processorTimeData == null || processorTimeData.Values == null)
|
||||
if (processorTimeData?.Values == null)
|
||||
return;
|
||||
|
||||
// Loop over each instance and add it to the list
|
||||
@@ -127,7 +130,7 @@ namespace ProcessCpuUsageStatusWindow
|
||||
if (CurrentProcessList.ContainsKey(instanceData.InstanceName))
|
||||
{
|
||||
// Get the previous process usage object
|
||||
ProcessCpuUsage processCpuUsage = CurrentProcessList[instanceData.InstanceName];
|
||||
var processCpuUsage = CurrentProcessList[instanceData.InstanceName];
|
||||
|
||||
// Update the CPU usage with new data
|
||||
processCpuUsage.UpdateCpuUsage(instanceData, checkStart);
|
||||
@@ -144,8 +147,8 @@ namespace ProcessCpuUsageStatusWindow
|
||||
|
||||
// Build a list of cached processes we haven't found this check
|
||||
var oldProcessList = (from processCpuUsage in CurrentProcessList
|
||||
where processCpuUsage.Value.LastFound != checkStart
|
||||
select processCpuUsage.Key).ToList();
|
||||
where processCpuUsage.Value.LastFound != checkStart
|
||||
select processCpuUsage.Key).ToList();
|
||||
|
||||
// Loop over the list and remove the old process
|
||||
foreach (var key in oldProcessList)
|
||||
|
||||
20
Properties/Resources.Designer.cs
generated
20
Properties/Resources.Designer.cs
generated
@@ -19,7 +19,7 @@ namespace ProcessCpuUsageStatusWindow.Properties {
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
public class Resources {
|
||||
@@ -233,6 +233,15 @@ namespace ProcessCpuUsageStatusWindow.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to CPU: {1,4:f1}% - {0} ({2}).
|
||||
/// </summary>
|
||||
public static string ProcessLineWithProcessId {
|
||||
get {
|
||||
return ResourceManager.GetString("ProcessLineWithProcessId", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Restarting application....
|
||||
/// </summary>
|
||||
@@ -242,6 +251,15 @@ namespace ProcessCpuUsageStatusWindow.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Show _process ID.
|
||||
/// </summary>
|
||||
public static string ShowProcessId {
|
||||
get {
|
||||
return ResourceManager.GetString("ShowProcessId", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to _Start when Windows starts.
|
||||
/// </summary>
|
||||
|
||||
@@ -184,4 +184,10 @@
|
||||
<data name="RestartingAfterUpdate" xml:space="preserve">
|
||||
<value>Restarting application...</value>
|
||||
</data>
|
||||
<data name="ProcessLineWithProcessId" xml:space="preserve">
|
||||
<value>CPU: {1,4:f1}% - {0} ({2})</value>
|
||||
</data>
|
||||
<data name="ShowProcessId" xml:space="preserve">
|
||||
<value>Show _process ID</value>
|
||||
</data>
|
||||
</root>
|
||||
14
Properties/Settings.Designer.cs
generated
14
Properties/Settings.Designer.cs
generated
@@ -12,7 +12,7 @@ namespace ProcessCpuUsageStatusWindow.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.5.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
@@ -82,5 +82,17 @@ namespace ProcessCpuUsageStatusWindow.Properties {
|
||||
this["FirstRun"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool ShowProcessId {
|
||||
get {
|
||||
return ((bool)(this["ShowProcessId"]));
|
||||
}
|
||||
set {
|
||||
this["ShowProcessId"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,5 +17,8 @@
|
||||
<Setting Name="FirstRun" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="ShowProcessId" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -2,13 +2,10 @@
|
||||
using FloatingStatusWindowLibrary;
|
||||
using ProcessCpuUsageStatusWindow.Options;
|
||||
using ProcessCpuUsageStatusWindow.Properties;
|
||||
using Squirrel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Threading;
|
||||
|
||||
@@ -65,7 +62,7 @@ namespace ProcessCpuUsageStatusWindow
|
||||
{
|
||||
var panels = new List<CategoryPanel>
|
||||
{
|
||||
new GeneralOptionsPanel(),
|
||||
new GeneralOptionsPanel(_processCpuUsageWatcher.IsV2),
|
||||
new AboutOptionsPanel()
|
||||
};
|
||||
|
||||
@@ -118,6 +115,7 @@ namespace ProcessCpuUsageStatusWindow
|
||||
{
|
||||
public const string Total = "_Total";
|
||||
public const string Idle = "Idle";
|
||||
public const string IdleWithProcessId = "Idle:0";
|
||||
}
|
||||
|
||||
private void UpdateDisplay(Dictionary<string, ProcessCpuUsage> currentProcessList)
|
||||
@@ -125,14 +123,14 @@ namespace ProcessCpuUsageStatusWindow
|
||||
// Filter the process list to valid ones and exclude the idle and total values
|
||||
var validProcessList = (currentProcessList.Values.Where(
|
||||
process =>
|
||||
process.UsageValid && process.ProcessName != PredefinedProcessName.Total &&
|
||||
process.ProcessName != PredefinedProcessName.Idle)).ToList();
|
||||
process.UsageValid && process.ProcessName != PredefinedProcessName.Total &&
|
||||
process.ProcessName != (_processCpuUsageWatcher.IsV2 ? PredefinedProcessName.IdleWithProcessId : PredefinedProcessName.Idle))).ToList();
|
||||
|
||||
// Calculate the total usage by adding up all the processes we know about
|
||||
var totalUsage = validProcessList.Sum(process => process.PercentUsage);
|
||||
|
||||
// Sort the process list by usage and take only the top few
|
||||
var sortedProcessList = (validProcessList.OrderByDescending(process => process.PercentUsage)).Take(Settings.Default.ProcessCount);
|
||||
var sortedProcessList = validProcessList.OrderByDescending(process => process.PercentUsage).Take(Settings.Default.ProcessCount);
|
||||
|
||||
// Create a new string builder
|
||||
var stringBuilder = new StringBuilder();
|
||||
@@ -146,14 +144,30 @@ namespace ProcessCpuUsageStatusWindow
|
||||
}
|
||||
|
||||
// Loop over all processes in the sorted list
|
||||
foreach (ProcessCpuUsage processCpuUsage in sortedProcessList)
|
||||
foreach (var processCpuUsage in sortedProcessList)
|
||||
{
|
||||
// Move to the next line if it isn't the first line
|
||||
if (stringBuilder.Length != 0)
|
||||
stringBuilder.AppendLine();
|
||||
|
||||
// Format the process information into a string to display
|
||||
stringBuilder.AppendFormat(Resources.ProcessLine, processCpuUsage.ProcessName, processCpuUsage.PercentUsage);
|
||||
if (_processCpuUsageWatcher.IsV2)
|
||||
{
|
||||
// Split the process name from the process ID
|
||||
var colonPosition = processCpuUsage.ProcessName.LastIndexOf(':');
|
||||
|
||||
var processName = processCpuUsage.ProcessName.Substring(0, colonPosition);
|
||||
var processId = processCpuUsage.ProcessName.Substring(colonPosition + 1);
|
||||
|
||||
var formatString = Settings.Default.ShowProcessId ? Resources.ProcessLineWithProcessId : Resources.ProcessLine;
|
||||
|
||||
// Format the process information into a string to display
|
||||
stringBuilder.AppendFormat(formatString, processName, processCpuUsage.PercentUsage, processId);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Format the process information into a string to display
|
||||
stringBuilder.AppendFormat(Resources.ProcessLine, processCpuUsage.ProcessName, processCpuUsage.PercentUsage);
|
||||
}
|
||||
}
|
||||
|
||||
// Add the footer line (if any)
|
||||
|
||||
Reference in New Issue
Block a user