|
장성호님.. 매번 답변에 감사드립니다.
밑에 정보 유용히 잘 쓰도록 하겠습니다.
전 다른 방법으로 해결을 했습니다.. 방금요...^^
방법은...
Application->ProcessMessages()와 서브클래싱을 적절하게 쓰니까 되더라구요..
ProcessMessages()는 현재 메시지 큐에 쌓여 있는 모든 메시지를 즉시 실행시켜주는 함수이더군요..
그래서 a()함수가 실행이 끝난 직후 ProcessMessages()를 실행시켜 메시지 큐에 있는 WM_KEYDOWN을 실행시키게 됩니다. 그러면 WM_KEYDOWN는 제가 만들어놓은 서브클래싱 함수로 들어갈것이고.. 전 거기서 WM_KEYDOWN을 리턴만 시켜주면 되더군요...
이렇게 하면 메시지 큐에 쌓여 있던 메시지가 전부 없어지게 됩니다.
그런 후.. 다시 WM_KEYDOWN에 의해 a()가 실행이 되고.. a()가 종료된 후, ProcessMessages()에 의해 메시지 큐에 있던 모든 메시지가 다시 삭제되고요..
장성호님께서 알려주신 방법대로 하니.. 동일하게 잘 되더라구요..
암튼 다시 한번 감사합니당.
장성호 님이 쓰신 글 :
: a()
: {
: for(int i=0;i<20;i++) Sleep(100);
: }
:
: //---------------------------------------------------------------------
: void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
: TShiftState Shift)
: {
: a();
: MSG mes;
: while ( PeekMessage(&mes, Edit1->Handle , WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE ) == TRUE );
: }
: //---------------------------------------------------------------------------
:
: //PeekMessage( (&mes, Edit1->Handle , WM_KEYFIRST, WM_KEYLAST) ; // 키보드에 관한 모든 메세지 삭제
: //PeekMessage( (&mes, Edit1->Handle , 0, 0) // 모든 메세지 삭제
: //PeekMessage( (&mes, Edit1->Handle , WM_MOUSEFIRST, WM_MOUSELAST) ; // 마우스에 관한 모든 메세지 삭제
:
:
: 그럼 즐겁게 ....
:
:
: 이용태 님이 쓰신 글 :
: : WM_KEYDOWN이 발생하면 a()라는 함수가 실행됩니다.
: :
: : 근데.. 키보를 계속 누르고 있으면 WM_KEYDOWN메시지가 계속 발생할꺼고.. 메시지큐에 쌓이게 될겁니다.
: :
: : 그럼 a()라는 함수가 종료되면.. 그동안 쌓여있던 WM_KEYDOWN메시지가 처리될꺼고 a()가 다시 실행이 되는걸로 압니다.
: :
: : 그런데 문제는 a()가 실행되는 시간이 조금 됩니다. 대략 2초 정도 되는데요...
: :
: : a()가 실행되는 2초 동안에는 WM_KEYDOWN을 받아들이지 않게끔 할려고 합니다. 즉 a()가 실행되면서 받아들이는 WM_KEYDOWN 받지 않고 있다가, a()가 실행이 끝난 후에 WM_KEYDOWN를 받아 a()를 다시 실행시키고자 하는거죠..
: :
: : 아니면 다른 방법으로.. a()가 실행되는 동안 WM_KEYDOWN를 메시지 큐에 쌓아놓되, a()가 끝나면 메시지 큐를 비워버리는 방법도 괜찮을거 같기도 합니다.
: :
: : 서브클래싱을 해서 해결해볼려고 했지만 안되더군요...;;;
: :
: : 어떤 방법으로 하는것이 좋을지 답변 부탁드립니다.
|