using System.Linq; namespace onitroad { public partial class FormMonitorClipboard : System.Windows.Forms.Form { static string clipboardtext = System.String.Empty; static string progver = System.Reflection.Assembly.GetExecutingAssembly( ).GetName( ).Version.ToString( ); static string title = System.String.Format( "MonitorClipboard, Version {0}", progver ); static string errormessage = System.String.Empty; static bool debugmode = false; static bool modalwindow = true; static int interval = 1; static int[] highestversion = new int[] { 0, 0, 0, 0 }; public FormMonitorClipboard( ) { InitializeComponent( ); } private void FormMonitorClipboard_Load( object sender, System.EventArgs e ) { this.Text = title; ParseCommandLine( ); if ( debugmode ) { DebugInfo( ); } CheckClipboard( ); FormMonitorClipboard.ActiveForm.TopMost = modalwindow; TimerMonitorClipboard.Interval = 1000 * interval; TimerMonitorClipboard.Start( ); } private void CheckClipboard( ) { if ( System.Windows.Forms.Clipboard.ContainsText( ) ) { clipboardtext = System.Windows.Forms.Clipboard.GetText( System.Windows.Forms.TextDataFormat.UnicodeText ); TextBoxClipboardContent.BackColor = System.Drawing.Color.White; TextBoxClipboardContent.ForeColor = System.Drawing.Color.Black; TextBoxClipboardContent.Text = clipboardtext; } else { TextBoxClipboardContent.BackColor = System.Windows.Forms.Form.DefaultBackColor; TextBoxClipboardContent.ForeColor = System.Drawing.Color.Gray; TextBoxClipboardContent.Text = System.String.Join( System.Environment.NewLine, System.Windows.Forms.Clipboard.GetDataObject( ).GetFormats( ).ToArray<string>( ) ); // requires Linq } TextBoxClipboardContent.SelectionStart = 0; TextBoxClipboardContent.SelectionLength = 0; } private void DebugInfo( ) { //string programpath = new System.Uri( System.Reflection.Assembly.GetExecutingAssembly( ).CodeBase ).LocalPath; string programpath = System.Windows.Forms.Application.ExecutablePath; string[] arguments = System.Environment.GetCommandLineArgs( ).Skip( 1 ).ToArray( ); // requires Linq string installednetframework = GetInstalledNETFrameworkVersion( ); string requirednetframework = GetRequiredNETFrameworkVersion( ); /* */ string debuginfo = System.String.Format( "DEBUGGING INFO:{0}==============={0}Program path : {1}{0}Required .NET version : {2}{0}Installed .NET version : {3}{0}Command line arguments : {4}{0}Timer interval : {5}{0}Modal window : {6}", System.Environment.NewLine, programpath, requirednetframework, installednetframework, System.String.Join( " ", arguments ), interval, modalwindow ); System.Windows.Forms.Clipboard.SetText( debuginfo ); } private string GetInstalledNETFrameworkVersion( ) { string rc = System.String.Empty; System.Collections.Generic.List<string> installedversions = new System.Collections.Generic.List<string>( ); // Get the list of installed .NET Framework versions from the registry, by Microsoft: // https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed using ( Microsoft.Win32.RegistryKey ndpKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey( Microsoft.Win32.RegistryHive.LocalMachine, "" ).OpenSubKey( @"SOFTWARE\Microsoft\NET Framework Setup\NDP\" ) ) { foreach ( string versionKeyName in ndpKey.GetSubKeyNames( ) ) { if ( versionKeyName.StartsWith( "v" ) ) { Microsoft.Win32.RegistryKey versionKey = ndpKey.OpenSubKey( versionKeyName ); string name = (string) versionKey.GetValue( "Version", "" ); if ( name == "" ) { foreach ( string subKeyName in versionKey.GetSubKeyNames( ) ) { Microsoft.Win32.RegistryKey subKey = versionKey.OpenSubKey( subKeyName ); name = (string) subKey.GetValue( "Version", "" ); if ( name != "" ) { installedversions.Add( name ); } } } else { installedversions.Add( name ); } } } } // Determine the highest version foreach ( string version in installedversions ) { highestversion = HighestVersion( highestversion, version ); } return System.String.Join( ".", highestversion.Select( x => x.ToString( ) ).ToArray( ) ); // requires System.Linq } static string GetRequiredNETFrameworkVersion( ) { // Get the required .NET Framework version // By Fernando Gonzalez Sanchez on StackOverflow.com // https://stackoverflow.com/a/18623516 object[] list = System.Reflection.Assembly.GetExecutingAssembly( ).GetCustomAttributes( true ); var attribute = list.OfType<System.Runtime.Versioning.TargetFrameworkAttribute>( ).First( ); // requires Linq string frameworkname = attribute.FrameworkName; string frameworkdisplayname = attribute.FrameworkDisplayName; return frameworkdisplayname; } static int[] HighestVersion( int[] version1, string version2 ) { int[] converted2 = version2.Split( ".".ToCharArray( ) ).Select( x => System.Convert.ToInt32( x ) ).ToArray( ); int minlength = System.Math.Min( version1.Length, converted2.Length ); for ( int i = 0; i < minlength; i++ ) { if ( version1[i] > converted2[i] ) { return version1; } else if ( version1[i] < converted2[i] ) { return converted2; } } return version1; } private void ParseCommandLine( ) { string[] arguments = System.Environment.GetCommandLineArgs( ).Skip( 1 ).ToArray( ); // requires Linq foreach ( string argument in arguments ) { if ( argument.ToUpper( ).StartsWith( "/D" ) ) { debugmode = true; } else if ( argument.StartsWith( "/I:", System.StringComparison.InvariantCultureIgnoreCase ) ) { if ( !System.Int32.TryParse( argument.Substring( 3 ), out interval ) ) { errormessage = System.String.Format( "Invalid interval: {0}", argument ); ShowHelp( ); } if ( interval < 1 || interval > 10 ) { errormessage = System.String.Format( "Interval out of range (1..10): {0}", argument ); ShowHelp( ); } } else if ( argument.ToUpper( ) == "/NM" ) { modalwindow = false; } else { errormessage = System.String.Format( "Invalid argument: {0}", argument ); } } } private void TimerMonitorClipboard_Tick( object sender, System.EventArgs e ) { CheckClipboard( ); } private void FormMonitorClipboard_FormClosing( object sender, System.Windows.Forms.FormClosingEventArgs e ) { TimerMonitorClipboard.Stop( ); } } }
日期:2020-04-11 22:50:24 来源:oir作者:oir