C言語関係掲示板

過去ログ

No.246.マウスが動いたかどうか判定する関数


No.1485

マウスが動いたかどうか判定する関数
投稿者---Ras(2002/05/10 00:30:03)


初歩的な質問ですいません・・・。
Windowsプログラムで
マウスが動いたかどうかを検知したいのですが、
WM_MOUSEMOVEだと
プログラムのウインドウ内でないと検知してくれないらしく、
ウインドウ外でマウスが動いたかどうかを知りたいです。
マウスの座標とかは必要としないので
動いたかどうかだけ返してくれる関数はありませんでしょうか?

あ、あと、も一つ質問なのですが、
一定時間たつとでメッセージボックスが出て、
また一定時間がたつとメッセージボックスが・・・。
と言うようなプログラムを作ろうと思っています。
一定時間たつごとに何かを実行させるプログラムをしたいのですが
while(clock() - BackTime > 3000)
{
MessageBox( hWnd, "時間です","3秒たちました", 0 );
BackTime = clock();
}
このようにすると、常にwhileが回っていると言うことになり
WindowsXPで確認したところ
CPU占有率が100%になってしまいます。
とても無駄な事をしているような気がしてたまりません(苦笑)
常に監視しなくても良い方法とかってないですか?

まだプログラム初心者ですので、
かなり間違った質問をしているのかもしれませんが
よろしければ教えていただくと嬉しいです。
お願いします!!

No.1487

Re:マウスが動いたかどうか判定する関数
投稿者---B.Smith(2002/05/10 13:17:13)


こんにちは。

関数の詳細な説明はしませんので、MSDNライブラリを参照してください。
インストールしていない等、直ぐに見れない場合はこちら
http://www.microsoft.com/japan/developer/library/

・マウス
SetCapture、ReleaseCaptureというAPIがあります。これを使うことで、指定のウインドウにスクリーン上のすべてのマウスイベントを送るようにすることが出来ます。ドラッグ&ドロップ機構を作成する時等に用いられます。
SetCaptureで開始し、終了時はReleaseCaptureを実行するようにします。後は普通にマウスイベントを処理するだけです。

・タイマ
タイマイベントを利用する
WM_TIMERを処理する方法で、割とポピュラなものです。関数SetTimerを実行すると、指定した間隔でWM_TIMERが送られます。イベント停止はKillTimerです。

タイマイベントは、スレッドにメッセージを一定間隔でポストするタイプの処理です。これは関数SetTimerの引数設定でコールバック関数を呼び出すようにしても同じです。Windowsは、メッセージキューがWM_TIMERで埋まってしまうことが無いように、キュー内にWM_TIMERが存在しない場合にのみポストするようにしています。また、WM_TIMERはWM_PAINTを除くすべてのメッセージよりも優先度が低いので、精度を要求する処理には向きません。

関数Sleepを使用する
関数Sleepは、指定した時間以上、処理をWindowsに戻します。
例.
    Sleep(3000);
    MessageBox(hWnd,"時間です","3秒たちました",MB_OK);

関数Sleepを使うことで、対象のスレッドがCPUを占有してしまうことは無くなります。
この関数で指定する時間は、Windowsに処理を返す最低時間です。実際には、指定時間以上、処理が戻らない場合もありますので、やはり精度を要求する処理には向きませんが、処理間隔が秒単位であるならば実用的には十分です。また、,離織ぅ泪ぅ戰鵐箸里茲Δ法▲廛蹈哀薀犢域に渡って処理を構成する必要が無くなりますので、ちょっとしたインターバルタイマを使いたい時には役に立つと思います。関数Sleep以外にもWaitForSingleObjectのような関数でも同じ効果を出すことが出来ます。


,筬△蓮▲瓮奪察璽犬筌好譽奪匹離好吋献紂璽螢鵐阿亡悗錣辰討い襪發里覆里如∪催戮呂△泙蟾發出来ません。今回はそれほど問題にはならないかもしれませんが、処理間隔が非常に短い場合には、貴方が考えていた「ループでディレイをかける方法」の方が良い場合もあります。ループを使用する方法は、状況によっては必ずしも悪い方法ではない、ということです。
簡単な例.
    Time = GetTickCount() + 10;   /* delay 10ms */
    while(GetTickCount() < Time);

Windows風のディレイのかけ方とは言えないかもしれませんが、このような方法が有効な場合もある、ということは知っておいた方が良いかもしれませんね。



No.1489

ありがとうございます!!よ、よろしければもう一つお聞きしたいことが・・・
投稿者---Ras(2002/05/10 23:27:10)


B.Smith様本当にありがとうございます!!
確か以前も教えていただきましたね。
もう感謝感激です(笑)
マウスのやつですが、教えていただいたの出来ました!!
タイマー制御の方は
あまり精度は求めてなかったのでWM_TIMERでやってみました。
SleepもWM_TIMERも便利ですね♪

で、すいません・・・。
この問題が解決したらまた問題が(苦笑)
タスクバーで自分が作ったプログラムを切り替えた(非アクティブ)にしたときに、
強制的にアクティブ可にしたいのですが、どうすればよいのでしょうか?
本当すいません。調べてみてもよく分からないんです(泣)
ご迷惑をおかけしますがヨロシクお願いします。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.22
Copyright(c) 2000-2002 TOMOJI All Rights Reserved