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>();
|
|
}
|
|
}
|