2014-05-21 2 views
8

이 질문은 답변되었지만 적절한 답변을 찾을 수 없었습니다. 폼에서 F12 키를 누르면 디버그 스위치를 토글하려고합니다. 양식과 함께 각 필드에 대해 별도의 기능을 설정해야하므로 onkeydown 이벤트를 사용할 수 없습니다. 그래서 연구 하 고 키보드 후크를 설정하는 SetWindowsHookEx 함수를 발견했습니다. 나는이 개 표시 F12 키가있다 눌러 누를 때마다 얻고 제외하고이 잘 작동 :델파이로 F12를 찾는 키보드 후크

2014/05/21 14:16:43.334 
Code: 0 
Key: 123 
KeyStroke: 5767169 
KeyStroke to Hex: 00580001 
2014/05/21 14:16:43.446 
Code: 0 
Key: 123 
KeyStroke: -1067974655 
KeyStroke to Hex: C0580001 Note: this should be the keystroke that reflects KEYDOWN 

을 나는 키 입력이를 keyDown (WM_KEYDOWN $ 0100)를 확인하기 위해 가능한 방법을 참조하십시오. 내 질문에 WM_KEYDOWN에 대한 키 입력을 테스트하려면 어떻게해야합니까? 당신은 각 개별 컨트롤의 OnKeyDown 이벤트에 다른 처리기를 할당 할 필요가 없습니다

function KeyboardHookProc(Code: Integer; Key: Word; KeyStroke: LongInt) : LongInt; 
begin 
    Result := 0; 
    if Code = HC_NOREMOVE then exit; 
    Result := CallNextHookEx(FkbHook, Code,Key,KeyStroke); 
    if Code < 0 then exit; 

{ 
WM_KEYDOWN 

} 
    if (KeyStroke and WM_KEYDOWN) = 0 then { this is where I need to test but this doesn't work! } 
    begin 
    if Code = HC_ACTION then 
    begin 
    case Key of 
     vk_F12: begin 
      TKPMF.Memo1.Lines.Add(FormatDatetime('yyyy/mm/dd hh:nn:ss.zzz',now)); 
      TKPMF.Memo1.Lines.Add('Code: ' + IntToStr(Code)); 
      TKPMF.Memo1.Lines.Add('Key: ' + IntToStr(Key)); 
      TKPMF.Memo1.Lines.Add('KeyStroke: ' + IntToStr(KeyStroke)); 
      TKPMF.Memo1.Lines.Add('KeyStroke to Hex: ' + LongToHex(KeyStroke)); 
     end; 
    end; {case} 

    end; 
    end; 

end; 
+1

어떤 델파이 버전을 사용하고 있습니까? 양식의 KeyPreview를 사용하지 않는 이유는 무엇입니까? http://stackoverflow.com/questions/6509242/how-does-delphis-keypreview-work – Frazz

+2

최악의 경우 ApplicationEvents를 사용하십시오. 자신의 응용 프로그램을 연결할 필요가 없습니다. –

+3

왜 누군가가 여기에 downvote 모르겠어요. OP는 연구의 증거와 예제 코드를 보여주었습니다. OP도 새롭기 때문에 (rep = 1), Delphi 버전을 명확히하지 못하는 것은 용납 될 수 없습니다. – Argalatyr

답변

12

:

여기 내 콜백 함수입니다. 모두 동일한 단일 핸들러를 사용하도록 지정할 수 있습니다. 양식의 KeyPreview 속성을 활성화하면 모든 컨트롤에 처리기를 할당 할 필요가 전혀 없으며 양식의 OnKeyDown 이벤트를 단독으로 사용할 수 있습니다. 여러 양식을 열었을 때 키 누름을 감지해야하는 경우 TApplication.OnMessage 또는 TApplicationEvents.OnMessage 이벤트를 대신 사용할 수 있습니다. 어쨌든 SetWindowsHooKEx()을 통해 키보드 후크를 사용할 필요가 없습니다.

후크가 작동하지 않는 이유는 WM_KEYDOWN이 키 입력 방지가 아닌 창 메시지이기 때문입니다. Read the documentation. 표시된 두 메시지의 키 입력은 비트 30 (이전 키 상태)과 31 (전환 상태)에서만 다릅니다.

+0

레미, 그렇습니다. 평소처럼, 너무 복잡한 일을하려고합니다. 나는 항상 당신이 정답을 알기를 기대합니다. –

+1

누군가가 당신에게 정확한 답을 줄 때, 당신은 그것을 받아들이 기 위해 버튼을 클릭해야합니다 (하나 이상의 답이있을 때만 작동합니다). 그렇게하면 응답자가 귀하의 질문에 대해 긍정적 인 태도를 취했을 때와 마찬가지로 응답자의 평판이 약간 좋아지며 응답시 녹색 눈금이 생겨 다른 사용자에게 도움이됩니다. – MartynA

+5

MartynA - 완료! –