public class Helper
{
/// <summary>
/// 搜索与指定(值)名称匹配的全路径
/// </summary>
/// <param name="path">起始路径(节点)</param>
/// <param name="value">用于查找的(值)名称</param>
/// <param name="bAll">是否搜索起始路径(节点)全部节点</param>
/// <returns></returns>
public static List<string> RegeditFindFullPath(string path, string value,bool bAll = false)
{
try
{
Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;
Microsoft.Win32.RegistryKey system = hklm.OpenSubKey(path);//不区分大小写
List<string> paths = new List<string>();
paths.Add("HKEY_LOCAL_MACHINE");
paths.Add(path);
List<string> output = new List<string>();
RegeditFindFullPath(system, value, ref paths, ref output, bAll);
return output;
}
catch(Exception exp)
{
return new List<string>();
}
}
/// <summary>
/// 是否搜索起始路径(节点)全部路径
/// </summary>
/// <param name="SubkeyName">节点名称</param>
/// <param name="layer">第几层</param>
/// <param name="bAll">是否搜索起始路径(节点)全部节点</param>
/// <returns></returns>
private static bool Check(string SubkeyName, int layer, bool bAll = false)
{
if (bAll) return true;
if (layer == 2 && SubkeyName.ToLower().Contains("controlset") == false)
{
return false;
}
if (layer == 3 && SubkeyName.ToLower() != "enum" && SubkeyName.ToLower() != "control")
{
return false;
}
if (layer == 4 && SubkeyName.ToLower() != "display" && SubkeyName.ToLower() != "graphicsdrivers")
{
return false;
}
return true;
}
/// <summary>
/// 递归 - 搜索与指定(值)名称匹配的全路径
/// </summary>
/// <param name="parent">注册表节点</param>
/// <param name="value">用于查找的(值)名称</param>
/// <param name="path">记录路径</param>
/// <param name="output">记录符合的全路径</param>
/// <param name="bAll">是否搜索起始路径(节点)全部节点</param>
private static void RegeditFindFullPath(Microsoft.Win32.RegistryKey parent, string value, ref List<string> path, ref List<string> output, bool bAll = false)
{
try
{
string fullpath = string.Join("\\", path.ToArray());
foreach (string valuesName in parent.GetValueNames())
{
if(value == valuesName)
{
output.Add(fullpath);
}
}
foreach (string SubkeyName in parent.GetSubKeyNames())
{
if (Check(SubkeyName, path.Count, bAll) == false) continue;
Microsoft.Win32.RegistryKey Subkey = parent.OpenSubKey(SubkeyName);
if(Subkey!=null)
{
path.Add(SubkeyName);
RegeditFindFullPath(Subkey, value, ref path, ref output, bAll);
path.RemoveAt(path.Count -1);
}
}
}
catch (Exception exp)
{
}
}
/// <summary>
/// 以监视器的注册信息为例
/// </summary>
/// <param name="bAllRegEdit">是否搜索起始路径(节点)全部节点</param>
/// <returns></returns>
public static string DesktopMonitor(bool bAllRegEdit = false)
{
try
{
string info = "";
List<string> PATHS = RegeditFindFullPath("SYSTEM", "EDID", bAllRegEdit);
Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;
foreach (var path in PATHS)
{
Microsoft.Win32.RegistryKey Subkey = hklm.OpenSubKey(path.Remove(0, "HKEY_LOCAL_MACHINE\\".Length));
if(Subkey!=null)
{
byte[] bytes = (byte[])Subkey.GetValue("EDID");
string infoitem = SMQHDesktopMonitor.CEDID.Information(bytes);
if (info.Contains(infoitem) == false)
{
info += string.Format("注册表路径 [计算机\\{0}] EDID\r\n显示器信息 {1}\r\n\r\n", path, infoitem);
}
}
}
return info;
}
catch(Exception exp)
{
return exp.Message;
}
}
}