Как принудительно включить режим совместимости для Windows 8 при запуске приложения ClickOnce - PullRequest
0 голосов
/ 05 мая 2020

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

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

Settings of proces enabling compatibility mode

Поскольку я не хочу, чтобы каждый клиент выполнял эту манипуляцию, я ищу способ заставить клиент 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>

Я проверил еще раз , но клиент ClickOnce не запускается в правильном режиме совместимости.

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

Спасибо!

1 Ответ

0 голосов
/ 03 июня 2020

Кто-то из команды 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

...