Как принудительно включить режим совместимости для Windows 8 при выполнении приложения ClickOnce

У меня проблема с приложением ClickOnce, которое я разрабатываю: в некоторых сборках Windows 10 клиент ClickOnce загружается, выполняется платформой .net, но ничего не отображается.

Кажется, что если я захожу в диспетчер задач, выбираю процесс, открываю детали, ставлю галочку "Запустить эту программу в режиме совместимости с Windows 8", то все работает нормально.

Настройки процессов, включающих режим совместимости

Поскольку я не хочу, чтобы каждый клиент выполнял эту манипуляцию, я ищу способ заставить клиент ClickOnce выполняться с этим режимом совместимости для Windows 8 при его запуске.

Я проверил очень мало документации и изменил манифест приложения следующим образом:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
  <!-- If your application is designed to work with Windows 8, uncomment the following supportedOS node-->
  <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
</application>

I tested again, but the ClickOnce client is not started with the proper compatibility mode.

Есть ли способ добиться того, чего я хочу?

Спасибо!


person Joel    schedule 05.05.2020    source источник


Ответы (1)


Кто-то из команды Microsoft очень эффективно поддержал меня в social.msdn, поэтому я сообщу здесь решение:

Нам нужно изменить реестр, чтобы установить ключ = значение, где - ключ - это путь к исполняемому файлу - значение - "WIN8RTM".

В приложении clickonce, прежде чем что-либо запустить, я вызываю следующую функцию:

void ForceWin8RTM() {
try {
    RegistryKey^ key = Registry::CurrentUser->OpenSubKey("SoftWare\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers", true);//Open the registry subkey
    System::String^ EXEName = System::Reflection::Assembly::GetExecutingAssembly()->Location;

    //If the item does not exist, create the sub-item 
    if (key == nullptr) 
    {
        key = Registry::CurrentUser->CreateSubKey("SoftWare\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers");            
    }
    //If the value does not exist, set the value and restart the program to apply the setting
    if (key->GetValue(EXEName) == "" || key->GetValue(EXEName) == nullptr)
    {
        key->SetValue(EXEName, "WIN8RTM");
        Application::Restart();
    }
} catch(Exception^ e) {
}

}

Вот ссылка на msdn: https://social.msdn.microsoft.com/Forums/en-US/056c7bf1-797f-4af7-83e2-d88b979e58a6/how-to-force-compatibilitymode-for-windows-8-whenclickonce-application-is-executed?forum=winformssetup

person Joel    schedule 03.06.2020