お世話になります。
ポインティング・デバイスのホイールを回転させた際に、
(あるいは、そのデバイスに固有のホイールと互換性のある
スクロール機構を用いたスクロール操作を行った際に)
ドライバやユーティリティ、あるいはその設定によって
WM_MOUSEWHEELではなくWM_VSCROLLメッセージの通知を受けますが、
ウィンドウがWM_VSCROLLメッセージを受け取った時、
それがホイールの回転(及び類似の操作)によって
生成されたメッセージであるかどうかを判定したいのですが、
方法が分からないのでご教示願いたいと思います。
そのような判定が必要な理由は、スクロール量をプログラムの設定によって
ユーザーが指定できるようにしたい為です。
しばしばポインティング・デバイスの設定にスクロール行数の設定がありますが、
これでは全てのプログラムで共通の設定しか行えません。
プログラムによって、スクロールしたい内容やその一行に相当する
物理的な長さはまちまちであるにも関わらず、
統一的にしか設定できないのでは利便性を損なうと考えます。
その様な処理を行う常駐プログラムを利用するという方法もあると思いますが、
高々スクロールの行数を変えるだけの為にプログラムを
常駐させなければならないのもおかしいですし、
使用しているデバイスやドライバ、環境によって正常に動作するとは限りません。
まず、ドライバがWM_MOUSEWHEELをWM_VSCROLLに変換してしまっている場合で、
その機能を無効にできないのなら、そのマウスは捨ててください。
ここで変換されるとアプリケーションは何もできません。
この機能は、まだ、ホイールが正式対応で無かった頃の遺物で、邪魔な機能と
いえます。
次に自分のアプリはデルタ値を参照して好きにコードしましょう。
注意が必要なのは最近のデルタ値は120の倍数でない値も来ることです
(インテリマウスの新しいやつなど)。
最後に。御主張の通りマウスホイールが回転したら「何をするか」は
そのアプリケーション開発者の専権事項であります。
常駐プログラムでどうかするはまさに「余計なお世話」であるので、
そのことはすぐに忘れましょう。
ただし、アクセシビリティの向上の場合を除きます・・・(vv;)。
ご返答ありがとうございます。
判定は不可能という解釈でよろしいですね。
>まず、ドライバがWM_MOUSEWHEELをWM_VSCROLLに変換してしまっている場合で、
>その機能を無効にできないのなら、そのマウスは捨ててください。
スクロール量のカスタマイズはユーザー様よりご要望頂いた内容であり、ユーザー様に
対して「あなたのマウスを捨てて下さい」と言う事は、私には出来ません。
>この機能は、まだ、ホイールが正式対応で無かった頃の遺物で、邪魔な機能と
>いえます。
まさしくその通りであると思います。
WM_MOUSEWHEELメッセージが処理されなかった場合はWM_VSCROLLを送るようにすれば
良いものを、最初からWM_VSCROLLを送信して来る意図が分かりません。
ホイールがスクロール以外に使用される可能性について全く考慮していませんし、
浅はかで姑息な方法であると言えます。
あるいは、もしプログラムでWM_MOUSEWHEELが処理されたかどうかの判別が難しい
というのであれば、WM_MOUSEWHEELメッセージの設計に誤りがあったと言う事です。
当のMicrosoft社のマウスにおいて、WM_MOUSEWHEELとWM_VSCROLLが連続して両方
送信されて来てしまう為に、WM_MOUSEWHEELに対応したところ
倍スクロールされてしまう様になったという事例も聞いた事があります。
余りにも馬鹿げていると言わざるを得ません。
USBでなく、バスマウスはどうですか?
やはりだめですか?
> スクロール量のカスタマイズはユーザー様よりご要望頂いた内容であり、
> ユーザー様に対して「あなたのマウスを捨てて下さい」と言う事は、
> 私には出来ません。
うーーん、なるほど
僕も、
「マウスによっては、ホイール機能が本ソフトに対応していない可能性が
あります。」
としかいえませんね。
マウスのメーカは、どこですか。
ほとんどのマウスはHID標準マウスなので、対応不可能なのですが、
Microsoft社のインテリマウス等専用のドライバーを用意している
場合もあるので、その場合はまだ望みはあるかも知れませんね。
ただ、新しいドライバーにマウスのハードが対応しているかどうか問題ですね。
>あるいは、もしプログラムでWM_MOUSEWHEELが処理されたかどうかの判別が難しい
>というのであれば、WM_MOUSEWHEELメッセージの設計に誤りがあったと言う事です。
デバイス側に、毎回「メッセージがなんらかの処理されたかどうか」を
返答する設計のほうが問題
アプリケーションが不正な状態になったら、
デバイス側は、ずーーーっと返答待ちになってしまう
また、メッセージループを作ったことがあるなら分かるはずだが
「あるメッセージに対応した処理がない」
は、不正な処理でもなんでもない
元々、「WM_MOUSEWHEELではなくWM_VSCROLLメッセージの通知を行なう事」が
イレギュラーなのであって元のメッセージの設計が云々と言うのは言いすぎでしょう。
言われている措置は、ホイール付きのマウスが普及し始めた時に
対応していないソフトでもホイールでスクロールしたいというユーザーの要望に
アプリの改修の改修無しに対応しようとした苦肉の策であり、
そもそも、後々互換性に問題が出るであろう事がわかっていて
この機能を実装した事自体に問題があります。
マウスのドライバソフトにこの読み替え機能をOFFにする機能があるのであれば、
それで使ってくださいとしか言いようが有りません。
この問題に関してはOSの仕様にない実装をしてしまったマウスのメーカー側の
責任ですからいかんともしがたいですね。もしかしたらマウスドライバを
最新にすれば、この切り替えができるようになるケースもあるかもしれません。
あとは、自動で判定するのではなくてアプリのユーザー設定で
どちらのメッセージで対応するかをユーザーに設定してもらうくらいしか
ないかなと思います。どちらかの実装が動作するかを設定で切り替えるわけですね。
現状に向かって文句を言ってもしょうがないので、
何とかする為の次善の策でも講じるしか無いと思いますよ。
すみません。日本語が変ですね。
誤)
アプリの改修の改修無しに対応しようとした苦肉の策であり、
正)
アプリの改修無しに対応しようとした苦肉の策であり、
誤)
ないかなと思います。どちらかの実装が動作するかを設定で切り替えるわけですね。
正)
ないかなと思います。どちらの実装が動作するかを設定で切り替えるわけですね。
> スクロール量のカスタマイズはユーザー様よりご要望頂いた内容であり、ユーザー様に
> 対して「あなたのマウスを捨てて下さい」と言う事は、私には出来ません。
まあ、これに関しては言い方次第と言う気もします。
レスの中で「捨ててください」と書いているのは多分、
サポート対象外にした方が良いという意見だと思います。
この辺はユーザー様との御相談でしょうね。
既に書いていますが、両方の実装しておいてユーザーに設定で切り替えてもらう
と言うのも一つの提案だと思います。
元々そのマウスがWindowsの仕様から外れた動作をしている為で
これに関してはマウスのメーカーで無いと対応が出来ない事を説明すれば、
手動での切り替えを否とは言わないのではないかなと思うのです。
ユーザーの利便性を図るのは確かに必要だと思いますけれど、
実際に無理な部分と言うのもあるわけですし、折衷案位しかないかなと思います。
WM_MOUSEWHEEL->WM_VSCROLL変換を行うマウスはいずれ消滅します。
この手のドライバを作っていたメーカのほとんどが今は作っていません。
また、この手のドライバを使用すると、現在のほとんどのM$製アプリケーション
ですら正常なスクロールができないことはご存知の通りです。
かつて、散々悩んだ、ホイールデルタ値に「1」が入ってくるという、
おばかなドライバも、デフォルトでは、デルタ値がさかさまになってる
アホウなドライバも絶滅してくれました(とほい目)。
あのとき、これらのイレギュラーなマウス群に対して、絶対にアプリケーション
では対応はしないという仕様に客は納得してくれました。
それにかかるコストが将来的に合理的な対効果を生まないことを説得できなければ、
何の面目があってプロを自称できるのでしょうか。と、自分は考えています。
>WM_MOUSEWHEELメッセージが処理されなかった場合はWM_VSCROLLを送るようにすれば
>良いものを、最初からWM_VSCROLLを送信して来る意図が分かりません。
1デバイスドライバーにWM_MOUSEWHEELメッセージを送るルーチンがない。
2デバイスドライバーにWM_MOUSEWHEELメッセージを送るルーチンがあるが
、マウス本体からホイールデータがデバイスドライバーに出力されない。
1はマイクロソフト製のインテリマウスみたいにデバイスドライバーのインストール
するようになっている場合。
2はOS付属のHID標準マウスのデバイスドライバーを使う場合。
対策として、
1は、デバイスドライバーを新しいのに更新する。
2は、新しいマウスを購入する。
だと思います。
1の場合はマイクロソフト製のインテリマウス等限られますんでほとんど
2ですね。
>あるいは、もしプログラムでWM_MOUSEWHEELが処理されたかどうかの判別が難しい
>というのであれば、WM_MOUSEWHEELメッセージの設計に誤りがあったと言う事です。
うーーん、
デバイスドライバーは、デバイスからホイールデータがきたらWM_MOUSEWHEELメッセージ
を出力するだけですね。
理由二つありますね。
ひとつは、ryoさんの意見どおりに
>アプリケーションが不正な状態になったら、
>デバイス側は、ずーーーっと返答待ちになってしまう
僕も失敗したことがあるけど、ウインドウ終了できずに、電源切って
終わらせるしかなかった。
もう一つは、メッセージを受け取ったアプリが分からない。
デバイスドライバーは、ホイールデータがきたつどメッセージを送信している
だけなのでいちいちアプリの識別まで出来ない。
ですね。
>元々、「WM_MOUSEWHEELではなくWM_VSCROLLメッセージの通知を行なう事」が
>イレギュラーなのであって元のメッセージの設計が云々と言うのは言いすぎでしょう。
なるほど、このことは知りませんでした。
ってことはすべてWINDOWSの標準のドライバーを使っているマウスは
大丈夫ってことですか?
マイクロソフトがマウスホイールが付いたマウスが出だした時、
殆どのアプリはマウスホイールのメッセージに対応していなくて
MS製以外のアプリでは殆ど全滅だったような気がします。
当時、MSOfficeとかはマウスホイールに対応していた気がします。
で、たいていの人はマウスホイール使えねーという感じになっていたので
当時のサードパーティのマウスがホイールイベントに対応していないソフトでも
ホイールが使えるマウスと言う事で出してきたと記憶しているのですが、
間違いですかねぇ。
この手のマウスを使うとOfficeのスクロールがおかしくなったりして
これまた使えねーとか言う話になったり。
イベントを出しているのは結局ドライバでしょうから、
Windows標準のドライバなら大丈夫だと思っていたんですが、
逆に大丈夫じゃないケースってあるんでしょうか。
改めて聞かれると自身がなくなってきていますが。(^^;
確か、出始めのマウスはOfficeと抱き合わせ販売とか
していた気がしますねぇ。
> かつて、散々悩んだ、ホイールデルタ値に「1」が入ってくるという、
> おばかなドライバも、デフォルトでは、デルタ値がさかさまになってる
> アホウなドライバも絶滅してくれました(とほい目)。
こんなドライバがあったんですね。
私の場合、ここまでひどいのには当たらなかったので
そういう意味ではラッキーだったのかも。
基本、この辺の話はドライバの話になるので
いまだにこう言うのを使っているのは相当古いマウスを使っている人
限定になるんでしょうねぇ。
#これを期に買いなおしをお勧めするのも存外悪い話ではないという気もしますね。
歴史的経緯で色々あるみたいですね。
ZMouse.h を見てみたり。