HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0327
魚犬マウスの動きを操作6解決


魚犬

リンク

2018/3/27(Tue) 12:39:19|NO.82830

mouse命令を使ってマウスカーソルの座標を指定することは出来ますが、
mouse命令を使わずにマウスカーソルを現在位置から特定の位置まで動かす
という事はできないでしょうか?
mouseとrepeat等を使って座標を少しづつ動かす方法で似たようなことは出来ますが、
他のアプリの補助ツールの関係で使おうと思っており
mouse命令だとそのアプリではうまく動いてくれないため、
マウスの動きをエミュレートするようなことが出来ればと思っています。



この記事に返信する


いののて

リンク

2018/3/27(Tue) 13:44:09|NO.82833

mouse命令を使わないとなれば、WindowsAPIを直接使うことになります。

方法1: SetCursorPos関数を使う
#include "user32.as"
SetCursorPos mx,my

方法2: mouse_event関数を使い、マウスイベントを発生させる
#include "user32.as"
#define MOUSEEVENTF_ABSOLUTE 0x8000 #define MOUSEEVENTF_MOVE 0x0001 mouse_event MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, mx, my, 0, 0

方法3: SendInput関数を使い、マウスイベントを発生させる
#include "user32.as"
#define INPUT_MOUSE 0 #define MOUSEEVENTF_ABSOLUTE 0x8000 #define MOUSEEVENTF_MOVE 0x0001 dim aInput, 7 aInput(0) = INPUT_MOUSE aInput(1) = mx, my, 0, MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, 0, 0 SendInput 1, varptr(aInput), length(aInput)*4

変数mx、myをマウスの移動量としたい場合は、方法2か3を使い、MOUSEEVENTF_ABSOLUTEフラグを消すとできます。



あまら

リンク

2018/3/27(Tue) 16:20:35|NO.82838

いののてさんの言う通りなのですが、
勝手ながらSendInput関数に関して一部訂正させていただきます。

SendInput関数でマウス移動を行う際、絶対座標(MOUSEEVENTF_ABSOLUTE)を使用する場合
座標の正規化が必要になります。

SendInputでは画面左上座標は(0,0)なのは同じですが、右下座標は画面の解像度や
縦横比に関係なく(65535,65535)となるので、そのままの座標を指定すると
思わぬところに移動してしまいます。

#include "user32.as" #define INPUT_MOUSE 0 #define MOUSEEVENTF_ABSOLUTE 0x8000 #define MOUSEEVENTF_MOVE 0x0001 // 移動先の座標をmx,myとした場合の正規化 mxn = int( double(mx)*65535/(ginfo_dispx-1) ) myn = int( double(my)*65535/(ginfo_dispy-1) ) dim aInput, 7 aInput(0) = INPUT_MOUSE aInput(1) = mxn, myn, 0, MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, 0, 0 SendInput 1, varptr(aInput), length(aInput)*4
画面サイズから1減らしているのは誤差防止のためです。
これが無いと1ドットだけですが、ずれる事があります。



named

リンク

2018/3/27(Tue) 16:27:01|NO.82839

画面サイズを1減らすよりは65536をかけたほうがいいんじゃないですかね…



あまら

リンク

2018/3/27(Tue) 16:46:03|NO.82840

追記:
あんまり使って無かったので忘れてましたが
mouse_event関数も同じくMOUSEEVENTF_ABSOLUTEの場合は正規化が必要だったようです。



> namedさん
65536だと誤差が出てしまうのです。

実際の座標が(解像度1920,1080の場合) 0,0〜1919,1079
正規化時は 0,0〜65535,65535
で計算すると1ドットの大きさが 65535÷1919≒34.15, 65535÷1079≒60.73

対して解像度で計算すると 65536÷1920≒34.13, 65536÷1080≒60.68

これが微妙な違いなんですが(100,100)の座標だとXは2、Yは5も違うんです。
そしてその違いが1ドット程度のズレになってしまうという面倒な事実がありまして
そうした経験上、解像度から1減らした方が誤差が無かったのでそちらを選びました。



いののて

リンク

2018/3/27(Tue) 17:34:13|NO.82845

>あまらさん
MSDNを最後まで読んでいなかったミスでした。指摘して下さりありがとうございます。



魚犬

リンク

2018/3/27(Tue) 18:48:06|NO.82848

>いのててさん >あまらさん
サンプルスクリプトまでありがとうございます。
SendInput関数を使った手法でうまくいきました。
長期間悩んでいたので助かりました。



ONION software Copyright 1997-2023(c) All rights reserved.