
カーソルの移動量(GetCursorPosで可)でなく、マウス自体の移動量を取得する事は出来ないのでしょうか?
マウスカーソルはディスプレイの端に行くと動作が止まってしまいます。とにかく2次元の自由な動作を取得してアプリで使用したいのですが、マウスの動作が最適です。そこで、マウスカーソルは動作を停止させ(止めて)、マウス自体の移動量が取得できないかいろいろ試しました。
試したのが以下の方法です。
・マウスカーソルを画面の中央に強制移動、
・マウスカーソルを消す(タイプをcrNoneに設定)、
・マウスの移動を検知すると、中央からの移動量取得
・再び、見えないマウスを中央に強制移動
しかし、メッセージキューに入っている情報がFIFOの様で、移動量取得と中央への強制移動が同期せず、うまく値が取れません。
何か方法があれば御教授お願いいたします。BCBで開発しています。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
僕はC++を使っているので、Win32APIについて(ちなみにXP使用)。
GetMouseMovePointsEx()を使えば、カーソルが画面から出た時の座標も取得できます。ただWindowsが勝手に画面内に戻すので、「画面から出る」と「画面内に戻る」はメッセージにはならないようです。余計なお世話かもしれませんが、Windowsはカーソルの位置x、yそれぞれをshort(2バイトの2の補数表現)で扱うので、そのまま使うとマイナスの値が65500ぐらいになるかもしれません。No.5
- 回答日時:
>以下上記の繰り返し、となるのでだけれど、PeekMessageでは実際のマウスの移動でなく、
>SetCursorPosのキューに入っている移動の方を削除しているということはありえませんか。
では、順番を逆にして、SetCursorPosを呼んだ後にPeekMessageでキューから削除してみてはどうですか?
ただし、無条件に削除するのではなくmsg構造体の中を見て
座標がSetCursorPosで指定した座標が入るのを確認するまで。もちろん指定した座標が入ってたら削除しちゃだめですよ。
No.4
- 回答日時:
>例えば、右側にマウスをずーと動かし続けると、10回のサンプル間はマウスカーソルは右に動き続け、
>11回目のサンプル(FromMouseMoveが呼ばれた時)で中央に強制移動し、12回目以降はマウスカーソルは再び右側に動き始める、となります。
一応ヒントを。
SetCursorPosを呼ぶ直前に、PeekMessageでWM_MOUSEMOVEをキューから削除すれば平気かと。
念のために書いておきますが、マウスの移動情報から必ずメッセージ生成が行われているわけではありません。システムに負荷がかかると簡単にマウスカーソルの移動がとまっちゃうことから一目瞭然ですよね。
この回答への補足
やっぱりできないのでは?
マウスを見えるようして、変移量をTMemoに表示させながらチェックしました。そして、SetCursorPosの直前に以下を入れました。
MSG msg;
while(PeekMessage(&msg, NULL, WM_MOUSEMOVE,WM_MOUSEMOVE, PM_REMOVE));
WM_MOUSEFIRST/WM_MOUSELASTを指定してあげればマウスカーソルが移動中のマウスクリックは無視しますので、構文自体は合っているようです。
シーケンシャルに考えてみると
FromMouseMove (WM_MOUSEMOVE)
__X,Yの処理
__PeekMessageでWM_MOUSEMOVEの除去
__SetCursorPosでマウス移動
FromMouseMove (WM_MOUSEMOVE)
__X,Yの処理
__PeekMessageでWM_MOUSEMOVEの除去
__SetCursorPosでマウス移動
以下上記の繰り返し、となるのでだけれど、PeekMessageでは実際のマウスの移動でなく、SetCursorPosのキューに入っている移動の方を削除しているということはありえませんか。仮にそうだとすると、何時SetCursorPosが終了したかの判定は無理では無いでしょうか?宜しければコメントをいだだければ幸いです。
ヒントをありがとうございます。できるということなので、なんとかがんばりたいと思います。
ちょっとやってみたのですがうまくいかず、月曜日以降、更に試行錯誤してみようと思います(これから出かけてしまいますので)。
No.3
- 回答日時:
BCBで作ってみたけど、質問の方法で上手く動いていますよ。
void __fastcall TForm1::FormShow(TObject *Sender)
{
ShowCursor(FALSE);
int cx = ClientWidth/2;
int cy = ClientHeight/2;
TPoint pt0(cx, cy);
TPoint pt = ClientToScreen(pt0);
SetCursorPos(pt.x, pt.y);
}
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
static int sX, sY;
int cx = ClientWidth/2;
int cy = ClientHeight/2;
if (X==cx && Y==cy) return;
sX += X-cx;
sY += Y-cy;
AnsiString s;
Caption = s.sprintf("%d %d", sX, sY);
TPoint pt0(cx, cy);
TPoint pt = ClientToScreen(pt0);
SetCursorPos(pt.x, pt.y);
}
この回答への補足
実際にプログラミングして頂き大変恐縮です。
私も同じようなコードを試しました。一見うまく動いているようですが、動作のログを取ると思ったように動いていません。
最下行で SetCursorPos()でカーソルを移動しているのですが、次の FromMouseMove が呼ばれた時には未だカーソルは強制的に中央に移動していません。例えば、右側にマウスをずーと動かし続けると、10回のサンプル間はマウスカーソルは右に動き続け、11回目のサンプル(FromMouseMoveが呼ばれた時)で中央に強制移動し、12回目以降はマウスカーソルは再び右側に動き始める、となります。つまり、何時、マウスカーソルが中央に移動したかプログラム側では判定の方法が無いのです。
この方法で、マウス自体の絶対移動変移量を取る事はできないのでしょうか。
No.2
- 回答日時:
APIレベルではがんばっても無理ですね。
一番低レベルなWH_MOUSE_LLフックを使っても座標までしか取れません。
マウスカーソルではなく、マウスそのものの移動量を取得したいとなると、デバイスドライバを書かないと無理じゃないでしょうかね。
No.1
- 回答日時:
実際の処理が見えませんが、これでOKなハズです。
画面端から逆の端にマウスをワープさせるオンラインソフト
WarpPointer 2.21
http://www.vector.co.jp/soft/win95/util/se070373 …
ループ 1.05
http://www.vector.co.jp/soft/win95/util/se141539 …
Warp 1.02
http://www.vector.co.jp/soft/win95/util/se128267 …
みたいな事が実際に出来ますし。
--
> メッセージキューに入っている情報が
などの原因まで分かっているのなら、余分にメッセージを取り出すとかなんとか。
回答ありがとうございます。
マウスをワープさせるコードは何となくイメージできます。本当は、マウスカーソル自体を動作させないで、マウスからの動作量だけを取得したいと思っています。メッセージキューについてもBCBで開発していることもあり、いまいち自信もなく、もっとスマートな方法があればと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- マウス・キーボード マウスのないパソコン 9 2022/03/30 10:53
- その他(ソフトウェア) IrfanView で画像のスクロール?できますか 1 2022/08/31 13:57
- 物理学 時間を語るなら、(複数の時間の正体)を知る必要が有る。 1 2023/02/16 22:14
- デスクトップパソコン ん~…分からん 7 2022/06/10 10:47
- Excel(エクセル) ExcelのVBAでWordを読み取り専用で開いて、見たいページに自動で移動する方法を教えて頂きたい 4 2022/07/27 10:39
- モニター・ディスプレイ マルチモニタでのカーソルの動き方 1 2022/06/15 14:59
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- Visual Basic(VBA) VBA 画面上のカーソルに文字数字を入力するコードを教えて下さい 1 2022/10/30 10:31
- マウス・キーボード マウスって便利な入力器具ですね。マウスに変わって使われる次世代の入力器具はどんな物になるでしょう 6 2022/10/05 14:44
- その他(パソコン・周辺機器) 2つのPCを行き来する 2 2022/06/15 01:59
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
楕円の軌道に傾斜をつける方法...
-
マウス自体の移動量の取得
-
マウスを近づけるとオブジェク...
-
画面の範囲選択
-
テキストが変更されたとき
-
AccessVBA SQL テキスト型は...
-
画面上のカーソルの位置を取得...
-
テキストボックスにセルの値を...
-
テキストボックスの中身をリセ...
-
Excel VBAで読み込んだテキスト...
-
外部mp3をストリーミング再生...
-
変数に256文字以上のテキストを...
-
ADに参加していないPCからADサ...
-
ボタンクリックでダイナミック...
-
CREATESTRUCT と GetWindowLong
-
ボタンでウィンドウを閉じたい
-
アクセスについて
-
シューティングゲームの自機の...
-
アンケートについて
-
FLASH オブジェクトをスクリプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マウス自体の移動量の取得
-
カーソルが重なると早くなる
-
スクロール処理(早急にお伺い...
-
Flash着せ替え用アクションスク...
-
360度viewer
-
C言語でのマウスを移動とマウス...
-
スクリーン中央を中心にズーム...
-
進行方向に徐々に停止するスク...
-
FLASHでの座標取得
-
flashの横幅をどのブラウザで見...
-
正6面体を一定の角度で回転さ...
-
FLASHのActivescriptでオブジェ...
-
マウスオーバー(クリック)画...
-
回転運動の減速停止方法
-
FLASHでロールオーバーで他のム...
-
startDrag()について
-
楕円の軌道に傾斜をつける方法...
-
下記のサイトのTOPページにある...
-
3D回転ツールの3D中心点(Z:)に...
-
画面の範囲選択
おすすめ情報