マウスの動きを監視するには?

解決


pink  2009-12-08 20:59:28  No: 71179  IP: [192.*.*.*]

(開発環境)
WindowsXP Pro SP2
VS2005 SP1
MFCベース
SDI、FormView

マウスがアプリケーションのウィンドー外にある場合も動いているか
監視する方法を教えて頂けないでしょうか。
CxxxViewクラスのOnMouseMoveだと、ウィンドーが見える状態でマウスが
ウィンドー内にある動きしか監視できません。

最小化していても、他のアプリに隠れている時も、要するに画面上で
動いているかどうかを常に監視する方法ですが・・・

よろしくお願いします。

編集 削除
オショウ  2009-12-08 21:22:57  No: 71180  IP: [192.*.*.*]

マウスフックですネ!
http://www.kumei.ne.jp/c_lang/sdk2/sdk_162.htm

マウスキャプチャと言うのもあります。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_101.htm

以上。参考まで

編集 削除
pink  2009-12-09 08:40:16  No: 71181  IP: [192.*.*.*]

オショウさん、有難う御座います。

「猫でも」さんは敷居が高くて内容があまり理解できませんでした。
SetWindowsHookExを調べて以下の様に作成したのですが
うまくマウス動作を検知してくれません。
(CxxxView)
HHOOK hHook; // フック識別用のハンドル

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   // マウスメッセージでなければ、次のフックプロシージャを呼ぶ
   if(nCode != HC_ACTION)
      return CallNextHookEx(hHook, nCode, wParam, lParam);
   else
   {
      AfxMessageBox("123");
      return 1;
   }
}

void CxxxView::OnInitialUpdate()
{
   hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, NULL, 0);
}

void CxxxView::~CxxxView()
{
   UnhookWindowsHookEx(hHook);
}

よろしくお願いします。

編集 削除
オショウ  2009-12-09 13:07:36  No: 71182  IP: [192.*.*.*]

ええ〜と・・・

そのコードのモジュールは、単体のDLLになってますか?
元アプリが、そのDLLをLoadLibraryして、フックを開始させ
必要が無くなったらアンフックして、FreeLibraryする。

この手順を守らないと、いろいろな問題が出たり、正常に機
能しません。

システム側の機能をフックするので、PC再起動なんてこと
にもなりますから。

以上。

編集 削除
fuku  2009-12-09 18:27:51  No: 71183  IP: [192.*.*.*]

横槍失礼します。

マウスの移動監視ということですが、マウスフックなんて使わなくても、
単にタイマーで定期的にGetCursorPosして前回との差分を取るだけでも十分ということも多いと思います。
これだとタイマーの周期以下の動きは追跡できませんが、実装は簡単になります。

編集 削除
ryo  2009-12-09 21:55:51  No: 71184  IP: [192.*.*.*]

>うまくマウス動作を検知してくれません。
どういう風に?

編集 削除
pink  2009-12-09 22:42:39  No: 71185  IP: [192.*.*.*]

返事が遅れて申し訳ありませんでした。

DLLにてシステムフックを使用して監視できました。
みなさん、有難うございました。

編集 削除