105 lines
3.0 KiB
C#
105 lines
3.0 KiB
C#
|
using System;
|
|||
|
using System.Diagnostics;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
|
|||
|
namespace XiaoZhiSharp.Utils
|
|||
|
{
|
|||
|
public class CapsLockChecker
|
|||
|
{
|
|||
|
public static bool IsCapsLockOn()
|
|||
|
{
|
|||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|||
|
{
|
|||
|
return IsCapsLockOnWindows();
|
|||
|
}
|
|||
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|||
|
{
|
|||
|
return IsCapsLockOnLinux();
|
|||
|
}
|
|||
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|||
|
{
|
|||
|
return IsCapsLockOnMacOS();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
throw new PlatformNotSupportedException("Unsupported operating system");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Windows 实现
|
|||
|
private static bool IsCapsLockOnWindows()
|
|||
|
{
|
|||
|
return Console.CapsLock;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// Linux 实现
|
|||
|
private static bool IsCapsLockOnLinux()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// 使用 xset 命令查询键盘状态
|
|||
|
var process = new Process
|
|||
|
{
|
|||
|
StartInfo = new ProcessStartInfo
|
|||
|
{
|
|||
|
FileName = "xset",
|
|||
|
Arguments = "q",
|
|||
|
RedirectStandardOutput = true,
|
|||
|
UseShellExecute = false,
|
|||
|
CreateNoWindow = true,
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
process.Start();
|
|||
|
string output = process.StandardOutput.ReadToEnd();
|
|||
|
process.WaitForExit();
|
|||
|
|
|||
|
// 解析输出,查找 Caps Lock 状态
|
|||
|
return output.Contains("Caps Lock: on");
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
// 如果 xset 不可用,尝试其他方法
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// macOS 实现
|
|||
|
private static bool IsCapsLockOnMacOS()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// 使用 defaults 命令读取键盘设置
|
|||
|
var process = new Process
|
|||
|
{
|
|||
|
StartInfo = new ProcessStartInfo
|
|||
|
{
|
|||
|
FileName = "defaults",
|
|||
|
Arguments = "read -g AppleKeyboardUIMode",
|
|||
|
RedirectStandardOutput = true,
|
|||
|
UseShellExecute = false,
|
|||
|
CreateNoWindow = true,
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
process.Start();
|
|||
|
string output = process.StandardOutput.ReadToEnd();
|
|||
|
process.WaitForExit();
|
|||
|
|
|||
|
// 如果返回值为 1 或 3,表示 Caps Lock 已启用
|
|||
|
if (int.TryParse(output.Trim(), out int result))
|
|||
|
{
|
|||
|
return result == 1 || result == 3;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|