C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[58115] Re:Re:단축키를 등록했는데 폼이 Active상태가 아닌데도 단축키가 먹네요.
마이티마우스 [] 988 읽음    2009-08-20 15:42
일단 답변 감사드리고요.
사실 설명드리기엔 너무 긴 사연에 의해서 KeyPreview 이 방식은 못쓰게 되었습니다.
그래서 그냥 RegisterHotKey를 쓰게 되었는데 폼이 Active 상태를 확인하고 그때만 단축키가 동작 하도록
구성을 해야 해서 IsActive <= 변수를 사용 하려 합니다.
방법없는지요?


장성호 님이 쓰신 글 :
: RegisterHotKey( Handle, DEF_VK_LEFT , 0, VK_LEFT );
:
: 에서요  주어진 HotKey는 , 넘져주는 Handle의 Active상태와 상관없습니다.
: VK_LEFT 키입력이  있으면
: RegisterHotKey로 등록한 Handle로 메세지를 주겠다는 것입니다.
:
: 그러므로 RegisterHotKey 는 프로그램 전체에서 Unique하게 사용할 목적의 Key를 등록하셔서 쓰는게 일반적입니다.
:
: Ctrl+Alt+N 같이 조합해서...
:
: VK_LEFT , VK_RIGHT 등은 대부분의 입력창 TEdit , TMemo등에서 사용되는 키인데 HotKey로 등록하면 문제가 있을듯 합니다.
:
:
: -----------------------------------------------------------------
: 여튼 Form의 Active상태일때만 Key를 받아 처리하고 싶으시면
: RegisterHotKey 로 key를 등록하지 마시고
:    1) 그냥 Form의  KeyPreview프로퍼티를 true로 하시고
:    2) Form의 OnKeyDown이벤트 핸들러에서 메세지를 받아서 처리하는게 좋을것 같습니다.
:
:
: //이런식으로요 ..
: 
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
:     this->KeyPreview=true;
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
:       TShiftState Shift)
: {
:      switch( Key )
:     {
:         case 37  : SelButton(5 );break ;
:         case 38  : SelButton(6 );break ;
:         case 39  : SelButton(7 );break ;
:         case 40  : SelButton(8 );break ;
:     }
: 
:     //또다른 HotKey예 
:     if(Shift.Contains(ssCtrl) && Shift.Contains(ssAlt)&& Key=='N') //Ctrl+Alt+N 
:     {
:         Memo1->Lines->Clear();
:     }
: }
: //--------------------------------------------------------------------------
: 
: 

:
: 그럼...
:
:
: 마이티마우스 님이 쓰신 글 :
: : 단축키를 등록했는데 폼이 Active상태가 아닌데도 단축키가 먹네요.
: : 현재 아래와 같이 소스 구성했구요.
: : void __fastcall TFrmMain::OnAppMessage( tagMSG &msg, bool &bHandled )
: : 요 함수에서 뭔가를 해야 할것 같은데 잘 모르겠어요.
: : bHandled를 false로 해도 안되네요..
: : 어떻게 해야 할까요?
: :
: :
: :
: : const int DEF_VK_LEFT  = 0x1235;
: : const int DEF_VK_RIGHT = 0x1236;
: : const int DEF_VK_UP    = 0x1237;
: : const int DEF_VK_DOWN  = 0x1238;
: :
: : bool IsActive ;
: :
: : //---------------------------------------------------------------------------
: : void __fastcall TFrmMain::TFrmMain(void)
: : {
: :     IsActive = true ;
: :     Application->OnMessage = OnAppMessage;
: :
: :     ::RegisterHotKey( Handle, DEF_VK_LEFT , 0, VK_LEFT );
: :     ::RegisterHotKey( Handle, DEF_VK_RIGHT, 0, VK_RIGHT);
: :     ::RegisterHotKey( Handle, DEF_VK_UP   , 0, VK_UP   );
: :     ::RegisterHotKey( Handle, DEF_VK_DOWN , 0, VK_DOWN );
: : }
: :
: : //---------------------------------------------------------------------------
: : void __fastcall TFrmMain::OnAppMessage( tagMSG &msg, bool &bHandled ) //  <===== 요함수 안에서 뭔가를 해
: :                                                                                                                         //  줘야 할듯 한데 그걸 모르겠네요
: : {
: :     if( msg.message == WM_HOTKEY )   // 사용자 정의 핫키 처리부
: :     {
: :         if (IsActive)
: :         {
: :             switch( msg.wParam )
: :             {
: :                 case DEF_VK_LEFT  : SelButton(5 );break ;
: :                 case DEF_VK_RIGHT : SelButton(6 );break ;
: :                 case DEF_VK_UP    : SelButton(7 );break ;
: :                 case DEF_VK_DOWN  : SelButton(8 );break ;
: :             }
: :         }
: :     }
: : }
: :
: : //---------------------------------------------------------------------------
: : void __fastcall TFrmMain::FormClose(TObject *Sender, TCloseAction &Action)
: : {
: :     ::UnregisterHotKey( Handle, DEF_VK_LEFT );
: :     ::UnregisterHotKey( Handle, DEF_VK_RIGHT);
: :     ::UnregisterHotKey( Handle, DEF_VK_UP   );
: :     ::UnregisterHotKey( Handle, DEF_VK_DOWN );
: : }
: :
: : void __fastcall TFrmMain::FormActivate(TObject *Sender)
: : {
: :     IsActive = true ;
: : }
: :
: : void __fastcall TFrmMain::FormDeactivate(TObject *Sender)
: : {
: :     IsActive = false ;
: : }

+ -

관련 글 리스트
58113 단축키를 등록했는데 폼이 Active상태가 아닌데도 단축키가 먹네요. 마이티마우스 992 2009/08/20
58114     Re:단축키를 등록했는데 폼이 Active상태가 아닌데도 단축키가 먹네요. 장성호 1108 2009/08/20
58115         Re:Re:단축키를 등록했는데 폼이 Active상태가 아닌데도 단축키가 먹네요. 마이티마우스 988 2009/08/20
58117             Re:Re:Re:단축키를 등록했는데 폼이 Active상태가 아닌데도 단축키가 먹네요. kylix 1220 2009/08/20
58119                 잘되네요 ^^ 감사합니다.(냉무) 마이티마우스 1027 2009/08/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.