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