修改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;

}

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

你可能感兴趣的:(分辨率)