修改War3分辨率的小程序

War3的分辨率配置是写在注册表中的,注册表项是:

HKEY_CURRENT_USER\Software\Blizzard Entertainment\Warcraft III\Video

中的resheight和reswidth这两个DWORD类型的值中。

例如War3的分辨率为800x600,则这两个值如下图所示:

image

 

这个小程序的实现思路是:

  1. 获取系统当前的分辨率
  2. 获取War3原来的分辨率(不是必须的)
  3. 修改注册表中的reswidth和resheight

 

获取系统当前分辨率

 

这个直接调用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);
}

获取War3原来的分辨率

// 读取注册表指定项的值(此项的类型是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;
}

主要的代码就这些了,应该没有什么难以理解的地方。

posted @ 2013-01-28 17:12  wzyplus  阅读(453)  评论(0编辑  收藏  举报