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
[46259] [질문]타이머와 윈도우 메시지 관계..커서변경 감지
Symphony [wonyg2] 1188 읽음    2006-08-22 14:15
detect.exe 573.5KB 소스 빌드파일
안녕하세요. 눈팅만 하다가 오랜만에 질문 올려보네요..

다름이 아니라 마우스커서 모양이 변경됨을 알아내려고 테스트 코드를 만들다가

궁금증이 생겨서 질문을 올리게 되었습니다.

<소스>
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "mmsystem.h"
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainF *MainF;

//-- Global Variable --//
TMouse *MouseControl = new TMouse();
TPoint MousePos;
TCursorInfo CursorInfo;

AnsiString previous, current;
HCURSOR Handle_Cursor = NULL;

//---------------------------------------------------------------------------
__fastcall TMainF::TMainF(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainF::FormCreate(TObject *Sender)
{
    Application->OnMessage = WMTestAction;

    RadioTimer->Checked = true;
    Timer1->Enabled = true;

    Memo1->Text = "";
}
//---------------------------------------------------------------------------
void __fastcall TMainF::GetMouseInfo(void)
{
    MousePos = MouseControl->CursorPos;
    MouseX->Caption = MousePos.x;
    MouseY->Caption = MousePos.y;

    CursorInfo.cbSize = sizeof(CursorInfo);
    GetCursorInfo(&CursorInfo);

    Handle_Cursor = CursorInfo.hCursor;
    current = (BYTE)Handle_Cursor;

    if(current != previous){
        Memo1->Lines->Add(current);
        previous = current;
    }
}
//---------------------------------------------------------------------------
void __fastcall TMainF::FormDestroy(TObject *Sender)
{
    delete MouseControl;
    MainF->Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainF::Timer1Timer(TObject *Sender)
{
    GetMouseInfo();
}
//---------------------------------------------------------------------------
void __fastcall TMainF::WMTestAction(tagMSG &msg, bool &bHandled)
{
    if(msg.message == WM_MOUSEMOVE){
        GetMouseInfo();
    }
}
//---------------------------------------------------------------------------

void __fastcall TMainF::RadioMsgClick(TObject *Sender)
{
    RadioTimer->Checked = false;
    RadioMsg->Checked = true;

    if(RadioMsg->Checked){
        Timer1->Enabled = false;
    }

}
//---------------------------------------------------------------------------

void __fastcall TMainF::RadioTimerClick(TObject *Sender)
{
    RadioMsg->Checked = false;
    RadioTimer->Checked = true;

    if(RadioTimer->Checked){
        Timer1->Enabled = true;
    }
}
//---------------------------------------------------------------------------


위 소스를 돌려보시면, 타이머를 이용하여 마우스 커서의 모양을 감지할 경우, 현재 클라이언트가 포커스를 가지고 있지 않더라도 마우스커서가 변경됨을 감지할 수 있습니다. 그런데, 메시지를 이용하여 감지하려고 하면, 클라이언트 안에서 마우스를 이동할때만 감지가 되더군요.
메시지 또한 포커스를 안받더라도 디텍이 될듯 한데....왜그러는지 답변 부탁드립니다.
이런것 때문에 전역 후킹을 할바에는, 그냥 타이머를 이용하는게 나을듯 한데....왠지 부하가 심할것 같기도 하고
정확한 순간에 디텍하기에는 모자란 감이 있기도 한것 같고..


그리고 위 프로그램을 테스트 하다보니, 일반 윈도우창에서의 마우스커서감지는 되는듯 하나, 다이렉트X등을 이용한 화면에서의 마우스커서는 감지를 못하고 있습니다. 이것또한 이유를 알수가 있을까요?

메시지를 이용하여 잡을경우는 WM_SETCURSOR에서 안잡히길래, 그냥 WM_MOUSEMOVE에서 잡히도록 해보았습니다.

쓰다보니 질문이 아리송한데...많은 조언 부탁드립니다.

+ -

관련 글 리스트
46259 [질문]타이머와 윈도우 메시지 관계..커서변경 감지 Symphony 1188 2006/08/22
46293     Re:[질문]타이머와 윈도우 메시지 관계..커서변경 감지 공부맨 1347 2006/08/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.