
No.4ベストアンサー
- 回答日時:
>あと3秒をチェックするのにif文を使っているため ==3 としていたのですが、それではできないのでしょうか。
きっちり動けば良いですが例えばイベント動作が遅れて
Timer関数走ったときの求めた時間秒数が
2・4のように変化していたら ==3 のチェックでは引っかかりませんよね
>=3でチェックすれば4でも引っかかりますよね
ということです
> =3 だとエラーが出てデバッグできません。
> を引用と見間違えられたかな? 比較式としての >= です
(今見たら確かに間違えそうだ)
#2さんへの補足についても一つ
>エラーはでずにデバッグできるのですがマウスカーソルの表示非表示はなりませんでした。
ShowCursor時間数の御理解がいまひとつのようです
TRUE・FALSEのパラメータでで一回呼べば表示・非表示になるという関数ではないのです
(前書いたURLの説明を再度お読みください)
内部にマウス表示のカウンターを持っていてそのカウント値が
負数だったとき初めて非表示0以上で表示と切り替わります
ですのでちゃんと動作させるためには関数の戻り値をチェックして
必要な回数分ShowCursor関数をコールし続けなければなりません
whie(ShowCursor(TRUE) >= 0 );
whie(ShowCursor(FALSE) < 0 ); のように
書いているコードではShowCursor(TRUE)は数回呼ばれる
可能性があるのにShowCursor(FALSE)は
一定時間経過後1回しか呼ばれません
その為非表示にならないのです
> CXX0017: エラーです: シンボル "ShowCursor" が見つかりません
これについてはどのような状況で出ているのか分からないので
なんともいえません
おはようございます。
ご丁寧な説明、とてもわかりやすく理解できました。
「>=3」だったのですね。引用と見てしまいました。失礼しました。
始めに作っていたプログラムを「>=3」のように直して実行してみたのですが、
マウスカーソルは非表示になりませんでした。
ほかの部分でプログラムの書き間違いがあるのでしょう。
断念してもう一方のプログラムをkoi1234さんのアドバイスを参考にWM_TIMERの部分を
whie(ShowCursor(FALSE) >= 0 );
と直して実行したらプログラム成功いたしました!!
koi1234さん、titokaniさん本当に感謝いたします。
ありがとうございました。
No.3
- 回答日時:
時間取得で一番簡単なのは GetTickCount() かと思います
※ OS連続運転などしてるならオーバフロー対策も考える必要があります
>1000ミリ秒単位でWM_TIMERを呼び出しているために
>誤差などが生じて正確に差を「3」と計算できないのでしょうか。
Windowsのタイマーはそれほど制度が良いわけではありませんので
誤差が出る事もあります
後やってないと思いますが3秒とチェックするのに == 3 等とやっちゃ駄目ですよ
>= 3 としておけば少なくても動くはずです
秒単位で測定したいならもっと時間を短くした方が良いでしょう
例) 1秒だから1000では無く500 等
(ちょっと確証が無かったので書きませんでしたが)
SetTimerで関数呼びなおして時間変わるんであれば#2さんの方法が
簡単かもしれません
何度もアドバイス本当に感謝いたします。
本など読んで調べてみましたが、やはりSetTimerは正確ではないのですね。
第3引数に指定した通り毎回WM_TIMERを呼ぶとは限らないと記述してありました。
おかげさまで勉強になりました。
あと3秒をチェックするのにif文を使っているため ==3 としていたのですが、それではできないのでしょうか。
=3 だとエラーが出てデバッグできません。
勉強不足で申し訳ないです。
今、これまで作ったプログラムの改良と
下記にあるtitokaniさんから頂いたアドバイスを参考に
平行してプログラムを組んでいるところです。
もう少し粘ってやってみたいと思います。
No.2
- 回答日時:
もっと簡単にできると思います。
WM_MOUSEMOVE
マウスを表示。
「一定時間」を引数として、SetTimerする。
WM_TIMER
マウスを非表示。
KillTimerする。
これでいいんじゃないかと。
同じIDでSetTimerされた場合、以前セットされたいたタイマーは上書きされるはずですから。
なるほど。SetTimerは上書きされるのですね。
私もそこが不安でなかなかプログラムがかけませんでした。
アドバイスありがとうございます。
titokaniさんのを参考に、下記のようにプログラムを組んでみました。
case WM_MOUSEMOVE:
if(::IsZoomed(hWnd)){ //最大化の時
ShowCursor(TRUE); //マウスカーソル 表示
SetTimer(hWnd, 2, 3000, NULL); //3000ミリ秒単位でWM_TIMERを呼び出す
}
return 0;
case WM_TIMER:
if(::IsZoomed(hWnd)){
ShowCursor(FALSE); //マウスカーソル 非表示
KillTimer(hWnd, 2);
}
(中略)
return 0;
これで実行してみると、
エラーはでずにデバッグできるのですがマウスカーソルの表示非表示はなりませんでした。
ベレークポイントを置いてプログラムを見ていくと、
自動変数の場所に次のエラーメッセージが出ていました。
CXX0017: エラーです: シンボル "ShowCursor" が見つかりません
これは何が原因なのでしょうか。
なんども質問ごめんなさい。
もう少し粘ってみます!
No.1
- 回答日時:
考え方だけです(実装方法は色々考えられます)
マウスが移動した場合 MouseMove イベントメッセージが動作します
そこで時間を記録します --- 最後にマウスが動作した時間になります
適当なイベント(例えばタイマーや単独の監視スレッド)などで
最後にマウス動かしたときからの時間経過をチェックします
上を実装すればお望みの動作になります
(制度をそれほど仏用としないのであればタイマーイベントで十分でしょう)
いつもお世話になります。
koi1234さんのご教授を参考にプログラムを作成してみました。
(1)WM_MOUSEMOVEで現在時刻を取得。
(2)SetTimer関数を使い1000ミリ秒単位でWM_TIMERを呼び出す。
(3)WM_TIMERが呼び出されるたびに時刻を取得し、
WM_MOUSEMOVEで取得した時刻との差を計算して、(ex.3秒たったら)
マウスカーソルを非表示にする。
といったプログラムを作成したのですが、
実行してもマウスカーソルはずっと表示されたままで非表示になりませんでした。
1つ1つ見ていくと、(1)と(2)はできているようです。
(3)は正確に3秒をはかれないため確かめることはできず、
if文で判定しているのですがそのif文はできているようです。
となると、差を求めるときの計算方法が違うのでしょうか。
現在時刻を取得し、
(時間 * 3600) + (分 * 60) + 秒
で秒単位で計算して差を求めています。
1000ミリ秒単位でWM_TIMERを呼び出しているために
誤差などが生じて正確に差を「3」と計算できないのでしょうか。
ここに質問してしまってごめんなさい。
もう少し試行錯誤してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
confirm()をはい/いいえ に切...
-
Javascriptエラーの原因が分か...
-
JavaScriptで ブラウザの閉じる...
-
alert()が実行できない
-
正整数の半角数字かどうか判定する
-
PowerPointで時計表示
-
if(1){...}とはどういうことで...
-
Webページ中の javascript をVB...
-
指定した日時にリロード処理を...
-
Excel VBAで、ワークシート関数...
-
禁止文字チェック
-
C#の質問です。
-
ページを一回だけリロードさせ...
-
CreateFile、CloseHandleの繰り...
-
「終了していない文字列型の定...
-
ホームページビルダーを使って...
-
以下のコードを実行しても、オ...
-
htmlのfileタグに自動で値を入...
-
Java Script を.jsファイルを利...
-
【教えて下さい】正規表現クイズ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javascriptエラーの原因が分か...
-
confirm()をはい/いいえ に切...
-
PDFフォームで条件つき金額を表...
-
Ajaxで通信したJavascript動作...
-
ホームページビルダーでスクリ...
-
IE8開発者ツールでソースの修正
-
HTAで,親ウインドウを閉じ...
-
javascriptのis null or not an...
-
IEにおいてjqueryが動いてくれ...
-
IEでiz_zoom(画像拡大表示Java...
-
getElementByIdで謎のエラーが...
-
ホームページで写真自動切り替...
-
Javascript でログインできない...
-
エディタ機能のTEXTAREAを作りたい
-
マクロについて。
-
javascriptのエラー
-
このページのスクリプトでエラ...
-
オブジェクトでサポートされて...
-
document.selectionについて
-
JavaScriptのエラー で困ってい...
おすすめ情報