112 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						|||
| 
								 | 
							
								using System.Linq;
							 | 
						|||
| 
								 | 
							
								using System.Management;
							 | 
						|||
| 
								 | 
							
								using System.Threading.Tasks;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace DM_Weight.util.TabTip
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public enum HardwareKeyboardIgnoreOptions
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// Do not ignore any keyboard.
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        DoNotIgnore,
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// Ignore keyboard, if there is only one, and it's description 
							 | 
						|||
| 
								 | 
							
								        /// can be found in ListOfKeyboardsToIgnore.
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        IgnoreIfSingleInstanceOnList,
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// Ignore keyboard, if there is only one.
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        IgnoreIfSingleInstance,
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// Ignore all keyboards for which the description 
							 | 
						|||
| 
								 | 
							
								        /// can be found in ListOfKeyboardsToIgnore
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        IgnoreIfOnList,
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// Ignore all keyboards
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        IgnoreAll
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    internal static class HardwareKeyboard
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private static bool? _isConnected;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// Checks if Hardware Keyboard is Connected
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        internal static async Task<bool> IsConnectedAsync()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Task<bool> KeyboardConnectedCheckTask = Task.Run(() =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                SelectQuery SelectKeyboardsQuery = new SelectQuery("Win32_Keyboard");
							 | 
						|||
| 
								 | 
							
								                using (ManagementObjectSearcher Searcher = new ManagementObjectSearcher(SelectKeyboardsQuery))
							 | 
						|||
| 
								 | 
							
								                using (ManagementObjectCollection Keyboards = Searcher.Get())
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    if (Keyboards.Count == 0)
							 | 
						|||
| 
								 | 
							
								                        return false;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    switch (IgnoreOptions)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        case HardwareKeyboardIgnoreOptions.IgnoreAll:
							 | 
						|||
| 
								 | 
							
								                            return false;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        case HardwareKeyboardIgnoreOptions.DoNotIgnore:
							 | 
						|||
| 
								 | 
							
								                            return Keyboards.Count > 0;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        case HardwareKeyboardIgnoreOptions.IgnoreIfSingleInstance:
							 | 
						|||
| 
								 | 
							
								                            return Keyboards.Count > 1;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        case HardwareKeyboardIgnoreOptions.IgnoreIfSingleInstanceOnList:
							 | 
						|||
| 
								 | 
							
								                            return (Keyboards.Count > 1) ||
							 | 
						|||
| 
								 | 
							
								                                   (Keyboards.Count == 1 &&
							 | 
						|||
| 
								 | 
							
								                                    !IsIgnoredKeyboard(Keyboards.Cast<ManagementBaseObject>().First()));
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        case HardwareKeyboardIgnoreOptions.IgnoreIfOnList:
							 | 
						|||
| 
								 | 
							
								                            return Keyboards.Cast<ManagementBaseObject>().Any(k => !IsIgnoredKeyboard(k));
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                        default:
							 | 
						|||
| 
								 | 
							
								                            return true;
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#pragma warning disable 4014
							 | 
						|||
| 
								 | 
							
								            KeyboardConnectedCheckTask.ContinueWith(t => _isConnected = t.Result);
							 | 
						|||
| 
								 | 
							
								#pragma warning restore 4014
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (_isConnected != null)
							 | 
						|||
| 
								 | 
							
								                return _isConnected.Value;
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								                return await KeyboardConnectedCheckTask;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static bool IsIgnoredKeyboard(ManagementBaseObject keyboard)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            string description = keyboard.Properties.Cast<PropertyData>()
							 | 
						|||
| 
								 | 
							
								                .Where(k => k.Name == "Description")
							 | 
						|||
| 
								 | 
							
								                .Select(k => k.Value)
							 | 
						|||
| 
								 | 
							
								                .First()
							 | 
						|||
| 
								 | 
							
								                .ToString();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return ListOfKeyboardsToIgnore.Contains(description);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        internal static HardwareKeyboardIgnoreOptions IgnoreOptions = HardwareKeyboardIgnoreOptions.DoNotIgnore;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// Description of keyboards to ignore if there is only one instance of given keyboard.
							 | 
						|||
| 
								 | 
							
								        /// If you want to ignore some ghost keyboard, add it's description to this list
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        internal static List<string> ListOfKeyboardsToIgnore { get; } = new List<string>();
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |