|
1. 포커스를 잃으면 해당 Application에 WM_MOUSEMOVE 메시지가 발생하지 않으므로 Application->OnMessage는 좋은 방법이 아닌것 같습니다. 타이머가 맘에 안드시면 Thread쪽으로 생각해보시거나(어차피 타이머와 마찬가지로 일정한 주기로 체크하는 방식이 되겠지만요), DLL을 이용한 Hook 쪽으로 방향을 잡으시는게 더 좋을꺼 같은데요.
2. DX는 몰라서 패스-_-;
Symphony 님이 쓰신 글 :
: 안녕하세요. 눈팅만 하다가 오랜만에 질문 올려보네요..
:
: 다름이 아니라 마우스커서 모양이 변경됨을 알아내려고 테스트 코드를 만들다가
:
: 궁금증이 생겨서 질문을 올리게 되었습니다.
:
: <소스>
: //---------------------------------------------------------------------------
:
: #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에서 잡히도록 해보았습니다.
:
: 쓰다보니 질문이 아리송한데...많은 조언 부탁드립니다.
|