MMVマウスムーブ関数

本ページには広告が含まれています。

マウスカーソルを指定した座標に移動します。MMV関数でカーソルを移動させ続けてもWindowsのスリープ防止にはならないので注意してください。

構文
  1. void = MMV( x, y, ms )
引数
x, y (Integer)必須
位置
ms (Single = 0)省略可
実行までの待ち時間 (ミリセカンド)
戻り値

カーソル移動を滑らかにする

UWSC
PROCEDURE mouseMove(x1, y1, x2, y2, sec = 1)
	DEF_DLL GetTickCount(): dword: kernel32
	DIM t = GetTickCount()
	DIM dx = (x2 - x1) / 100
	DIM dy = (y2 - y1) / 100
	MMV(x1, y1)
	FOR i = 0 TO 100
		MMV(x1 + dx * i, y1 + dy * i)
		REPEAT
		UNTIL GetTickCount() - t >= i * (sec / 100) * 1000
	NEXT
	MMV(x2, y2)
FEND

使い方

  1. 画像image.bmpが見つかったらその場所にカーソルを移動する。

    UWSC
    IF CHKIMG("image.bmp",,,,,, -1) THEN MMV(G_IMG_X, G_IMG_Y)
  2. 円を描く。

    UWSC
    DIM a = G_SCREEN_W / 2
    DIM b = G_SCREEN_H / 2
    DIM r = 100
    
    FOR theta = 0 TO 360
    	DIM x = a + r * COS(degToRad(theta))
    	DIM y = b + r * SIN(degToRad(theta))
    	MMV(x, y)
    	SLEEP(0.001)
    NEXT
    
    //////////////////////////////////////////////////
    // 【引数】
    //   deg : 角度(度数法) 
    // 【戻り値】
    //   度数法から弧度法に変換した値 
    //////////////////////////////////////////////////
    FUNCTION degToRad(deg)
    	RESULT = deg * (3.14159265358979 / 180)
    FEND
  3. 見つかった画像の位置をマウスカーソルで示す。

    UWSC
    DIM path = "D:\Desktop\quick.bmp"
    DIM arr = getBitmap(path)
    DIM num = CHKIMG(path, -1,,,,, -1)
    
    FOR n = 0 TO num - 1
    	PRINT ALL_IMG_X[n] + ", " + ALL_IMG_Y[n]
    	DIM a = ALL_IMG_X[n] + arr[1] / 2
    	DIM b = ALL_IMG_Y[n] + arr[2] / 2
    	DIM r = 5
    	
    	FOR theta = 0 TO 360 STEP 10
    		DIM x = a + r * COS(degToRad(theta))
    		DIM y = b + r * SIN(degToRad(theta))
    		MMV(x, y)
    		SLEEP(0.001)
    	NEXT
    NEXT
    
    //////////////////////////////////////////////////
    // 【引数】
    //   bin : 2進数 
    //   signFlg : 符号付きならばTrue 
    // 【戻り値】
    //   10進数に変換した値 
    //////////////////////////////////////////////////
    FUNCTION binToDec(bin, signFlg = TRUE)
    	DIM dec = 0
    	DIM decimalFlg = IIF(POS(".", bin), TRUE, FALSE)
    	IFB COPY(bin, 1, 1) = "1" AND signFlg THEN
    		DIM msb = IIF(decimalFlg, POS(".", bin) - 1, LENGTH(bin))
    		DIM lsb = IIF(decimalFlg, POS(".", bin) - LENGTH(bin), 0)
    		DIM dec2 = POWER(2, msb) - 1
    		FOR i = -1 TO lsb STEP -1
    			dec2 = dec2 + POWER(2, i)
    		NEXT
    		DIM a = binToDec(bin, FALSE)
    		DIM b = dec2
    		dec = -1 * (bitXor(a, b) + POWER(2, lsb))
    	ELSE
    		IFB decimalFlg THEN
    			DIM integer = COPY(bin, 1, POS(".", bin) - 1)
    			DIM decimal = COPY(bin, POS(".", bin) + 1)
    			FOR i = 1 TO LENGTH(decimal)
    				dec = dec + COPY(decimal, i, 1) * POWER(2, -1 * i)
    			NEXT
    		ELSE
    			integer = bin
    		ENDIF
    		FOR i = 1 TO LENGTH(integer)
    			dec = dec + COPY(integer, i, 1) * POWER(2, LENGTH(integer) - i)
    		NEXT
    	ENDIF
    	RESULT = dec
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   arg1 : 数値1(10進数) 
    //   arg2 : 数値2(10進数) 
    // 【戻り値】
    //   2つの数値のビット毎の排他的論理和 
    //////////////////////////////////////////////////
    FUNCTION bitXor(arg1, arg2)
    	DIM args[1] = arg1, arg2
    	DIM bins[1]
    	DIM decimals[1]
    	DIM integers[1]
    	DIM keta[1]
    	IFB ABS(arg1) <> arg1 OR ABS(arg2) <> arg2 THEN
    		RESULT = ERR_VALUE
    		EXIT
    	ENDIF
    	FOR i = 0 TO 1
    		bins[i] = decToBin(args[i])
    		decimals[i] = 0
    		IFB POS(".", bins[i]) <> 0 THEN
    			integers[i] = COPY(bins[i], 1, POS(".", bins[i]) - 1)
    			decimals[i] = COPY(bins[i], POS(".", bins[i]) + 1)
    		ELSE
    			integers[i] = bins[i]
    		ENDIF
    	NEXT
    	keta[0] = IIF(LENGTH(integers[0]) > LENGTH(integers[1]), LENGTH(integers[0]), LENGTH(integers[1]))
    	integers[0] = strPad(integers[0], keta[0], "0", LEFT)
    	integers[1] = strPad(integers[1], keta[0], "0", LEFT)
    	keta[1] = IIF(LENGTH(decimals[0]) > LENGTH(decimals[1]), LENGTH(decimals[0]), LENGTH(decimals[1]))
    	decimals[0] = strPad(decimals[0], keta[1], "0", RIGHT)
    	decimals[1] = strPad(decimals[1], keta[1], "0", RIGHT)
    	DIM bin = ""
    	FOR i = 1 TO keta[0]
    		bin = bin + (VAL(COPY(integers[0], i, 1)) XOR VAL(COPY(integers[1], i, 1)))
    	NEXT
    	bin = bin + "."
    	FOR i = 1 TO keta[1]
    		bin = bin + (VAL(COPY(decimals[0], i, 1)) XOR VAL(COPY(decimals[1], i, 1)))
    	NEXT
    	RESULT = binToDec(bin)
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   dec : 10進数 
    //   signFlg : 符号付きならばTrueを指定 
    //   digits : 変換した2進数の桁数合わせを自動で行うかを示すブール値、もしくは桁数を表す数値(8,16,24,32,64のいずれか)を指定 
    //   recursive : 再帰処理の深さ。処理する際に必要なだけで指定する必要はありません。 
    // 【戻り値】
    //   2進数に変換した値 
    //////////////////////////////////////////////////
    FUNCTION decToBin(dec, signFlg = TRUE, digits = FALSE, recursive = 1)
    	IFB dec < 0 AND signFlg = FALSE THEN
    		RESULT = ERR_VALUE
    		EXIT
    	ENDIF
    	IFB VARTYPE(digits) <> VAR_BOOLEAN AND digits < CEIL(LOGN(2, ABS(dec))) + IIF(dec < 0, 1, 0) THEN
    		RESULT = ERR_VALUE
    		EXIT
    	ENDIF
    	DIM bin = ""
    	DIM decimalFlg = IIF(POS(".", dec) <> 0, TRUE, FALSE)
    	DIM negativeFlg = IIF(dec < 0, TRUE, FALSE)
    	dec = ABS(dec)
    	DIM integer = IIF(decimalFlg, COPY(dec, 1, POS(".", dec) - 1), dec)
    	DIM offset = POWER(10, LENGTH(dec) - POS(".", dec))
    	DIM decimal = IIF(decimalFlg, COPY(dec, POS(".", dec) + 1) / offset, 0)
    	REPEAT
    		bin = (integer MOD 2) + bin
    		integer = INT(integer / 2)
    	UNTIL integer = 0
    	IFB decimalFlg THEN
    		bin = bin + "."
    		DIM loop = 0
    		REPEAT
    			loop = loop + 1
    			decimal = decimal * 2
    			bin = bin + IIF(decimal >= 1, "1", "0")
    			IF decimal > 1 THEN decimal = decimal - 1
    		UNTIL decimal = 1 OR loop >= 64
    		WHILE loop MOD 4 <> 0
    			loop = loop + 1
    			bin = bin + "0"
    		WEND
    	ENDIF
    	IFB VARTYPE(digits) = VAR_BOOLEAN THEN
    		bin = strPad(bin, CEIL(LENGTH(REPLACE(bin, ".", "")) / 8) * 8, "0", LEFT)
    	ELSE
    		bin = strPad(bin, digits, "0", LEFT)
    	ENDIF
    	IFB negativeFlg THEN
    		DIM msb = IIF(decimalFlg, POS(".", bin) - 1, LENGTH(bin))
    		DIM lsb = IIF(decimalFlg , POS(".", bin) - LENGTH(bin), 0)
    		DIM a = binToDec(bin, FALSE)
    		DIM b = POWER(2, msb) - 1
    		FOR i = -1 TO lsb STEP -1
    			b = b + POWER(2, i)
    		NEXT
      		dec = bitXor(a, b) + POWER(2, lsb)
     		bin = decToBin(dec, signFlg, digits, recursive + 1)
    	ENDIF
    	IFB recursive = 1 THEN
    		DIM bit = COPY(bin, 1, 1)
     		DIM len = LENGTH(REPLACE(bin, ".", ""))
    		IF negativeFlg AND (bit = "0" OR len MOD 2 <> 0) THEN bin = strRepeat("1", IIF(len MOD 2 <> 0, 4, 8)) + bin
    		IF !negativeFlg AND signFlg AND (bit = "1" OR len MOD 8 <> 0) THEN bin = strRepeat("0", IIF(len MOD 8 <> 0, 4, 8)) + bin
    	ENDIF
    	RESULT = bin
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   dec : 10進数 
    //   signFlg : 符号付きならばTrue 
    //   recursive : 再帰処理の深さ。処理する際に必要なだけで指定する必要はありません。 
    // 【戻り値】
    //   16進数に変換した値 
    //////////////////////////////////////////////////
    FUNCTION decToHex(dec, signFlg = TRUE, recursive = 1)
    	DIM hex = ""
    	DIM array[] = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
    	DIM decimalFlg = IIF(POS(".", dec) <> 0, TRUE, FALSE)
    	DIM negativeFlg = IIF(dec < 0, TRUE, FALSE)
    	dec = ABS(dec)
    	DIM integer = IIF(decimalFlg, COPY(dec, 1, POS(".", dec) - 1), dec)
    	DIM offset = POWER(10, LENGTH(dec) - POS(".", dec))
    	DIM decimal = IIF(decimalFlg, COPY(dec, POS(".", dec) + 1) / offset, 0)
    	REPEAT
    		hex = array[integer MOD 16] + hex
    		integer = INT(integer / 16)
    	UNTIL integer = 0
    	IFB decimalFlg THEN
    		hex = hex + "."
    		DIM loop = 0
    		REPEAT
    			loop = loop + 1
    			decimal = decimal * 16
    			hex = hex + array[decimal]
    			offset = POWER(10, LENGTH(decimal) - POS(".", decimal))
    			decimal = (decimal * offset - INT(decimal) * offset) / offset
    		UNTIL decimal = 0 OR loop >= 4
    	ENDIF
    	DIM bin = hexToBin(hex)
    	DIM keta = LENGTH(bin)
    	IFB keta < 8 THEN
    		bin = strPad(bin, decimalFlg + 8, "0", LEFT)
    	ELSEIF keta < 16 THEN
    		bin = strPad(bin, decimalFlg + 16, "0", LEFT)
    	ELSEIF keta < 24 THEN
    		bin = strPad(bin, decimalFlg + 24, "0", LEFT)
    	ELSEIF keta < 32 THEN
    		bin = strPad(bin, decimalFlg + 32, "0", LEFT)
    	ELSE
    		bin = strPad(bin, decimalFlg + 64, "0", LEFT)
    	ENDIF
    	IFB negativeFlg THEN
    		DIM msb = IIF(decimalFlg, POS(".", bin) - 1, LENGTH(bin))
    		DIM lsb = IIF(decimalFlg, POS(".", bin) - LENGTH(bin), 0)
    		DIM a = hexToDec(hex, FALSE)
    		DIM b = POWER(2, msb) - 1
    		FOR i = -1 TO lsb STEP -1
    			b = b + POWER(2, i)
    		NEXT
    		dec = bitXor(a, b) + POWER(2, lsb)
    		hex = decToHex(dec, signFlg, recursive + 1)
    	ENDIF
    	IFB recursive = 1 THEN
    		DIM bit = COPY(hexToBin(COPY(hex, 1, 1)), 1, 1)
    		DIM len = LENGTH(REPLACE(hex, ".", ""))
    		IF negativeFlg AND (bit = "0" OR len MOD 2 <> 0) THEN hex = strRepeat("F", IIF(len MOD 2 <> 0, 1, 2)) + hex
    		IF !negativeFlg AND signFlg AND (bit = "1" OR len MOD 2 <> 0) THEN hex = strRepeat("0", IIF(len MOD 2 <> 0, 1, 2)) + hex
    	ENDIF
    	RESULT = hex
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   deg : 角度(度数法) 
    // 【戻り値】
    //   度数法から弧度法に変換した値 
    //////////////////////////////////////////////////
    FUNCTION degToRad(deg)
    	RESULT = deg * (3.14159265358979 / 180)
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   str : 相互変換させるバイナリデータ 
    // 【戻り値】
    //   変換したバイナリデータ 
    //////////////////////////////////////////////////
    FUNCTION Endian(str)
    	DIM len = LENGTH(str)
    	
    	IFB !isEven(len) THEN
    		str = "0" + str
    		len = len + 1
    	ENDIF
    	
    	DIM res = ""
    	FOR n = 1 TO len STEP 2
    		res = COPY(str, n, 2)  + res
    	NEXT
    	
    	RESULT = res
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   path : ビットマップ画像のパス 
    // 【戻り値】
    //   配列。0:サイズ(Byte)、1:幅(px)、2:高さ(px)、3:ビットの深さ(bit) 
    //////////////////////////////////////////////////
    FUNCTION getBitmap(path)
    	CONST adTypeBinary = 1
    	DIM array[3]
    	
    	DIM Stream = CREATEOLEOBJ("ADODB.Stream")
    	Stream.Open()
    	Stream.Type = adTypeBinary
    	Stream.LoadFromFile(path)
    	DIM tmp = Stream.Read(30)
    	Stream.Close()
    
    	DIM fmt = ""
    	FOR i = 0 TO 1
    		fmt = fmt + decToHex(tmp[i])
    	NEXT
    
    	IFB fmt <> "424D" THEN
    		RESULT = ERR_VALUE
    		EXIT
    	ENDIF
    	
    	DIM size = ""
    	FOR i = 2 TO 5
    		hex = decToHex(tmp[i], FALSE)
    		size = size + IIF(LENGTH(hex) = 1, "0", "") + hex
    	NEXT
    	array[0] = hexToDec(Endian(size))
    	
    	DIM width = ""
    	FOR i = 18 TO 21
    		hex = decToHex(tmp[i], FALSE)
    		width = width + IIF(LENGTH(hex) = 1, "0", "") + hex
    	NEXT
    	array[1] = hexToDec(Endian(width))
    	
    	DIM height = ""
    	FOR i = 22 TO 25
    		hex = decToHex(tmp[i], FALSE)
    		height = height + IIF(LENGTH(hex) = 1, "0", "") + hex
    	NEXT
    	array[2] = hexToDec(Endian(height))
    	
    	DIM bit = ""
    	FOR i = 28 TO 29
    		hex = decToHex(tmp[i], FALSE)
    		bit = bit + IIF(LENGTH(hex) = 1, "0", "") + hex
    	NEXT
    	array[3] = hexToDec(Endian(bit))
    
    	RESULT = SLICE(array)
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   hex : 16進数 
    // 【戻り値】
    //   2進数に変換した値 
    //////////////////////////////////////////////////
    FUNCTION hexToBin(hex)
    	HASHTBL hb
    	hb["0"] = "0000";	hb["1"] = "0001";	hb["2"] = "0010";	hb["3"] = "0011";
    	hb["4"] = "0100";	hb["5"] = "0101";	hb["6"] = "0110";	hb["7"] = "0111";
    	hb["8"] = "1000";	hb["9"] = "1001";	hb["A"] = "1010";	hb["B"] = "1011";
    	hb["C"] = "1100";	hb["D"] = "1101";	hb["E"] = "1110";	hb["F"] = "1111";
    	DIM bin = ""
    	IFB POS(".", hex) <> 0 THEN
    		FOR i = 1 TO LENGTH(hex)
    			DIM str = COPY(hex, i, 1)
    			IF str = "." THEN bin = bin + "."
    			bin = bin + hb[str]
    		NEXT
    	ELSE
    		FOR i = 1 TO LENGTH(hex)
    			bin = bin + hb[COPY(hex, i, 1)]
    		NEXT
    	ENDIF
    	RESULT = bin
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   hex : 16進数 
    //   signFlg : 符号付きならばTrue 
    // 【戻り値】
    //   10進数に変換した値 
    //////////////////////////////////////////////////
    FUNCTION hexToDec(hex, signFlg = TRUE)
    	hex = STRCONV(hex, SC_UPPERCASE)
    	DIM dec = 0
    	DIM decimalFlg = IIF(POS(".", hex) <> 0, TRUE, FALSE)
    	hex = IIF(LENGTH(REPLACE(hex,".", "" )) MOD 2 <> 0, "0", "") + hex
    	DIM negativeFlg = IIF(COPY(hexToBin(hex), 1, 1) = "1", TRUE, FALSE)
    	DIM sign = 1
    	IF negativeFlg AND signFlg THEN sign = -1
    	IFB negativeFlg AND signFlg THEN
    		DIM bin = hexToBin(hex)
    		DIM msb = IIF(decimalFlg, POS(".", bin) - 1, LENGTH(bin))
    		DIM lsb = IIF(decimalFlg, POS(".", bin) - LENGTH(bin), 0)
    		DIM a = hexToDec(hex, FALSE)
    		DIM b = POWER(2, msb) - 1
    		FOR i = -1 TO lsb STEP -1
    			b = b + POWER(2, i)
    		NEXT
    		DIM dec2 = bitXor(a, b) + POWER(2, lsb)
    		hex = decToHex(dec2)
    	ENDIF
    	integer = IIF(decimalFlg, COPY(hex, 1, POS(".", hex) - 1), hex)
    	decimal = IIF(decimalFlg, COPY(hex, POS(".", hex) + 1), "0")
    	FOR i = 1 TO LENGTH(integer)
    		s = COPY(hex, i, 1)
    		num = IIF(CHKNUM(s), s, ASC(s) - (ASC("A") - 10))
    		dec = dec + num * POWER(16, LENGTH(integer) - i)
    	NEXT
    	FOR i = 1 TO LENGTH(decimal)
    		s = COPY(decimal, i, 1)
    		num = IIF(CHKNUM(s), s, ASC(s) - (ASC("A") - 10))
    		dec = dec + num * POWER(16, -1 * i)
    	NEXT
    	RESULT = sign * dec
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   expr : 評価する式 
    //   truepart : 評価した式がTrueのときに返す値 
    //   falsepart : 評価した式がFalseのときに返す値 
    // 【戻り値】
    //   truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき 
    //////////////////////////////////////////////////
    FUNCTION IIF(expr, truepart, falsepart)
    	IFB EVAL(expr) THEN
    		RESULT = truepart
    	ELSE
    		RESULT = falsepart
    	ENDIF
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   数値 : 整数 
    // 【戻り値】
    //   True : 偶数、False : 偶数以外の数値、ERR_VALUE : 数値以外 
    //////////////////////////////////////////////////
    FUNCTION isEven(n)
    	IFB VAL(n) = n THEN
    		RESULT = IIF(INT(n) MOD 2 = 0, TRUE, FALSE)
    	ELSE
    		RESULT = ERR_VALUE
    	ENDIF
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   num : 符号を求める数値 
    // 【戻り値】
    //   1 : 正の数、0 : ゼロ、-1 : 負の数、ERR_VALUE : それ以外 
    //////////////////////////////////////////////////
    FUNCTION sign(num)
    	SELECT TRUE
    		CASE !CHKNUM(num)
    			RESULT = ERR_VALUE
    		CASE num > 0
    			RESULT = 1
    		CASE num = 0
    			RESULT = 0
    		CASE num < 0
    			RESULT = -1
    	SELEND
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   input : 入力文字列 
    //   length : 埋めたあとの長さ 
    //   str : 埋める文字 
    //   type : 埋める方向 
    // 【戻り値】
    //   指定文字で埋めた文字列 
    //////////////////////////////////////////////////
    FUNCTION strPad(input, length, str = " ", type = RIGHT)
    	DIM s = ""
    	SELECT type
    		CASE LEFT
    			FOR i = 1 TO CEIL((length - LENGTH(input)) / LENGTH(str))
    				s = s + str
    			NEXT
    			input = COPY(s, 1, length - LENGTH(input)) + input
    		CASE RIGHT
    			FOR i = 1 TO CEIL((length - LENGTH(input)) / LENGTH(str))
    				s = s + str
    			NEXT
    			input = input + COPY(s, 1, length - LENGTH(input))
    	SELEND
    	RESULT = input
    FEND
    
    //////////////////////////////////////////////////
    // 【引数】
    //   inputs : 繰り返す文字列 
    //   multiplier : inputsを繰り返す回数 
    // 【戻り値】
    //   inputsをmultiplier回を繰り返した文字列を返します 
    //////////////////////////////////////////////////
    FUNCTION strRepeat(inputs, multiplier)
    	DIM res = ""
    	FOR n = 1 TO multiplier
    		res = res + inputs
    	NEXT
    	RESULT = res
    FEND

プログラム実行例

アクティブウィンドウの左上にカーソルを移動

UWSC
DIM ID = GETID(GET_ACTIVE_WIN)

DIM x = STATUS(ID, ST_X)
DIM y = STATUS(ID, ST_Y)

MMV(x, y)
使用関数
解説

マウスカーソルをランダムな位置に移動

UWSC
DIM x = G_SCREEN_W
DIM y = G_SCREEN_H

MMV(RANDOM(x), RANDOM(y))
使用関数

マウスカーソル下のウィンドウの左上の座標に移動する

UWSC
MOUSEORG(GETID(GET_FROMPOINT_WIN))
MMV(0, 0)

関連記事

GETKEYSTATE関数 (スクリプト関数)
GETKEYSTATE関数は、キークリック・マウスクリック・トグルキー情報を取得する関数です。引数に指定したキーコードに対応するキーのクリックがあった場合はTRUE、なかった場合はFALSEを返します。
LOCKHARDEX関数 (スクリプト関数)
MOUSEORG関数 (スクリプト関数)
マウス座標を相対座標にする、 またはマウスとキー情報を直接ウィンドウへ送ります。
MUSCUR関数 (スクリプト関数)
MUSCUR関数は、マウスカーソルの種別を数値で返す関数です。引数はなく、戻値はInteger型です。