kylix 님이 쓰신 글 :
: 특정 폼에서만 사용하실려면...
: 폼의 OnActivate 이벤트에서 Hot Key를 등록하시고 OnDeactivate이벤트에서 Hot Key를 제거하세요...
:
: 마이티마우스 님이 쓰신 글 :
: : 일단 답변 감사드리고요.
: : 사실 설명드리기엔 너무 긴 사연에 의해서 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 ;
: : : : }