0

此代码的目的是添加或编辑 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;
} 
4

2 回答 2

2

RegSetValueEx 在 winreg.h 中定义如下:

#ifdef UNICODE
#define RegSetValueEx  RegSetValueExW
#else
#define RegSetValueEx  RegSetValueExA
#endif // !UNICODE

这意味着当定义 UNICODE 时,将使用 RegSetValueExW。最后一个字母“W”表示它接受宽字符串(wchar_t*),“A”表示它接受多字节字符串。所以如果你知道你在编译时启用了 UNICODE(项目属性 -> 配置 -> 字符集 -> 使用 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 需要字节数而不是字符数。

于 2012-11-18T22:05:44.990 回答
0

MSDN 中描述“如果数据的类型为 REG_SZ、REG_EXPAND_SZ 或 REG_MULTI_SZ,则 cbData 必须包含终止空字符的大小。”

所以我想代码应该是:

if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)TEXT("31"), (_tcslen(TEXT("31")) + 1)*sizeof(TCHAR)) != ERROR_SUCCESS)
于 2014-06-20T03:12:48.393 回答