|
안녕하세요. 눈팅만 하다가 오랜만에 질문 올려보네요..
다름이 아니라 마우스커서 모양이 변경됨을 알아내려고 테스트 코드를 만들다가
궁금증이 생겨서 질문을 올리게 되었습니다.
<소스>
//---------------------------------------------------------------------------
#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에서 잡히도록 해보았습니다.
쓰다보니 질문이 아리송한데...많은 조언 부탁드립니다.
|