War3的分辨率配置是写在注册表中的,注册表项是:
HKEY_CURRENT_USER\Software\Blizzard Entertainment\Warcraft III\Video
中的resheight和reswidth这两个DWORD类型的值中。
例如War3的分辨率为800x600,则这两个值如下图所示:
这个小程序的实现思路是:
这个直接调用API就可以了,废话少说上代码:
typedef struct resolution_def { int width; int height; } RESOLUTION, * PRESOLUTION; void GetSysResolution(PRESOLUTION res) { res->width = GetSystemMetrics(SM_CXSCREEN); res->height = GetSystemMetrics(SM_CYSCREEN); }
// 读取注册表指定项的值(此项的类型是DWORD) static DWORD RegGetValueDword( HKEY hkey, LPCTSTR lpSubKey, LPCTSTR lpValue, DWORD dwDefValue) { DWORD dwValue; DWORD dwSize; LONG lRet; dwSize = sizeof(dwValue); lRet = RegGetValue(hkey, lpSubKey, lpValue, RRF_RT_DWORD, NULL, &dwValue, &dwSize); if (lRet != ERROR_SUCCESS) { return dwDefValue; } return dwValue; }
此函数共有四个参数,前三个参数与RegGetValue的前三个参数相同,
RegGetValue的详细说明,请参考http://msdn.microsoft.com/en-us/library/windows/desktop/ms724868(v=vs.85).aspx
最后一个参数dwDefValue是一个默认值,当读取注册表发生错误时,返回这个默认值。
#define WAR_VIDEO "Software\\Blizzard Entertainment\\Warcraft III\\Video" void GetWarResolution(PRESOLUTION res) { res->width = RegGetValueDword( HKEY_CURRENT_USER, TEXT(WAR_VIDEO), TEXT("reswidth"), 0); res->height = RegGetValueDword( HKEY_CURRENT_USER, TEXT(WAR_VIDEO), TEXT("resheight"), 0); }
上面的代码就是具体的调用。
static bool RegSetValueDword( HKEY hkey, LPCTSTR lpSubKey, LPCTSTR lpValue, DWORD dwValue) { HKEY hSubKey; LONG lRet; lRet = RegOpenKeyEx(hkey, lpSubKey, 0, KEY_SET_VALUE, &hSubKey); if (lRet != ERROR_SUCCESS) { return FALSE; } lRet = RegSetValueEx(hSubKey, lpValue, 0, REG_DWORD, (PBYTE)&dwValue, sizeof(dwValue)); if (lRet != ERROR_SUCCESS) { RegCloseKey(hSubKey); return FALSE; } RegCloseKey(hSubKey); return TRUE; }
这个函数是对API的一个简单封装,完成的功能就是打开键,修改项的值,关闭键。
RegOpenKeyEx的详细说明,请参考http://msdn.microsoft.com/en-us/library/windows/desktop/ms724897(v=vs.85).aspx
RegSetValueEx的详细说明,请参考http://msdn.microsoft.com/en-us/library/windows/desktop/ms724923(v=vs.85).aspx
调用的代码如下:
bool SetWarResolution(const PRESOLUTION res) { bool bOk; bOk = RegSetValueDword( HKEY_CURRENT_USER, TEXT(WAR_VIDEO), TEXT("reswidth"), res->width); if(!bOk) return FALSE; bOk = RegSetValueDword( HKEY_CURRENT_USER, TEXT(WAR_VIDEO), TEXT("resheight"), res->height); return bOk; }
主要的代码就这些了,应该没有什么难以理解的地方。