#include"CKeybordDriverWindowsMSG.h"



namespace Maid
{
	/*!
	 	@class	CKeybordDriverWindowsMSG CKeybordDriverWindowsMSG.h
	 	@brief	キーボードドライバ
	\n			半角/全角 , CaosLock, alt キーはうまく動作しません
	 */ 

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 */
CKeybordDriverWindowsMSG::CKeybordDriverWindowsMSG()
{
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! デストラクタ
/*!
 */
CKeybordDriverWindowsMSG::~CKeybordDriverWindowsMSG()
{
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! キーボードドライバの初期化
/*!
 	引数などは IKeybordDriver::Initialize を参照すること
 */
void	CKeybordDriverWindowsMSG::Initialize()
{
	m_IsDown.resize(256);
	Reset();

	AddProc( NULL );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! キーボードドライバの解放
/*!
 	引数などは IKeybordDriver::Finalize を参照すること
 */
void		CKeybordDriverWindowsMSG::Finalize()
{

}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 各ボタンが押されているか調べる
/*!
 	引数などは IKeybordDriver::IsDown を参照すること
 */
void CKeybordDriverWindowsMSG::IsDown( MySTL::vector<bool>& KeyList )	    const
{
	KeyList = m_IsDown;
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! このクラスで扱っている変数を初期状態にする
/*!
 */
void CKeybordDriverWindowsMSG::Reset()
{
	for( int i=0; i<(int)m_IsDown.size()  ; ++i ) { m_IsDown[i] = false; }
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! このドライバで識別できるボタンの数を取得する
/*!
 *	引数などは IKeybordDriver::GetButtonnMax を参照すること
 */
int	CKeybordDriverWindowsMSG::GetButtonnMax()	const
{
	return (int)m_IsDown.size();
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! プロシージャにコールバックしてもらう関数
/*!
 *	引数などは IMessageHookWindows::WindowProc を参照すること
 */
IMessageHook::RETURNCODE CKeybordDriverWindowsMSG::OnMessage( CWindowsMessage& Param )
{
	const UINT	 msg = Param.GetMSG();
	const WPARAM wParam = Param.GetWPARAM();
	const LPARAM lParam = Param.GetLPARAM();


	switch( msg )
	{
	case WM_ACTIVATEAPP:
		{
			Reset();
		}break;
	case WM_KEYDOWN:{ m_IsDown[int(wParam)] = true; }break;
	case WM_KEYUP:	{ m_IsDown[int(wParam)] = false;}break;

	}

	return IMessageHook::RETURNCODE_CONTINUE;
}

}