- ベストアンサー
スクリーン座標上でのmouse_eventでのマウスの動き
御世話様です。 mouse_eventコマンドを使って、スクリーン座標のドラックする範囲を選択しているのですが、選択した範囲が座標で指定した部分より広くなってしまいます。 プログラムは以下の通りです。原因わかる方がいれば ご教授ください。よろしくお願い致します。 (開発環境 Windows2000 Visual Basic6.0) Private Sub Command1_Click() 'ドラッグの自動化 Dim x As Long Dim y As Long 'zahyoux(1.0):選択範囲右下のx座標 'zahyoux(0.0):選択範囲左上のx座標 'zahyoux(1.1):選択範囲右下のy座標 'zahyoux(0.1):選択範囲左上のy座標 'ドラッグする範囲(横) x = zahyoux(1, 0) - zahyoux(0, 0) 'ドラッグする範囲(縦) y = zahyoux(1, 1) - zahyoux(0, 1) 'ドラッグする始点にマウスを移動 Call SetCursorPos(zahyoux(0, 0), zahyoux(0, 1)) 'マウスの左ボタンをクリック Call mouse_event(MOUSEEVENTF_LEFTDOWN,0 ,0, 0, 0) '左ボタンを押したまま移動 Call mouse_event(MOUSE_MOVED, ax, ay, 0, 0) '左ボタンを上げる Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
mouse_eventで渡すx,yは画面全体を0-65535としたときの座標だからではないでしょうか?詳しくはMSDNのmouse_eventを参考にするといいかと思います。
その他の回答 (3)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>タスクバーを自動的に隠しても改善されませんでした。 そうですか。残念。 >mouse_moved=座標の補正ということでしょうか そうです。 >この時点でピクセルがtwips座標に変わっていることはあるのでしょうか? いえないと思います。 ただ座標の計算が正しいかが気になります。 そこで、mouse_eventを利用しないで、APIのMoveWindowで移動させてみてはいかがでしょう? ・mouse_eventで移動させた場所と一緒になり、且つ期待するポジションに存在していなければ、計算ロジックの不正 ・mouse_eventで移動させた場所と異なり、且つ期待するポジションに存在しているのであれば、mouse_eventへのパラメータ不正 それと参考がてらですが こちらのHP http://www.h3.dion.ne.jp/~hanagex/ から FinderSystem を落としてみてください。 今回とは関係なくても、常に使えるツールです。 座標などを取得するときは、結構使えますよー
お礼
ありがとうございます。 MoveWindowで思い通りの位置に移動しました。 そこでmouse_eventのパラメータをもう一回見直しましたら、 やはり画面を0-65535で使用しているみたいで、 座標補正をしたら、うまくいきました!! 本当にありがとうございました!!
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
これまた推測で失礼します 1.GetCursorPos 2.移動量計算 3.座標補正 4.SetCursorPos 5.マウスダウン→ムーブ→アップ という手順ですよね? 座標補正の座標にSCREENで算出した座標を利用しているようですが、SCREENはタスクバー領域に影響されるんじゃなかったかな? 違ったらすいません。VB6が手元に今はないのですが、.NETが手元にあり[Screen.PrimaryScreen.WorkingArea]と同じ仕様であれば、おそらく補正する移動量に対して、変換が必要になるような気がします。 仮に、タスクバーのプロパティで「タスクバーを自動的に隠す」をONにして、改善されたら間違いないのですがいかがでしょう?
補足
ご教授ありがとうございます。 タスクバーを自動的に隠しても改善されませんでした。 mouse_moved=座標の補正ということでしょうか この時点でピクセルがtwips座標に変わっていることは あるのでしょうか? 申し訳ありませんが、よろしくお願いいたします
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
まず前置きといたしましてですが、 「前後のソースやSetCursorPosにセットする座標のX/Yが、どのように取得したものかがわからないので、全て推測です。」 >選択した範囲が座標で指定した部分より広くなってしまいます。 もしやなのですが、画面スケールでのX/Yをそのまま利用していませんか? ScreenToClient ClientToScreen などで、座標変換が必要かもしれません。
補足
1050YEN様、ありがとうございます。 画面スケール(scereen)での座標を使ってます。 選択したい範囲はデスクトップ上です。 GetCursorPos API を使って座標を取得しているので、Client座標ではないと思うのですが・・・。 他に原因はありますでしょうか? よろしくお願いいたします
お礼
やっぱり0-65535で使われているみたいです。 座標補正でうまくいきました。ありがとうございました!!
補足
nitscape様、早速の御回答ありがとうございます。 mouse_eventでの座標のことは全く知らなかったです。 試しに mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSE_MOVED, _ ax * (65535 / 800), ay * (65535 / 600), 0, 0 の関数を足してみたのですがうまくいきません(画面が800:600の場合) このへんがよくわからなかったのですが、この設定はまちがているのでしょうか? お手数ですが、よろしくお願い致します。