此代码的目的是添加或编辑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;
} 发布于 2012-11-19 06:05:45
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”。
此外,您应该使用适当的字符串函数来获取长度,对于UNICODE使用wcslen,对于多字节字符集使用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需要的是字节数,而不是字符数。
发布于 2014-06-20 11:12:48
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)https://stackoverflow.com/questions/13444899
复制相似问题