此代码的目的是添加或编辑KeyboardDelay REG_SZ的值。我能做的是使它的值为0,但是当我尝试使它为31时,它会失败并且一个奇怪的“盒子”作为KeyboardDelays数据值而不是31号。我做错了什么因为它不会添加31但是它会做0吗?
HKEY key;
if (RegOpenKey(HKEY_CURRENT_USER, TEXT("Control Panel\\Keyboard"), &key) != ERROR_SUCCESS)
{
cout << "Unable to open registry key";
}
if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)"31", strlen("31")*sizeof(char)) != ERROR_SUCCESS)
{
RegCloseKey(key);
cout <<"Unable to set registry value value_name";
}
else
{
cout << "KeyboardDelay was set" << endl;
}
答案 0 :(得分:2)
RegSetValueEx在winreg.h中定义如下:
#ifdef UNICODE
#define RegSetValueEx RegSetValueExW
#else
#define RegSetValueEx RegSetValueExA
#endif // !UNICODE
这意味着当定义UNICODE时,将使用RegSetValueExW。最后一个字母'W'表示它接受宽字符串(wchar_t *),'A'表示它接受多字节字符串。因此,如果您知道正在使用UNICODE进行编译(项目属性 - >配置 - &gt;字符集 - &gt;使用Unicode字符集),则应提供宽字符串文字。在Windows下最简单的方法是使用宏:
TEXT("31")
或我最喜欢的:
_T("31")
这两个宏在非UNICODE编译下将变为“31”,在UNICODE编译下变为L“31”。
你也应该使用正确的字符串函数,长度使用wcslen用于UNICODE和strlen用于多字节字符集。您可以使用_t *宏来检查字符集,并使用_tcslen()来获取长度。
实际上,在创建新项目时应始终使用UNICODE。
修复您的代码使用:
if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)TEXT("31"),_tcslen(TEXT("31"))*sizeof(TCHAR)) != ERROR_SUCCESS)
这里使用sizeof(TCHAR),因为当定义UNICODE时,单个字符长度为两个字节,RegSetValueEx需要字节数而不是字符数。
答案 1 :(得分:0)
MSDN中描述了&#39;如果数据类型为REG_SZ,REG_EXPAND_SZ或REG_MULTI_SZ,则cbData必须包含终止空字符或字符的大小。&#39;
所以我想代码应该是:
if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)TEXT("31"), (_tcslen(TEXT("31")) + 1)*sizeof(TCHAR)) != ERROR_SUCCESS)