2010-08-06 6 views
2

저는 Delphi에서 작업하고 있습니다. 어떤 키를 눌렀는지 추적하고 싶습니다. TForm의 KeyDown 이벤트를 사용하고 있습니다. 그것은 잘 작동하지만 문제는, 내가 그 편지의 대문자를 제공하지만, 내가 소문자를 누르거나 소문자를 쓰면. 눌린 키가 소문자인지 대문자인지 어떻게 알 수 있습니까?Delphi의 OnKeyDown 관련 문제

답변

14

영문자 키를 추적하려면 KeyPress을 사용해야합니다. 이 시도 : 키보드에서 중 "K"또는 "K"를 입력하려면

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    ShowMessage(Key); 
end; 

KeyDown의 문제는, 확실히 충분히 그 우울되는 핵심에 응답이다, 그리고, 당신은 같은 버튼을 누르면 , 권리? 따라서 KeyDown을 계속 사용하려면 Caps Lock 키가 켜져 있거나 Shift 키를 누른 경우 별도로 확인해야합니다. 토글 키 (예 : 모자 등이 잠금) 경우 테스트하기에, 또는 일반 키가 눌러 진 경우 캡이 IsKeyOn(VK_CAPITAL)를 사용하는 키가 잠금, 당신은 확인하려면

function IsKeyDown(const VK: integer): boolean; 
begin 
    IsKeyDown := GetKeyState(VK) and $8000 <> 0; 
end; 

function IsKeyOn(const VK: Integer): boolean; 
begin 
    IsKeyOn := GetKeyState(VK) and 1 = 1; 
end; 

를 사용할 수 있습니다. Shift 키가 눌러져 있는지 확인하려면 IsKeyDown(VK_SHIFT)을 사용하십시오.

시프트 키 만 OnKeyDown 이벤트 핸들러에서 작동하는 경우에 눌려 검사하는 다른 방법은, Shift 그 이벤트 핸들러 함수의 파라미터 ssShift in Shift,인지 확인하는 것이다.

(단, Caps Lock이 켜져있을 때 Shift + A를 누르면 작은 "a"가 삽입됩니다.) 수도를 테스트하는 것은 XOR 연산자를 사용

IsKeyOn(VK_CAPITAL) xor IsKeyDown(VK_SHIFT) 

때 검사를 사용합니다.)

+0

좋아, 덕분에이 코드를 들어,'$ 8000 <> 0 '과'1의 의미는 무엇인지 말해 줄 수 = 1' 두 함수 모두에서? – Himadri

+1

'GetKeyState'는 비트가 플래그 인 추기경을 반환합니다. 따라서 anding을 사용하여 재미있는 비트 이외의 모든 비트를 지우고 그 결과가 0인지 아닌지 확인합니다. 즉'GetKeyState (VK)와 $ 8000 <> 0'은'(GetKeyState (VK)와 $ 8000) <> 0'으로 읽어야합니다. 여기서 16 진수의 8000은 1000000000000000의 바이너리입니다. 그것은 모두 잘 문서화되어 있습니다 : http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx –

+0

예 이미 읽었지만 반환 값을 얻지 못했습니다. 하위 비트, 상위 비트 란 무엇입니까? – Himadri