windowsで英字配列キーボードと日本語配列キーボードを相互切り替えするコード

Topre REALFORCE103UBを先日購入したので、身内のPCのUSBキーボードを切り替えて使おうとしたところ、日本語・英字配列キーボードの設定の変更にはレジストリの書き換えが必要ということでした。
切り替え自体は簡単なのですが、せっかくなので設定をプログラムを使って書き換えられないか試してみよう!と思ったので(何故)C++とwindowsAPIを使ったプログラムを作ってみました。

#include <iostream>
#include <string>
#include <algorithm>
#include <Windows.h>
#include <boost/format.hpp>

void show_value( const VALENT & value )
{
	std::cout << boost::format( "%s : %s" ) % value.ve_valuename \
		% reinterpret_cast< const char * >( value.ve_valueptr ) << std::endl;
}


int main()
{
	HKEY hk;
	DWORD dwDisposition;

	const auto result = RegCreateKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\services\\i8042prt\\Parameters",
		0, NULL, REG_OPTION_NON_VOLATILE,//不揮発性
				//REG_OPTION_VOLATILE //システムを再起動すると消える揮発性,
				KEY_ALL_ACCESS,
				NULL,
				& hk,
				& dwDisposition );

	if ( result == ERROR_SUCCESS )
	{
		std::cout << "OPEN SUCCESS...." << std::endl;

		const std::size_t value_num = 3;
		VALENT values[ value_num ];
		const std::size_t buff_size = 512;
		char buf[ buff_size ];
		DWORD dw_buff_size = buff_size;

		enum
		{
			E_V_LAYERDRIVER_JPN,
			E_V_LAYERDRIVER_KOR,
			E_V_OVERRIDE_KEYBOARD_IDENTIFER,
		};

		/* バッファの初期化 */
		values[ E_V_LAYERDRIVER_JPN ].ve_valuename = "LayerDriver JPN";
		values[ E_V_LAYERDRIVER_KOR ].ve_valuename = "LayerDriver KOR";
		values[ E_V_OVERRIDE_KEYBOARD_IDENTIFER ].ve_valuename = "OverrideKeyboardIdentifier";

		//値の取得
		RegQueryMultipleValues( hk, values, value_num, buf, & dw_buff_size );

		//表示
		std::for_each( values, values + value_num, show_value );

		const std::string jpn_106 = "kbd106.dll";
		const bool is_jpn = ( jpn_106 == reinterpret_cast< const char * >( values[ E_V_LAYERDRIVER_JPN ].ve_valueptr ) );

		if( is_jpn )
		{
			std::cout << "TO US FROM JPN\n";
		}
		else
		{
			std::cout << "TO JPN FROM US\n";
		}

		const std::string data = "kbd" + static_cast< std::string >( ( is_jpn ) ? "101" : "106" ) + ".dll";
		const std::string data2 = "PCAT_" + static_cast< std::string >( ( is_jpn ) ? "101" : "106" ) + "KEY";
		//PCAT_106KEY
		//PCAT_101KEY

		//書き換え開始********************************************
		RegSetValueEx
			( hk, values[ E_V_LAYERDRIVER_JPN ].ve_valuename, \
				0, \
				REG_SZ, ( const BYTE * )( LPCSTR )data.c_str(), ( int )data.size() );
		RegSetValueEx
			( hk, values[ E_V_OVERRIDE_KEYBOARD_IDENTIFER ].ve_valuename, \
				0, \
				REG_SZ, ( const BYTE * )( LPCSTR )data2.c_str(), ( int )data2.size() );
		//書き換え終了********************************************
		RegCloseKey( hk );

		std::cout << "設定が終了しました。有効にするにはシステムの再起動を行ってください\n";
	}
	else
	{
		std::cout << "Failed with value : " << result << std::endl;
		std::cout << "管理者権限でプログラムを実行しましたか?何かが原因で、設定を書き換えられません\n";
	}

	std::cout << "何かキーを押すと終了します\n";
	std::getchar();

	return 0;
}

ノートPCでも使えるはずです(USBキーボードの設定しか書き換えません、たぶん)。
一応レジストリを書き換えるプログラムなので実行は自己責任にてどうぞ。ちなみに管理者権限で実行しないと使えません。

もうちょっとモジュール化したいですね。とりあえず快適にキーボードを仕えているので私は満足です。