2010-08-09 53 views
5

是否有可以調用的C++ .NET函數,它將檢測我的程序是否在兼容模式下運行?如果沒有一個,有人可以給我看一個代碼嗎?謝謝。程序是否在兼容模式下運行

例如:

程序加載了 兼容模式檢查 如果爲true,則退出 其他運行

+0

你是什麼意思的「兼容性」? – Klaim 2010-08-09 23:47:07

+3

如果您禁用應用程序的兼容模式,所有類型的用戶都會討厭你。你爲什麼想這麼做? – 2010-08-09 23:51:29

+0

是禁用兼容模式是相當嚴格 – 2010-08-09 23:54:12

回答

8

從另一個論壇

一些谷歌搜索後赴 徒勞的,我決定嘗試自己。 我發現每個可執行文件的兼容性 設置爲 存儲 - 我認爲這將是 - 在 Windows註冊表。

其中設置存儲 關鍵是
HKEY_CURRENT_USER \ SOFTWARE \微軟\的Windows NT \ CURRENTVERSION \ AppCompatFlags \圖層指定

對於有 兼容性設置每個應用程序, 存在價值在該密鑰 下,其名稱是 可執行文件的路徑,數據是由兼容性 設置組成的字符串 。

的字符串 指定兼容性設置 中關鍵字爲:WIN95 WIN98 NT4SP5
WIN2000 256COLOR 640X480
DISABLETHEMES DISABLECICERO

如果指定了多個設置(或 要被指定的),該數據 由以上各個空格分隔的 組成。第一個 四個設置是互斥的, 即只有其中一個是指定的 (如果有的話)。我沒有 測試了多個操作系統指定 的後果。

所以,回到解決你的問題。 要檢查在256色模式下是否將可執行文件(假設爲 「C:\ path \ executable.exe」)設置爲 ,將會有一個名爲「C:\ path \ executable.exe」的值 (不包括引號,即使路徑 包含空格)值爲 關聯下的關鍵 [HKEY_CURRENT_USER \軟件\微軟\的Windows NT \ CURRENTVERSION \ AppCompatFlags \層], 和數據將包含字符串「256COLOR 」。 如果它也設置爲在 98/ME下的兼容模式下運行,則數據將是「WIN98 256COLOR」。

所以,方法很簡單。測試 是否存在上述密鑰I 下的可執行文件的完整路徑爲 的值。如果沒有, 可執行文件沒有被指定任何 兼容性設置。如果存在值 ,請檢索其數據並檢查 中是否存在 數據中的「256COLOR」。相應地,「WIN95」或「WIN98」或「NT4SP5」或 「WIN2000」的存在意味着 可執行文件被設置爲針對該特定的 操作系統的兼容模式運行。

+1

很酷,但在代碼中,我將如何檢查HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers的這些值之一?謝謝! – user409939 2010-08-09 23:58:14

+0

註冊表和RegistryKey類。從概念上來說,採用Windows API的方式與.NET方式完全相同。 – 2010-08-10 00:38:15

2

獲取從GetVersionEx返回的操作系統版本,並將其與kernel32.dll上的文件版本進行比較。在應用程序兼容模式下,GetVersionEx將始終返回正在「模擬」的操作系統版本。如果兩個版本都不同,那麼您處於應用程序兼容模式。

1

上面的答案幫助我得到了一個「解決方案」的問題。它可能不是最優雅的,但似乎工作。很明顯,您可以在返回類型上獲得更多創意。布隆在這裏還不夠。我認爲一個本地API會很好。

typedef VOID (NTAPI* TRtlGetNtVersionNumbers)(LPDWORD pdwMajorVersion, LPDWORD pdwMinorVersion, LPDWORD pdwBuildNumber); 

bool IsRunningCompatMode() 
{ 
    TRtlGetNtVersionNumbers RtlGetNtVersionNumbers = (TRtlGetNtVersionNumbers)GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlGetNtVersionNumbers"); 

    assert(RtlGetNtVersionNumbers); 

    if(RtlGetNtVersionNumbers) 
    { 
     OSVERSIONINFO osInfo = {0}; 
     osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
     GetVersionEx(&osInfo); 

     DWORD dwMajorVersion; 
     DWORD dwMinorVersion; 
     DWORD dwBuildNumber; 

     RtlGetNtVersionNumbers(&dwMajorVersion, &dwMinorVersion, &dwBuildNumber); 

     dwBuildNumber &= 0x0000FFFF; 

     if(osInfo.dwBuildNumber != dwBuildNumber) 
     { 
      return true; 
     } 
    } 
    return false; 
}; 
相關問題