以前用qt4編寫Windows程序的時候遇到了一個軟件在系統的兼容性問題:用戶在win10系統下使用這個程序的時候,若是沒有用低於win10版本的兼容模式運行的時候,存在運行某部分功能的時候沒法使用的問題。windows
這個問題一開始困擾了我好久,那時我認爲的解決方案有兩種:app
1.將軟件從qt4遷移到qt5上ide
不過在對軟件的大小是有限制的,之因此一開始用qt4寫這個項目是由於qt4的模塊相對於qt5來講小不少,所以這個方案被我否決了函數
2.程序自啓動的時候將系統兼容性設置爲win10如下的版本類型spa
在否決了第一個方案以後,只能採起第二種方案。code
windows程序的兼容性是由註冊表控制的,其位置Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layersblog
以qt4中將程序設置爲win7兼容模式爲例子(須要重啓才能生效,由於是程序啓動後註冊表信息才被修改的,讀者可自行判斷所處系統再進行相應的修改):qt
HKEY hKey; LPCTSTR strSubKey = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers"; long lRet = ::RegOpenKeyEx( HKEY_CURRENT_USER, strSubKey, 0, KEY_WRITE, &hKey ); if ( lRet == ERROR_SUCCESS ) { const size_t cSize = strlen(QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str())+1; wchar_t* wc = new wchar_t[cSize]; MultiByteToWideChar(CP_ACP, 0, QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str(), strlen(QCoreApplication::applicationFilePath().replace("/","\\").toStdString().c_str()) + 1, wc, sizeof(wchar_t)* cSize/ sizeof(wc[0])); //QCoreApplication::applicationFilePath().replace("/","\\").toLocal8Bit().data(); lRet = ::RegSetValueEx( hKey,wc, NULL, REG_SZ, (LPBYTE)(L"~ WIN7RTM"),18); //WIN7RTM能夠更換成你想要的兼容的類型 RegCloseKey( hKey ); }
在對註冊表信息修改以後,程序自己的兼容性問題並無獲得解決,還得進行重啓後才生效,以後再加入重啓程序的函數便可。it
重啓以前必須進行對是否已經在註冊表中寫入兼容信息進行判斷,若已經兼容,那麼註冊表信息就沒必要再註冊而且重啓軟件了。io
值得注意的是,註冊表是經過寫入程序的相對位置來判斷是否要用兼容性打開那個文件,所以,若程序以前已經兼容性運行過了,若是程序的位置再發生改變以後,再啓動的話話並不會以兼容模式運行這個程序,此時又得在註冊表中從新寫入兼容性信息而且刪除以前的兼容性信息後重啓程序。