0

このコードの目的は、KeyboardDelayREG_SZの値を追加または編集することです。私にできることはその値を0にすることですが、31にしようとすると失敗し、奇妙な「ボックス」が数値31ではなくKeyboardDelaysデータ値として表示されます。 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")

これらの2つのマクロは、非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が定義されている場合、1文字は2バイトの長さであり、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 に答える