WinAPI 14 KeyManager

CJB_ny·2022년 8월 31일
0

WinAPI

목록 보기
14/79
post-thumbnail

현재 키입력 하는 부분까지 하고

현재 윈도우가 포커싱이 되었을 경우에만 키입력이 되도록 구현할 것이다.

만약 내가 누르고 있는 상태에서 창이 밑으로 (최소화되어서) 내려가거나 그럴 경우에는?

내가 키가 눌렷다가 때질때 뭔가 해놓기로 했는데 창이 중간에 포커싱이 변경되었다고 하면은

손을 다 때버린 상태까지 체크를 하고 정지를 해야한다.

포커싱

이런 순으로 프레임마다 진행되어야한다.

< 해야할 것 >

1) 윈도우 포커싱 알아내기

GetFocus()라는 함수는 현재 포커싱 되어있는 윈도우의 핸들값(id)를 알려준다.

GetFucus로 현재포커싱 되어있는 윈도우의 '핸들값'을 알아온다.

현재 프로그램 실행될 때의 메인 윈도우의 '핸들값'은 GetMainHwnd함수로 얻어온다.

포커싱된애가 없으면 GetFocus -> 0 나옴(nullptr이 0이다)

만약 nullptr이라면은 어떤 윈도우도 포커싱 안되어있음.

근데 혹시 다른 윈도우가 있더라도 오직 메인 윈도우에게 포커싱 되어있을 때만 KeyManager를 동작하게 하고싶다!

이 두녀석이 같은지 다른지만을 체크를 하면 된다.

만약 그냥 현재 포커싱 되어있는 윈도우 에서만 동작하게 하고싶다면은

메인윈도우는 얻어 올 필요가 없지 -> 비교할 필요가 없으니까.

void CKeyManager::update()
{
	// 윈도우 포커싱 알아내기
	//HWND hMainWnd = CCore::GetInstance()->GetMainHwnd();
	HWND hWnd = GetFocus();

	if (nullptr != hWnd) // 윈도우 포커싱 중일 떄 키 이벤트 동작
	{
		for (int i = 0; i < static_cast<int>(KEY::LAST); ++i)
		{
			// 키가 눌려있다.
			if (GetAsyncKeyState(g_arrVK[i]) & 0x8000)
			{
				if (_vecKey[i]._isPrevInput)
				{
					// 이전에도 눌려있다.
					_vecKey[i]._state = KEY_STATE::HOLD;
				}
				else
				{
					// 이전에 눌려있지 않았다.
					_vecKey[i]._state = KEY_STATE::TAP;
				}
				_vecKey[i]._isPrevInput = true;
			}
			else // 키가 안 눌려있다.
			{
				if (_vecKey[i]._isPrevInput) // 지금은 안눌려있는데 이전프레임에 눌려있을 경우
				{
					// 이전에 눌려있다.
					_vecKey[i]._state = KEY_STATE::AWAY;
				}
				else
				{
					// 이전에도 안눌려 있었다.
					_vecKey[i]._state = KEY_STATE::NONE;
				}
				_vecKey[i]._isPrevInput = false;
			}
		}
	}
	else // 윈도우 포커싱 해제
	{
		for (int i = 0; i < static_cast<int>(KEY::LAST); ++i)
		{
			_vecKey[i]._isPrevInput = false;
			if (_vecKey[i]._state == KEY_STATE::TAP || _vecKey[i]._state==KEY_STATE::HOLD)
			{
				_vecKey[i]._state = KEY_STATE::AWAY;
			}
			else if (_vecKey[i]._state == KEY_STATE::AWAY)
			{
				_vecKey[i]._state = KEY_STATE::NONE;
			}
		}
	}

}

이렇게 수정을 해주도록 하자.

오늘은 뭐 별거 없다 이전 강의에서 _vecKey를 enum class값들이랑 활용하는게 더 중요하다.

싹다 C++문법으로 작성함.

본이는C++11조금 썻다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글