2012-10-19 3 views
2

Delphi 프로젝트에서 키가 눌려진 기간을 감지하고 사용자에게 경고하는 방법을 찾고 있습니다.키를 얼마나 오래 누르고 있었는지 어떻게 알 수 있습니까?

나는 채팅 프로그램을 작성 중이며 W 키와 같은 편지를 보류중인 사람이 채팅 상자에 스팸을 보내고 있는지 확인해야합니다. 델파이 7에서 무엇을하려고하는지 샘플을 알려 드리겠습니다 :

//Looking up if key in use and held for lets say 20 seconds 
if (GetAsyncKeyState(Byte(VkKeyScan('W'))) shl 20) <> 0 then 
begin 
    ShowMessage('W Key Held down too long!'); 
end; 

GetAsyncKeyState에서 해당 정보를 제공할지 여부는 확실하지 않습니다. 그렇지 않다면, 무엇을 할 것인가?

+9

'WM_KEYDOWN'과'WM_KEYUP' 메시지를 듣는 것이 더 쉬울까요? –

+2

각 사용자마다 다를 수있는 키보드 반복 속도/반복 지연 (시스템 전체 매개 변수)이 있습니다. 나는 당신이 그것을 고려해야한다고 생각합니다. – kobik

+1

IIRC, 키 누름의 창 메시지에는 실제로 생성 된 반복 횟수가 포함됩니다. – mj2008

답변

1

StopWatch 장치에서 StopWatch 클래스를 사용하여 타이밍을 확인합니다. 여기 당신이 뭘 하려는지를 위해 그것을 사용하여 시도 할 수 방법은 다음과 같습니다 당신이 생각 뭘 하려는지 달성 할 수있는 다른 방법의 가능성이 많이 있습니다

uses StopWatch; 

//in the Form's private declaration: 
    StopWatch : TStopWatch; 

//in the Form's onCreate: 
    StopWatch := TStopWatch.Create(nil); 

//in the Form's onDestroy: 
    StopWatch.Free(); 

//in the form/box onKeyDown: 
    StopWatch.Start(); 

//in the form/box onChange: 
    if (StopWatch.ElapsedMiliseconds > 1000) 
    ShowMessage('W Key Held down too long!'); 

//in the form/box onKeyUp: 
    StopWatch.Stop(); 
    StopWatch.Start(); 
    StopWatch.Stop(); 

. 그러나 빠른 시도를 위해 이것은 작동해야합니다.

내가 onKeyUp을 다시 시작하고 시작하는 이유는 Elapsed 된 후 사용자가 키보드가 아닌 다른 방법으로 상자를 변경하는 경우 ElapsedMiliseconds를 지우는 것이므로 경고가 두 번 울리지 않을 것입니다.

4

Windows는 키를 누르고있는 기간을보고하지 않으며 누르고있는 키에 대해 동일한 WM_KEY... 메시지가 반복되고 있습니다. 수동으로 기간을 추적해야합니다. 비트 30이 1로 설정된 WM_KEYDOWN 메시지를 감지하면 아직 해당 키를 추적하지 않으면 추적을 시작하고 현재 시스템/틱을 저장하거나 그렇지 않으면 현재 시스템/틱 시간을 가져 와서 기간을 계산합니다. 그에 따라 행동하십시오. WM_KEYUP 메시지를 받으면 해당 키를 추적하는 중 추적을 중지하십시오.

관련 문제