|
大変お世話になっています。 サンプルの「1分間操作がなかったら場合にモニターをOFF状態にする」を参考にして、5秒間操作がなかったらCapENTというソフトをアクティブにする、というファイルを以下のように作りました。マウスを動かしている間は作働しないのですが、画面をスクロールする動作はカウントされずにCapENTがアクティブになってしまいます。どのように変更したらよいものか、ご教授願えましたら幸いに存じます。
//////////////////////////////////////////////////////////////////////
sv_tm = 0 // 時間保存 sv_x = -1; sv_y = -1 // マウス位置保存 while True for k = VK_LBUTTON to VK_F12 // キーの確認 if GETKEYSTATE(k) then flg = True next ifb (sv_x<>G_MOUSE_X) or (sv_y<>G_MOUSE_Y) // マウス位置確認 flg = True sv_x = G_MOUSE_X sv_y = G_MOUSE_Y endif ifb flg sv_tm = GETTIME() flg = False else ifb (GETTIME() - sv_tm) > 5 // 5秒以上変化なし CTRLWIN(GETID("CapENT"),ACTIVATE) endif endif sleep(8) wend
|
No.1500 2015/07/27(Mon) 10:59:29
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
スクロールバーを動かしたりスクロール矢印を押したりなら VK_LBUTTON で検出できるみたいですが マウスのホイールでスクロールさせたもの BTN(WHEEL, ±ノッチ)は、どう検出するのでしょう
SAVEIMGで画面全体をクリップボードにコピーして、 それをWHILEのなかでCHKIMGで現在のスクリーン全体の画像とクリップボードに収めた 前回のスクリーン全体の画像とを比較する手もあるかもですが、 その間、なにか作業して画面が変わるとダメですね。。。 TT (時計の表示とかも含めて)
|
No.1501 2015/07/27(Mon) 13:12:13
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
↑ ですが、作業する窓があらかじめ決まっているなら、それをUWSC立ち上げ時に指定して その窓に限ってのみSAVEIMG → CHKIMGとかならできるかも? ^^;
////////////////////////////////////////////////////////
FUKIDASI("スクロールを監視したい窓をクリック", G_SCREEN_W - 190, 26, 0, , , $000000, $ffffff, 0)
fukidasiID = GETID(GET_FUKIDASI_WIN) printID = GETID(GET_LOGPRINT_WIN) formID = GETID(GET_FORM_WIN)
Dim arraySelfID[] = fukidasiID, printID, formID QSORT(arraySelfID, 1) // arraySelfID[0]に、uwsc自身に割り振られている最大値のIDが入る
// 情報を表示したい窓をクリックした結果、UWSC以外の窓がアクティブになったらループを抜ける // その時のactiveIDがUWSC以外のアクティブ窓のID WHILE True activeID = GETID(GET_ACTIVE_WIN) IF activeID > arraySelfID[0] THEN BREAK SLEEP(0.1) WEND
// 目的とする窓をアクティブにできたので、フキダシは閉じる CTRLWIN(fukidasiID, CLOSE)
|
No.1502 2015/07/27(Mon) 13:19:26
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
koujichiu 様
ご教授、大変ありがとうございます。 初心者なものですので、お教え願えましたら嬉しく存じます。
1)スクロールするものはInternet Explorerのみです。 >FUKIDASI("スクロールを監視したい窓をクリック", G_SCREEN_W - 190, 26, 0, , , $000000, $ffffff, 0) を、"Internet Explorer"と変えればよろしいのでしょうか?以降の数字などはそのままでいいのでしょうか。
2) >QSORT(arraySelfID, 1) // arraySelfID[0]に、uwsc自身に割り振られている最大値のIDが入る とくに数値など、こちらで変更する必要はないですよね。
3)上記の文は元のファイルのどこに組み込めばいいのでしょうか? ifb (GETTIME() - sv_tm) > 5 // 5秒以上変化なし の行と、 CTRLWIN(GETID("CapENT"),ACTIVATE) の行の間かな?と思うのですが正しいのでしょうか? 試しにやってみたのですが、どうもこれまでと変わらずスクロールは認識していないようです。
基本的なことがよく分かっていなくて本当に申し訳ありません。
|
No.1503 2015/07/27(Mon) 16:19:36
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
No.1504 2015/07/27(Mon) 18:48:17
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
No.1505 2015/07/27(Mon) 19:10:39
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
有難うございます。 今のところ悲しくなるほど理解できないです。 今後の勉強の参考にさせて頂きます。 感謝申し上げます。
|
No.1506 2015/07/27(Mon) 19:59:38
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
いえ、全然問題ないと思います
仮想キーコードとマウスの動きがあったら flg = True で 長めのループにしておいて その中で経過時間によって場合分け ですよね。
ところで、 IEのスクロールバーを GETSLIDER で見に行けないのかもです お役にたてず、すみません 何か思いつきましたら、検証してから書き込ませていただきます。。。
////////////////////////////////////////////////////////////////////
// 監視する毎に、現在アクティブなIEの窓のウィンドウIDを取得し // その窓のスクロールの量を調べ // 前回のスクロール量と比べて違っていたら flg = True とする // // 作業中に別のIEをアクティブにしたりした場合は // 前回のスクロール量を比べても意味がないが、 // // その場合は、仮想キーコードを調べるループにひっかかって // flg = True となるのでだいじょうぶ
///////////////////////////////////////////////////////
DIM ieID
FOR i = 0 TO GETALLWIN() - 1 IF STATUS(ALL_WIN_ID[i], ST_CLASS) = "IEFrame" // アクティブなIEがあったので、作業をしているかもなので、 // 今回からスクロール量の監視の対象にする CTRLWIN(ALL_WIN_ID[i], ACTIVATE) // ●実験用にわざとアクティブに SLEEP(0.2) IF ALL_WIN_ID[i] = GETID(GET_ACTIVE_WIN) ieID = ALL_WIN_ID[i]
PRINT "アクティブIEのタイトル = " + STATUS(ieID, ST_TITLE) FOR j = 0 to 10 PRINT "scrollPos_" + j + " = " + GETSLIDER(ieID, j, SLD_POS) // ● TT NEXT
BREAK ENDIF ENDIF NEXT
|
No.1507 2015/07/27(Mon) 21:40:48
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
whileの上のコードを以下に差し替えてみてください flg = False //●追記 sv_tm = GETTIME() //●起動時の現在時間 sv_x = G_MOUSE_X; sv_y = G_MOUSE_Y //●起動時のマウス位置
wendの上の sleep(8) を sleep(0.5) くらいに変えてください ifb flg 〜 else を処理後に、そのまま降りてきてsleepするので
あとは、スクロールですが、デスクトップの下のタスクバーにかからない範囲で IEの窓をCHKIMGするか、 IEのスクロールバーの長方形領域を STATUS(ieID...)で計算して 作業に支障がないように、クリップボードでは無くどこかのフォルダに画像ファイルを保存 SAVEIMG → CHKIMG をやってみるのが近いかもです(ただし横スクロール。。。) m(_ _)m
|
No.1508 2015/07/28(Tue) 00:58:27
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
レスが冗長になってしまい申し訳ありません。 スクロールの変化を検知できました。
↑ の差し替えとsleep()の変更に加えて、さらに以下を追加してみてください
/////// whileの上に以下を追加 scrollPos = 0 // ●起動時の<body>タグ?のスクロール位置
/////// while True と for k = VK_LBUTTON to VK_F12 // キーの確認 の間に以下を追加 FOR i = 0 TO GETALLWIN() - 1 IF STATUS(ALL_WIN_ID[i], ST_CLASS) = "IEFrame" //CTRLWIN(ALL_WIN_ID[i], ACTIVATE) // ●実験用にわざとアクティブに IF ALL_WIN_ID[i] = GETID(GET_ACTIVE_WIN) ieID = ALL_WIN_ID[i] IE = GETACTIVEOLEOBJ( "InternetExplorer.Application", STATUS(ieID, ST_TITLE) ) IF scrollPos <> IE.document.documentElement.scrollTop // ●ここの変化を追いかける flg = True scrollPos = IE.document.documentElement.scrollTop //PRINT "scrollPos = " + scrollPos BREAK ENDIF // IF ALL_WIN_ID[i] = GETID(GET_ACTIVE_WIN) ENDIF // IF STATUS(ALL_WIN_ID[i], ST_CLASS) = "IEFrame" NEXT // FOR i = 0 TO GETALLWIN() - 1 m(_ _)m
|
No.1509 2015/07/28(Tue) 12:01:04
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
koujichiu様 有難うございます。No.1509 につきましてはまだ理解できていませんが、これまでのアドバイスから以下のようなファイルを作ってみました。 UWSCのウィンドウが全面に見えている時は上手くCapENTがアクティブになるようです。 なぜUWSCのウィンドウが隠れるのかわかりませんが… /////////////////////////////////////////////////////
While True SLEEP(2) id = GETID(GET_ACTIVE_WIN) SAVEIMG("screenshot", id) ifb CHKIMG( "screenshot.bmp") CTRLWIN(GETID("CapENT"),ACTIVATE) else PRINT "画像を探しても見つかりませんでした。" endif Sleep(5) Wend
|
No.1510 2015/07/28(Tue) 12:50:21
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
上記ファイルでたまたま上手くいくときもあるのですが、画像を認識してくれないようで上手くいかないことがほとんどのようです。 No.1509 (クロールの変化を検知)をやってみます。 有難うございますm(_ _)m
|
No.1511 2015/07/28(Tue) 13:51:16
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
koujichiu様 No.1509 を行ってみますと、 COM_Error 13行目:IE=GETACTIVEOLEOBJ("InternetExplorer.Application",ATATUS(IEID,ST_TITLE)) とメッセージが出て参ります。 ご教授願えましたら幸いに存じますm(_ _)m
|
No.1512 2015/07/28(Tue) 14:06:11
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
こんにちは。 No.1510ですが、CTRLWIN(ID, ACTIVATE)で、ループ2周目からはCapENTがアクティブ窓になります それから、 SAVEIMG(保存画像名, ID)で、このコードの場合、アクティブな窓の全体の画像がbmpファイルで保存されます。(画面から思いっきり隠しても全体が保存される) でもCHKIMG(比較する保存画像ファイル)では、デスクトップの領域のなかからしか探せないので もしCapENTの窓がちょっとでも他の窓の影に隠れていたり画面からはみ出ているときは 画像が一致しません。
つぎにNo.1509の私のコードですが、●IFを閉じる ENDIF が一つ無かったです。。。
それから、COM_Errorですが、 エラー表示抑制のコードで囲んでみてください
COM_ERR_IGN エラー警告にあった行付近 COM_ERR_RET //m(_ _)m
|
No.1513 2015/07/28(Tue) 14:42:44
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
koujichiu 様 有難うございます。 エラー警告は消えました。スクロール後しばらくはCapENTがアクティブにならないことが望ましいため、sleep(5)を例えばBREAKの前などに置いてみたのですがなかなか思い通りになりません。 ご教示願えましたら幸いに存じますm(_ _)m
|
No.1514 2015/07/28(Tue) 23:29:49
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
中途半端なコードをいろいろ書いてしまったために、 解りにくくなっていて申し訳ないです。
● No.1508 にあるように、 No.1500 のコードを差し替えたり sleep時間を0.5以下などにする
● さらに、 No.1509 のコードにENDIFを加えてから追加をする
● COM_Errorする行を COM_ERR_IGN と COM_ERR_RET とで挟む
以上の3段階の変更です。
監視ループ1周目で、 スクロール位置が違うとTrue, キー監視に引っかかるとTrue, マウス座標が以前と違うとTrue Trueのままif内に入り、ストップウオッチをスタートしてFalseに sleep(0.5)
監視ループ2周目以降で、 動きが無くてFalseのままならelse内に入り、経過時間を確認 sleep(0.5)
以下5秒過ぎるまでFalseのままならCapENTがアクティブに
となっているはずです。
|
No.1517 2015/07/29(Wed) 02:06:19
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
koujichiu 様
いつも有難うございます。
IE = GETACTIVEOLEOBJ( "InternetExplorer.Application", STATUS(ieID, ST_TITLE) )を IE = GETACTIVEOLEOBJ( "InternetExplorer.Application", "Google") にしてみますと、Google検索などのページでは完璧な動きをしてくれます。スクロールの動きも感知します。
STATUS(ieID, ST_TITLE)のままで、 COM_ERR_IGN エラー警告にあった行付近 COM_ERR_RET を入力しますと、スクロールの動きを感知しなくなります。
使っているIEのプログラムは、RS_Baseというものです。 IE = GETACTIVEOLEOBJ( "InternetExplorer.Application", "RS_Base") としますと、タイトルの中にRS_Baseがあるうちはいいのですが、タブを開きますとタイトルの中のRS_Baseという文字が消えてしまい、エラーメッセージが出てしまいます。 RS_Baseのすべてのタイトルには、http://localhost/~rsn/2000.cgiが含まれますので、"RS_Base"の代わりに"localhost"やっってみますと、 COM_Error:Could not convert variant of type(Integer)into type(Dispatch) 17行目:SCROLLPOS=IE.documentElement.scrollTop というエラーメッセージが出て参ります。 解決は難しいでしょうか。 よろしくお願い申し上げますm(_ _)m
|
No.1518 2015/07/29(Wed) 13:01:46
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
インターネットエクスプローラのウィンドウIDから取れるST_TITLEは、 たしか最初にアクティブになっていたタブのタイトルだったような気が。。。
IEで開いているタブを全て取得するとかで検索を掛けて、 個別のタブを取得する方法がわかれば、 アクティブタブを追いかけていくようにコードを変更できると思います。
// UWSCでIEのカレントタブを取得する - じゅんじゅんのきまぐれ // http://d.hatena.ne.jp/junjun777/20150721/uwsc_get_current_ie_tab
COM_ERRORですが、 オブジェクトIEを動かしている行を全部括ってみてください。
COM_ERR_IGN エラー警告にあった行付近 ↓ IE = GETACTIVEOLEOBJ から ENDIF // IF ALL_WIN_ID[i] = GETID(GET_ACTIVE_WIN) COM_ERR_RET
|
No.1519 2015/07/29(Wed) 14:16:13
|
|
☆ Re: 画面スクロールについて / koujichiu |
|
|
長くなりすぎましたので、今回で終わりです。
●(初回flg=true防止)監視ループの前に、タブ窓のタイトルやスクロール量を入れる UWSCを立ち上げる前に IEが既に立ちあがっていたら、 そのIEをアクティブにして、 アクティブタブウィンドウのスクロール量とタイトルとを scrollPos, prevIeTitle に入れておく (監視ループ内のFOR〜IF scrollPos <>の間を流用する)
●作業していくと、各タブ窓個々でのスクロール量が それぞれ別々な値になるので、 前回のタブタイトルと今回のタブタイトルが同じときだけ比較し 今回みたタイトルのタブ窓のスクロール量を入れる (flg = True; sv_x = G_MOUSE や flag = True; scrollPos = IE...と同じノリ)
●タブ右端の「新しいタブを追加するボタン」でタブを追加した場合 追加したタブのST_TITLEは取得できても GETACTIVEOLEOBJ() ができない なので、タブを追加したときにできるタイトル "新しいタブ" をみて、GETACTIVEOLEOBJ() をするかどうかで分ける (新しいタブでサイトを見にいってからは問題ない)
個別に分けてコードを調整していけば、なんとかなります 頑張ってください。
|
No.1521 2015/07/29(Wed) 19:25:02
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
koujichiu 様 長々とお付き合い頂きまして、本当に有難うございました。 この2日間で赤ちゃんレベルから2歳児レベル位まで知識がついた気がします。 精進いたします。 有難うございました。
|
No.1522 2015/07/29(Wed) 19:57:34
|
|
☆ Re: 画面スクロールについて / umiumi |
|
|
// 5秒入力が無かったならダイアログを表示(APIを使用した方法) DEF_DLL GetTickCount(): Dword: Kernel32 DEF_DLL GetLastInputInfo({Long, Dword}): Bool: User32 CONST DF_SIZE = 8 DIM wktm while True GetLastInputInfo(DF_SIZE, wktm) if GetTickCount() - wktm > 5000 msgbox("5秒") break endif sleep(1) wend
|
No.1524 2015/07/29(Wed) 22:36:30
|
|
☆ Re: 画面スクロールについて / ヤマグチ |
|
|
umiumi様
涙が溢れそうです。・゚・(ノД`)・゚・。 すべてが解決いたしました! まさに思い通りに動いてくれています‼ 本当に本当に有難うございました(TдT) ウゥ…
|
No.1525 2015/07/29(Wed) 23:15:12
|
|