1

我们有一个在 .NET 1.x 时代编写的旧版 WinForms 应用程序,可能需要更改检查应用程序是否使用操作系统视觉样式呈现的代码,原因如下所述。执行此工作的当前函数如下所示:

private bool IsComCtl6
{
    get
    {
        if (!fIsComCtl6Initialized)
        {
            IntPtr hMod = NativeMethods.LoadLibrary("comctl32.dll");
            if (hMod != IntPtr.Zero)
            {
                IntPtr lptrDLLVersion = NativeMethods.GetProcAddress(hMod, "DllGetVersion");
                if (lptrDLLVersion != IntPtr.Zero)
                {
                    hMod = NativeMethods.LoadLibrary("uxtheme.dll");
                    if (hMod != IntPtr.Zero)
                    {
                        NativeMethods.DllVersionInfo dvi = new NativeMethods.DllVersionInfo();
                        dvi.cbSize = Marshal.SizeOf(typeof(NativeMethods.DllVersionInfo));
                        if (NativeMethods.DllGetVersion(ref dvi) == NativeMethods.S_OK)
                            fIsComCtl6 = (!fCheckAppThemed || dvi.dwMajorVersion >= 6) && NativeMethods.IsThemeActive() && NativeMethods.IsAppThemed();
                    }
                }
            }
            fIsComCtl6Initialized = true;
        }
        return fIsComCtl6;
    }
}

此代码中的 NativeMethods 是一个类,其中包含所有引用的 WinAPI 函数和常量的 P-Invoke 声明。

我们希望在此代码中避免与平台无关的调用,因为它们似乎与 Mono 平台的最新版本不兼容。没有操作系统本机调用,是否有更好更短的方法来检查我们需要什么?如果我们可以仅使用本机 .NET 类来做到这一点,那就太好了。支持的 .NET 的最低版本应该是 2.0 甚至 3.5。

4

0 回答 0