2013-03-01 3 views
0

저는 win7 64bit를 사용합니다. GetKeyboardState()를 사용하여 키보드 상태를 가져옵니다.GetKeyboardState가 잘못된 결과를 반환합니다.

BYTE keyState[256]; 
GetKeyboardState(keyState); 
BOOL leftButtonClicked = GetKeyState(VK_LBUTTON); 

주요 WND 내부 클릭이 모든 일이 확인되어 있지만 주요 WND 외부 클릭이의 leftButtonClicked 여전히 해당하는 경우.

은 MSDN 말했다

응용 프로그램은 모든 가상 키의 현재 상태를 검색하려면이 함수를 호출 할 수 있습니다. 스레드가 메시지 대기열에서 키보드 메시지를 제거 할 때 상태가 변경됩니다. 키보드 메시지가 스레드의 메시지 대기열에 게시되거나 키보드 메시지가 다른 스레드의 메시지 대기열에 게시되거나 이로부터 검색 될 때 상태가 변경되지 않습니다.

주 wnd는 WM_LBUTTONDOWN을받지 못합니다. 왜이 함수가 잘못된 결과를 얻는가? 또는 내가 오해 한 것입니까?

감사합니다.

+0

"잘못된 결과"가 아닙니다. "마우스가있는 곳을 확인하지 않았습니다."- 창 안에서 뭔가 발생했을 때 VM_LBUTTONDOWN 만 얻습니다. 그러나 GetKeyState는 보편적입니다. 요청한 시점에 상태가 무엇인지 알려주고, 창과 관련이 있는지 여부는 결정할 응용 프로그램에 달려 있습니다. –

+1

혼란스러워. 당신은 결코 GetKeyboardState의 결과를 보지 않습니다. –

답변

2

GetKeyboardState 및 GetKeyState는 버퍼 된 상태의 키보드 및 마우스를 반환합니다. 마지막 입력 이벤트가 메시지 대기열에 입력되었을 때 저장됩니다. 중요한 기능인 프로그램이 메시지를 펌핑하지 않는 경우 잠시 대기열에 메시지를 저장할 수 있습니다.

외부에서 클릭하면 생성 된 입력 이벤트가 클릭 한 창과 관련된 대기열로 이동합니다. 프로그램 대기열이 아닙니다. 따라서 키보드 상태는 변경되지 않습니다.

현재 상태를 가져 오려면 GetAsyncKeyState()를 사용해야합니다.

관련 문제