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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1024
可憐sendmsgで座標を指定してクリックしたい。7解決


可憐

リンク

2014/10/24(Fri) 01:45:23|NO.65683


boxf 50,100,200,200 repeat wait 1 ; sendmsg hButton, $F5 ;BM_CLICKメッセージ(ここでhwndの座標を指定してクリックしたい) loop *osu mes "押せれた" return

この黒い枠の中をsendmsgで座標を指定してクリックしたいです。



この記事に返信する


KOMARI

リンク

2014/10/24(Fri) 11:01:39|NO.65685

BM_CLICKって何ぞやと思って調べましたが、どうやらオブジェクトをクリックするのに使うようですが?
なので座標の指定は出来ないようです。
WM_LBUTTONDOWNを使うのが一般的ではないでしょうか。

参考ページ
http://hspnext.com/hspkura/hspkura12.htm#contents16
http://chokuto.ifdef.jp/urawaza/message/WM_LBUTTONDOWN.html



zero

リンク

2014/10/24(Fri) 11:17:01|NO.65686

BM_CLICKはボタンオブジェクト(ボタンコントロールと言うべきか)に対して用いるものです。
黒い枠の中をクリックするには、ウィンドウに対してマウス押下メッセージ
WM_LBUTTONDOWN (0x0201)を送信する必要があります。
使い方はこちら(http://msdn.microsoft.com/en-us/library/windows/desktop/ms645607%28v=vs.85%29.aspx)

で、送信されたメッセージをonclickで受けます。
ここでmousex, mouseyは使えませんので、少々面倒ですがクリックする座標をlparamで
受け渡しします。

boxf 50,100,200,200 onclick gosub *osu x = 70 y = 110 repeat 10 wait 100 ; sendmsg hwnd, $201, 1, (((y & 0xffff) << 16) | (x & 0xffff)) loop stop *osu // マウスが黒い枠の中に入っているか確認 mx = lparam & 0xffff my = (lparam >> 16) if ((50 <= mx) && (mx <= 200) && (100 <= my) && (my <= 200)) { mes "押せれた" } return



可憐

リンク

2014/10/25(Sat) 01:03:27|NO.65722

回答ありがとうございます。

また壁に当たってしまったので質問させて頂きます。

下のソースはyahooのページを表示し、yahooのページのhwndを取得し
sendmsgでyahooページにランダムな座標にクリック命令を送るという物です。
自分なりに組んだソースですが全くクリックされてないようです。
これはどうすればいいのか、わかる方教えてくださいお願いします。


#uselib "user32" #cfunc FindWindow "FindWindowA" var,int IEClass="IEFrame" URL="http://www.yahoo.co.jp" //表示するサイト screen 0,640,480 button gosub "起動",*exec_ stop *exec_ newcom objIE, "InternetExplorer.Application" IEhwnd=FindWindow(IEClass,0) //起動したIEのハンドルを取得 mes "IEのhwndは"+IEhwnd objIE("Visible") = 1 objIE->"Navigate" URL //サイトを表示 randomize repeat x=rnd(640) y=rnd(480) wait 2 sendmsg IEhwnd, $201, 1, (((y & 0xffff) << 16) | (x & 0xffff)) wait 2 sendmsg IEhwnd, $202, 1, (((y & 0xffff) << 16) | (x & 0xffff)) loop end



zero

リンク

2014/10/25(Sat) 09:42:13|NO.65725

Internet Explorer(以下IE)の親ウィンドウにメッセージを送ってもクリックしてくれません。
ではどうすればいいかというと、IEのウィンドウ構造をたどっていって、最も子ウィンドウである
"Internet Explorer_Server"クラスのウィンドウを探して、そのhwndにメッセージを送ります。
目的のウィンドウを探すのにFindWindowExを使っています。
(ChildWindowFromPointでもいけるかもしれませんが、やっていません。)

Windows 8.1上のIE 11で確認しましたが、IEのVersionが違うとひょっとしたら動かないかも知れません。

#uselib "user32" #cfunc FindWindow "FindWindowA" var,int #cfunc FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr IEClass="IEFrame" URL="http://www.yahoo.co.jp" //表示するサイト screen 0,640,480 button gosub "起動",*exec_ stop *exec_ newcom objIE, "InternetExplorer.Application" IEhwnd=FindWindow(IEClass,0) //起動したIEのハンドルを取得 mes "IEのhwndは"+IEhwnd objIE("Visible") = 1 objIE->"Navigate" URL //サイトを表示 subhwnd = FindWindowEx(IEhwnd, 0, "Frame Tab", 0) subhwnd = FindWindowEx(subhwnd, 0, "TabWindowClass", 0) subhwnd = FindWindowEx(subhwnd, 0, "Shell DocObject View", 0) while (IEChildhwnd == 0) // こいつだけ表示が遅いようなので待つ IEChildhwnd = FindWindowEx(subhwnd, 0, "Internet Explorer_Server", 0) wait 1 wend mes "IEの子ウィンドウのhwndは"+IEChildhwnd wait 200 randomize repeat x=rnd(640) y=rnd(480) wait 200 sendmsg IEChildhwnd, $201, 1, (((y & 0xffff) << 16) | (x & 0xffff)) wait 2 sendmsg IEChildhwnd, $202, 1, (((y & 0xffff) << 16) | (x & 0xffff)) mes "clicked" loop end
上手く行けば、何"clicked"か待つと反応があるかと思います。



可憐

リンク

2014/10/26(Sun) 01:35:53|NO.65742

ありがとうございました!
無事できました!



可憐

リンク

2014/10/27(Mon) 03:14:27|NO.65767

すみません。
IE上での自動スクロールはどうすればいいのでしょうか?

http://hsp.tv/play/pforum.php?mode=pastwch&num=18053
こちらでできるようですが
SendMessageを使ってのスクロールがしたいです。


http://wisdom.sakura.ne.jp/system/winapi/windata1.html

こちらを見て自分なりにやってみましたができませんでした><



zero

リンク

2014/10/27(Mon) 17:54:11|NO.65770

WM_MOUSEWHEEL(0x020A)を送ってやればスクロールできるみたいです。
書式は sendmsg ハンドル, 0x020A, s<<16, (y<<16 | x) という形式で、
sはスクロール量(下方向は負、上方向は正の値)、xとyはマウスカーソルの
ディスプレイ座標です。スクロール量と、メッセージを送る間隔を変えれば
スクロール速度が変わります。
マウス座標は、とりあえずウィンドウの中心にあることにしていますが、
インラインフレームを持つページでマウスがインラインフレーム上にあると
フレーム内がスクロールされるので、マウスの位置は重要です。

#uselib "user32" #cfunc FindWindow "FindWindowA" var,int #cfunc FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr #func GetWindowRect "GetWindowRect" sptr,sptr IEClass="IEFrame" URL="http://www.yahoo.co.jp" //表示するサイト screen 0,640,480 button gosub "起動",*exec_ stop *exec_ newcom objIE, "InternetExplorer.Application" IEhwnd=FindWindow(IEClass,0) //起動したIEのハンドルを取得 mes "IEのhwndは"+IEhwnd objIE("Visible") = 1 objIE->"Navigate" URL //サイトを表示 subhwnd = FindWindowEx(IEhwnd, 0, "Frame Tab", 0) subhwnd = FindWindowEx(subhwnd, 0, "TabWindowClass", 0) subhwnd = FindWindowEx(subhwnd, 0, "Shell DocObject View", 0) while (IEChildhwnd == 0) // こいつだけ表示が遅いようなので待つ IEChildhwnd = FindWindowEx(subhwnd, 0, "Internet Explorer_Server", 0) wait 1 wend mes "IEの子ウィンドウのhwndは"+IEChildhwnd mes "" //テスト mes "↓1回のスクロール量" scrq = 120 input scrq mes "waitの待ち時間" wtime = 50 input wtime button "scroll down", *scrdn button "scroll up", *scrup button "stop", *scrstop stop *scrdn // ウィンドウの中心を割り出す rect = 0, 0, 0, 0 GetWindowRect IEChildhwnd, varptr(rect) center_x = (rect.0 + rect.2) / 2 center_y = (rect.1 + rect.3) / 2 repeat sendmsg IEChildhwnd, 0x020A, (-scrq) << 16, ((center_y << 16) | center_x) wait wtime loop stop *scrup // ウィンドウの中心を割り出す rect = 0, 0, 0, 0 GetWindowRect IEChildhwnd, varptr(rect) center_x = (rect.0 + rect.2) / 2 center_y = (rect.1 + rect.3) / 2 repeat sendmsg IEChildhwnd, 0x020A, (scrq) << 16, ((center_y << 16) | center_x) wait wtime loop stop *scrstop stop



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