17469
UWSC 仮 掲示板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
SearchRocketbbs(掲示板DL検索)

バッググラウンドでデータ取得できないサイト / 荒鷲
バッググラウンドでデータを取得するスクリプトでデータが取れるサイトと取れないサイトがあります。
これは、サイトのソース上の問題ということでしょうか?
データが取れないサイトで下記のスクリプトを起動すると下記のエラーがでます。

//19/03/14 21:51 COM_Error:例外が発生しました。 7行目: SOURCE = XH.responseText

url ="https://staff.jusnet.co.jp/search/list.php?keyword=&ie_no=&jikyuu=&jobc_w=job1_1&rosen=&kinmuchi%5B%5D=%E6%9D%B1%E4%BA%AC%E9%83%BD&city%5B%5D=&licence=&industry=&sbtn="

xh = createoleobj("Msxml2.XMLHTTP")
xh.open("GET", url, FALSE)
xh.send()
source = xh.responseText // utf-8

msg=source
msgbox(msg)

No.267 2019/03/14(Thu) 21:54:21

Re: バッググラウンドでデータ取得できないサイト / stuncloud
なんでresponseTextがダメなのかは不明ですが、以下で回避可能でした

// responseBody(byte配列)を文字列に変換
source = decode(decode(xh.responseBody, CODE_BYTEARRAY), CODE_UTF8)

No.271 2019/03/15(Fri) 12:45:46

Re: バッググラウンドでデータ取得できないサイト / 荒鷲
// responseBody(byte配列)を文字列に変換
source = decode(decode(xh.responseBody, CODE_BYTEARRAY), CODE_UTF8)

stuncloud様、素晴らしいです。いけました。
よく、下記のような情報ひきだせるのが、凄いですね。

//source = decode(decode(xh.responseBody, CODE_BYTEARRAY), CODE_UTF8)

No.272 2019/03/15(Fri) 17:16:29

Re: バッググラウンドでデータ取得できないサイト / 荒鷲
stuncloud様、先日は回答ありがとうございました。
別のURLで試してみたところ、下記のエラーがでました。また、source = xh.responseText utf-8で試しても同じエラーがでます。なにか、良い知恵頂けませんでしょうか?

//19/03/16 13:21 COM_Error:例外が発生しました。 6行目: XH.send()

url ="http://www.r-agent.com/kensaku/kinmuchi/hokkaido/ocpt1-03/ocpt2-01/"

xh = createoleobj("Msxml2.XMLHTTP")
xh.open("GET", url, FALSE)
xh.send()
// source = xh.responseText // utf-8
source = decode(decode(xh.responseBody, CODE_BYTEARRAY), CODE_UTF8)

msg=source
msgbox(msg)

No.275 2019/03/16(Sat) 13:26:32

Re: バッググラウンドでデータ取得できないサイト / stuncloud
> //19/03/16 13:21 COM_Error:例外が発生しました。 6行目: XH.send()

エラーを見れば一目瞭然なんですが、レスポンスがどうとか関係ないです
リクエスト送信でコケてます
まずはエラーメッセージをちゃんと読む、ということを覚えてください

で、そのURLをブラウザで開いたらhttpsにリダイレクトされたので
最初からURLをhttpsにすればいいんじゃないですかね?

No.278 2019/03/16(Sat) 19:51:01

Re: バッググラウンドでデータ取得できないサイト / 荒鷲
stuncloud様、httpsでいけました。ぜんぜんリダイレクトとか考えてなかったです。また、一歩前進できましたありがとうございました。
No.280 2019/03/17(Sun) 00:30:54
UwscWebDriver.uwsをスレッドで複数動かしたい / 森
stuncloudさん、こんにちは
GitHubに問い合わせ窓口がなかったので、こちらに失礼します。
UwscWebDriver.uwsをスレッドで複数動かしたいのですが、
com_errorが発生してしまいます。
96行目:result = CodeObject.WebDriver.Start(port, capabilities, debug)
解決方法があれば教えていただけないでしょうか。
よろしくお願いします。

No.246 2019/03/07(Thu) 15:31:05

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / stuncloud
再現する最小のコードをください
No.247 2019/03/07(Thu) 17:18:32

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / 森
最小コードが必要ということは、本来できるけどぼくのやり方がまずいということですね!
よろしくお願いします!

// [テスト1] COM_Error:例外が発生しました 96行目
thread sample()
msgbox(1)
procedure sample()
 call UwscWebDriver.uws
 driver = WebDriver.Start(WebDriver.Chrome)
 driver.Navigate("https://www.google.co.jp/")
fend

// [テスト2] COM_Error:致命的なエラーです
call UwscWebDriver.uws
driver = WebDriver.Start(WebDriver.Chrome)
thread sample(driver)
msgbox(1)
procedure sample(driver)
 driver.Navigate("https://www.google.co.jp/")
fend

No.248 2019/03/07(Thu) 17:53:31

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / stuncloud
ありがとうございます

>最小コードが必要ということは、本来できるけどぼくのやり方がまずいということですね!
いえ、そうではないです
おそらくモジュールのバグなので原因を特定して修正する必要があるんですが、手元で再現しなかったので再現させられるコードが欲しかったのです

原因となりそうなとこはなんとなく予想がついたので対応できそうなら早ければ明日には直します
テスト2のパターンは対応できないかもしれません

No.249 2019/03/07(Thu) 21:10:25

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / 森
そうなんですね。
早々に対応して頂けるとのことで感謝です。
いつもありがとうございます!

No.250 2019/03/08(Fri) 10:23:56

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / stuncloud
テスト1のパターンには対応できました
テスト2はやはり無理でした
ただし、かなり大きな変更が入るので今までのコードが動かなくなります
そのため今のところ別ブランチにしてます
https://github.com/stuncloud/UwscWebDriver/tree/Thread%e5%af%be%e5%bf%9c

テスト1のケースでは以下のような書き換えが必要になります

procedure sample()
 call UwscWebDriver.uws
 dim jsc
 WebDriver.Init(jsc)
 driver = WebDriver.Start(jsc, WebDriver.Chrome)
 driver.Navigate("https://www.google.co.jp/")
fend

この対応は
> // [テスト1] COM_Error:例外が発生しました 96行目
が回避できるというだけで、threadによる実行を完全に保証するものではありません

ところで、なぜthread実行が必要だったのでしょうか
複数のブラウザを操作したい場合なら

driver1 = WebDriver.Start(WebDriver.Chrome)
driver2 = WebDriver.Start(WebDriver.Chrome)

としてやれば、あとはdriver1とdriver2を交互に操作することでそこそこ並列に処理ができます


僕としては今回の変更を加えたくない、というのが正直なところです
確実にこの変更が必要であると判断できない限り、masterにマージするつもりはありません
また、masterに更新が入っても「Thread対応」ブランチにその変更を反映することもないです

No.251 2019/03/08(Fri) 21:46:29

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / 森
stuncloudさん
対応ありがとうございました。

> なぜthread実行が必要だったのでしょうか
sample()の実際は、一連の動作が10分程度の無限ループで、
最大10個のsample()を動かすのですが、開始がまちまちなので、
1〜10を順番にという訳にはいかない事情がありました。

ぼくとしても、stuncloudさんには余計な負担やご迷惑をお掛けしたくありませんし、
可能な限りmasterを利用していきたい考えですので、
今の内に設計を見直してみたいと思います。

No.252 2019/03/09(Sat) 11:58:54

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / stuncloud
> sample()の実際は、一連の動作が10分程度の無限ループで、
> 最大10個のsample()を動かすのですが、開始がまちまちなので、
> 1〜10を順番にという訳にはいかない事情がありました。

なるほど

threadで複数実行してなにか問題が起きた場合は、Webdriverをそれぞれ別プロセスにすれば解決するかもしれません
やり方は、WebDriver.Startでそれぞれ別のポートを指定するだけです

//例
// コマンドプロンプトがそれぞれ起動するのでわりとうっとうしいですが…

thread sample(9515)
thread sample(9516)
thread sample(9517)

procedure sample(port)
 //略
 driver = WebDriver.Start(jsc, WebDriver.Chrome, port)
 //略
fend

今回の対応のように使う側にとっては用途がよくわからない、おまじないのような一行を挟まなければならないのはあまり好ましくないんですよね
Init()と命名しましたが別にイニシャライズしてるわけでもないし、悩んだのですが適切な名前も思いつかず…
状況をごまかすだけの代物にせざるを得ませんでした (力量不足のごまかしでもあります)
なのでまぁ、僕の中にこいつは正式な仕様として認められないな!という思いがあるのです

WebDriver.Start関数の仕様(引数の数)を変更することなくthreadで問題が生じない方法がなにか見つけられれば、正式にthread対応させられるのですが…
できる(やる)かどうかもわからないのであまり期待はしないでください

No.253 2019/03/09(Sat) 14:24:33

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / stuncloud
森さん

別の方法でthread対応してみました
手元ではうまく行ってるようなので試してもらえますでしょうか
https://github.com/stuncloud/UwscWebDriver/tree/Thread%e5%af%be%e5%bf%9c/UwscWebDriver.uws

> dim jsc
> WebDriver.Init(jsc)
> driver = WebDriver.Start(jsc, WebDriver.Chrome)


と書かなくて良くなります
従来通り
driver = WebDriver.Start(WebDriver.Chrome)
と書くだけでthreadでも動作します

そもそもの問題はJScript処理のためのScriptControlが別のスレッドからだとアクセスできないことで
スレッドごとにScriptControlのインスタンスを持たせるための苦肉の策が最初の対応でした
今回はスレッドごとにScriptControlのインスタンスを作るところは同じですが
それをモジュール内のhashtableに入れることで元の仕様通りScriptControlを隠蔽できるようになりました
なんでhashtableだと平気なのかわかんないんですけど…!

ただまぁ、ほんとに平気かどうかはちょっと不安なので
実際にこれで運用していただいて問題なさそうであれば教えてください
正式に修正を反映させようと思います

No.259 2019/03/11(Mon) 18:58:10

Re: UwscWebDriver.uwsをスレッドで複数動かしたい / 森
stuncloudさん、こんにちは
うわわ、ありがとうございます!
何となくstuncloudさんが、その後もやってくれてるような虫の知らせがあってチェックしてみたら、
やっぱり継続してやっててくれたんですね。
でも・・・
driver1 = WebDriver.Start(WebDriver.Chrome)
driver2 = WebDriver.Start(WebDriver.Chrome)
で1〜10を順番に回す方式にほぼ書き換え終えちゃいました(^^;)
今後のことも考えたら、妥協案でも仕方ないかと。
せっかくですのに、返事は遅いし、使わないしと、最悪なことになって申し訳ない気持ちでいっぱいです。
とりあえず完成させてしまいたいので、完成してからバージョンアップでthread版に切り替えてみたいと思います。
本当にいつもいつもありがとうございます。

No.262 2019/03/12(Tue) 18:13:33
セレクトボックスの内容取得ついて / 藍
いつもお世話になります。
セレクトボックスの内容を取得したいと思っていますが
うまく行きません。
ヒントを教えていただけないでしょうか。


内容
yahooの路線検索で
1.月のセレクトボックス内容取得
2.入力した発地のセレクトボックスの内容を取得
3.発地の「成田空港(東京)」に変更できないのはやり方がおかしいですか??

///////
Public IE
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
//
IE.Navigate("https://transit.yahoo.co.jp/")
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
// ここで月のセレクトボックスの内容取得 -> エラーになる
FOR i = 0 TO (IE.document.forms[0].m.length - 1)
PRINT "name:" + IE.document.forms[0].m[i].name
PRINT "value:" + IE.document.forms[0].m[i].value
 NEXT

IESetData(IE,"東京","from") // TEXT
IESetData(IE,"高崎","to") // TEXT
IESetData(IE,True,"","検索") // SUBMIT

REPEAT
SLEEP(0.1)
 UNTIL !IE.busy AND IE.readystate = 4
//
IESetData(IE,"成田空港(東京)","flatlon") // SELECT-ONE  
// 成田空港(東京)に変更できない?
//
IESetData(IE,"高崎商科大学前駅","tlatlon") // SELECT-ONE
// ここで発地のセレクトボックスの内容取得を取得したい -> エラーになる。
FOR i = 0 TO (IE.document.forms[0].flatlon.length - 1)
PRINT "name:" + IE.document.forms[0].flatlon[i].name
PRINT "value:" + IE.document.forms[0].flatlon[i].value
NEXT

お手数をおかけしますが、よろしくお願いします。

No.256 2019/03/10(Sun) 17:33:35

Re: セレクトボックスの内容取得ついて / Rayna
>>256 藍 さん

////////////////////////////////////////////////////////////

forms(0) を 参照しようとして失敗してて
その後 name を参照しようとしてで失敗してますね
以下で動作しました
 //| <select id="m" name="m">
 //| <option value="01" >1月</option>
 For i = 0 To (IE.document.forms(1).m.length - 1)
  Print "label:" + IE.document.forms(1).m.item(i).label
  Print "value:" + IE.document.forms(1).m.item(i).value
 Next
もしくは
 For item In IE.document.forms(1).m
  Print "label:" + item.label
  Print "value:" + item.value
 Next
flatlon部も同様
 //| <select name="flatlon">
 //| <option value=",,22828" label_name="東京" data-gid="" >東京駅</option>
 For item In IE.document.forms(1).flatlon
  Print "label:" + item.label
  Print "value:" + item.value
 Next

////////////////////////////////////////////////////////////

セレクトボックス選択部は それで通りそうな感じしますけど通らないので
別アプローチで [form].[select].selectedIndex プロパティ を使って見てはいかがでしょう
実装例
 Dim curform = IE.document.forms(1)
 //| Print IESetData(IE,"成田空港(東京)","flatlon") // SELECT-ONE
 curform.flatlon.selectedIndex = getSelectIndexByLabel(curform.flatlon, "成田空港(東京)")
 //| Print IESetData(IE,"高崎商科大学前駅","tlatlon") // SELECT-ONE
 curform.tlatlon.selectedIndex = getSelectIndexByLabel(curform.tlatlon, "高崎商科大学前駅")

 Function getSelectIndexByLabel(objSelect, strLabel)
  For RESULT = 0 To (objSelect.length - 1)
   If objSelect.item(RESULT).label=strLabel Then Exit
  Next
  RESULT=0
 FEnd

No.257 2019/03/10(Sun) 22:08:30

Re: セレクトボックスの内容取得ついて / satocha
javascriptが使えるなら、スクリプトタグをIEに追加して、あとはJSにやらせるようにすることもできます。ドキュメントオブジェクトをuwscで操作し、またドキュメントオブジェクトに書き戻すという操作より、ずっとIE上で作業したほうが、安定すると思います。
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
//
IE.Navigate("https://transit.yahoo.co.jp/")
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
document  =ie.document
script    =document.createElement( "script" )
script.innerHTML=jssrc
document.body.appendchild( script )
textblock jssrc
var monthSelect =document.getElementById( 'm' )
alert('月を操作')
monthSelect.selectedIndex++;
alert('出発地書き込み')
document.getElementById( 'sfrom' ).setAttribute( 'value', '成田空港(東京)' )
endtextblock

No.258 2019/03/11(Mon) 09:52:55

Re: セレクトボックスの内容取得ついて / 藍
貴重な時間を割いていただきありがとうございます。
不明な点がわかりました。いろいろトライしてみたいと思います。
ありがとうございました。

No.260 2019/03/11(Mon) 21:25:59
DOCU OCRのUWSCでの操作について / みつ
毎度お世話になります。

DOCUWORKS OCR の VBAコード を UWSC に移植しているのですが、宣言等の間違いをご教授頂けないでしょうか?

内容は、場所を2箇所指定し、その場所の文字をOCRで取得するというものです。

ハンドルとページ数は取得済で、def_dll XDW_ApplyOcr に関わる宣言部分がよく分かりません。

お手数ですが、よろしくお願い致します。

<VBA>
'2.3 XDW_ApplyOcr DocuWorksファイルの指定ページをOCR処理する。
Private Declare Function XDW_ApplyOcr Lib "D:\dwsdk625\XDWAPI\DLL\xdwapi.dll" (ByVal handle As Long, ByVal nPage As Long, ByVal nOcrEngine As Long, ByVal pOcrOption As Long, ByVal reserved As String) As Long

Private Type XDW_OCR_OPTION_V5_EX
nSize As Long '構造体XDW_OCR_OPTION_V5_EXのバイト数を設定する。
nNoiseReduction As Long 'ノイズ除去の強さを指定する。
nLanguage As Long '言語を指定する。
nInsertSpaceCharacter As Long '空白文字を挿入するかどうかを指定する。
nJapaneseKnowledgeProcessing As Long '日本語知識処理を行うかどうかを指定する。
nForm As Long '原稿レイアウトの構成を指定する。
nColumn As Long '原稿レイアウトの段組を指定する。
nDisplayProcess As Long '認識処理の過程を表示するかどうかを指定する。
nAutoDeskew As Long '自動的に傾き補正を行うかどうかを指定する。
nAreaNum As Long 'OCR処理する領域の個数を指定する。
pAreaRects As Long 'OCR処理する領域の座標(四角形)を指定する。
nPriority As Long 'カラーイメージ、および、グレースケールイメージに対する前処理を指定する。
End Type


Private Type XDW_RECT '四角形の左上隅と右下隅の座標を定義
left As Long '四角形の左上隅の x 座標
top As Long '四角形の左上隅の y 座標
right As Long '四角形の右下隅の x 座標
bottom As Long '四角形の右下隅の y 座標
End Type


Private Enum XDW_OCR_ENGINE 'OCRエンジンの種類
XDW_OCR_ENGINE_DEFAULT = 1 'DocuWorks付属の内蔵型OCR
XDW_OCR_ENGINE_WRP = 2 'メディアドライブ(株) WinReader PRO
End Enum
Private Enum XDW_REDUCENOISE 'ノイズ除去の強さ
XDW_REDUCENOISE_NONE = 0 'ノイズ除去を行わない (default)
XDW_REDUCENOISE_NORMAL = 1 'ふつう
XDW_REDUCENOISE_WEAK = 2 '弱く
XDW_REDUCENOISE_STRONG = 3 '強く
End Enum
Private Enum XDW_OCR_LANGUAGE '言語を指定
XDW_OCR_LANGUAGE_AUTO = -1 '自動判別 (default)
XDW_OCR_LANGUAGE_JAPANESE = 0 '日本語
XDW_OCR_LANGUAGE_ENGLISH = 1 '英語
End Enum
Private Enum XDW_OCR_FORM '原稿レイアウトの構成を指定
XDW_OCR_FORM_AUTO = 0 '自動判別 (default)
XDW_OCR_FORM_TABLE = 1 '表
XDW_OCR_FORM_WRITING = 2 '文章
End Enum
Private Enum XDW_OCR_COLUMN '原稿レイアウトの段組を指定
XDW_OCR_COLUMN_AUTO = 0 '自動判別 (default)
XDW_OCR_COLUMN_HORIZONTAL_SINGLE = 1 '横書き一段
XDW_OCR_COLUMN_HORIZONTAL_MULTI = 2 '横書き多段
XDW_OCR_COLUMN_VERTICAL_SINGLE = 3 '縦書き一段
XDW_OCR_COLUMN_VERTICAL_MULTI = 4 '縦書き多段
End Enum


Sub ApplyOcrParts()
'DocuWorksファイルをOCR処理する(指定ページの指定部分)
Dim Err_XDW_ApplyOcr As String

'OCR処理の準備。
Dim myXDW_OCR_OPTION_V5_EX As XDW_OCR_OPTION_V5_EX
Dim myXDW_OCR_ENGINE As XDW_OCR_ENGINE
Dim myXDW_REDUCENOISE As XDW_REDUCENOISE
Dim myXDW_OCR_LANGUAGE As XDW_OCR_LANGUAGE
Dim myXDW_OCR_FORM As XDW_OCR_FORM
Dim myXDW_OCR_COLUMN As XDW_OCR_COLUMN
Dim myXDW_RECT(1) As XDW_RECT

'変数を設定
myXDW_OCR_ENGINE = XDW_OCR_ENGINE_DEFAULT 'OCRエンジンにDocuWorks付属の内蔵型OCRを使用する。
myXDW_REDUCENOISE = XDW_REDUCENOISE_NONE
myXDW_OCR_LANGUAGE = XDW_OCR_LANGUAGE_AUTO
myXDW_OCR_FORM = XDW_OCR_FORM_AUTO
myXDW_OCR_COLUMN = XDW_OCR_COLUMN_AUTO
With myXDW_RECT(0)
.left = 1000
.top = 1000
.right = 6000
.bottom = 6000
End With
With myXDW_RECT(1)
.left = 10000
.top = 1000
.right = 20000
.bottom = 6000
End With

'XDW_OCR_OPTION_V5_EX構造体に変数を設定
With myXDW_OCR_OPTION_V5_EX
.nNoiseReduction = myXDW_REDUCENOISE
.nLanguage = myXDW_OCR_LANGUAGE
.nInsertSpaceCharacter = 0
.nJapaneseKnowledgeProcessing = 1
.nForm = myXDW_OCR_FORM
.nColumn = myXDW_OCR_COLUMN
.nDisplayProcess = 1
.nAutoDeskew = 1
.nAreaNum = UBound(myXDW_RECT, 1) + 1
.pAreaRects = VarPtr(VarPtr(myXDW_RECT(0)))
.nSize = LenB(myXDW_OCR_OPTION_V5_EX)
End With

'DocuWorksファイルの指定ページの指定部分をOCR処理する。
Err_XDW_ApplyOcr = XDW_ApplyOcr(lngHandle, 3, myXDW_OCR_ENGINE, VarPtr(myXDW_OCR_OPTION_V5_EX), vbNullString)


<UWSC>
def_dll XDW_ApplyOcr(Long, Long, Long,var Long[ ], String):Long:C:\Windows\System32\xdwapi.dll

Dim myXDW_OCR_OPTION_V5_EX //As XDW_OCR_OPTION_V5_EX
Dim myXDW_OCR_ENGINE //As XDW_OCR_ENGINE
Dim myXDW_REDUCENOISE //As XDW_REDUCENOISE
Dim myXDW_OCR_LANGUAGE //As XDW_OCR_LANGUAGE
Dim myXDW_OCR_FORM //As XDW_OCR_FORM
Dim myXDW_OCR_COLUMN //As XDW_OCR_COLUMN
Dim myXDW_RECT[1] //As XDW_RECT

//nSizeをハンドルで使用しているので n を m に変更
DIM mSize
DIM mNoiseReduction
DIM mLanguage
DIM mInsertSpaceCharacter
DIM mJapaneseKnowledgeProcessing
DIM mForm
DIM mColumn
DIM mDisplayProcess
DIM mAutoDeskew
DIM mAreaNum
DIM pAreaRects
DIM mPriority


DIM XDW_OCR_OPTION_V5_EX[12]
//
XDW_OCR_OPTION_V5_EX[0] = mSize // As Long '構造体XDW_OCR_OPTION_V5_EXのバイト数を設定する。
XDW_OCR_OPTION_V5_EX[1] = mNoiseReduction // As Long 'ノイズ除去の強さを指定する。
XDW_OCR_OPTION_V5_EX[2] = mLanguage // As Long '言語を指定する。
XDW_OCR_OPTION_V5_EX[3] = mInsertSpaceCharacter // As Long '空白文字を挿入するかどうかを指定する。
XDW_OCR_OPTION_V5_EX[4] = mJapaneseKnowledgeProcessing // As Long '日本語知識処理を行うかどうかを指定する。
XDW_OCR_OPTION_V5_EX[5] = mForm // As Long '原稿レイアウトの構成を指定する。
XDW_OCR_OPTION_V5_EX[6] = mColumn // As Long '原稿レイアウトの段組を指定する。
XDW_OCR_OPTION_V5_EX[7] = mDisplayProcess // As Long '認識処理の過程を表示するかどうかを指定する。
XDW_OCR_OPTION_V5_EX[8] = mAutoDeskew // As Long '自動的に傾き補正を行うかどうかを指定する。
XDW_OCR_OPTION_V5_EX[9] = mAreaNum // As Long 'OCR処理する領域の個数を指定する。
XDW_OCR_OPTION_V5_EX[10] = pAreaRects // As Long 'OCR処理する領域の座標(四角形)を指定する。
XDW_OCR_OPTION_V5_EX[11] = mPriority // As Long 'カラーイメージ、および、グレースケールイメージに対する前処理を指定する。

//left, right は予約後となっていた為、以下に変更?
DIM 左1
DIM 上1
DIM 右1
DIM 下1

DIM XDW_RECT[3] //'四角形の左上隅と右下隅の座標を定義

XDW_RECT[0] = 左1 //As Long // '四角形の左上隅の x 座標
XDW_RECT[1] = 上1 //As Long //'四角形の左上隅の y 座標
XDW_RECT[2] = 右1 //As Long // '四角形の右下隅の x 座標
XDW_RECT[3] = 下1 //As Long // '四角形の右下隅の y 座標


//DIM XDW_OCR_ENGINE[1] //'OCRエンジンの種類
CONST XDW_OCR_ENGINE_DEFAULT = 1 //DocuWorks付属の内蔵型OCR
CONST XDW_OCR_ENGINE_WRP = 2 //'メディアドライブ(株) WinReader PRO


//Private Enum XDW_REDUCENOISE //'ノイズ除去の強さ
CONST XDW_REDUCENOISE_NONE = 0 //'ノイズ除去を行わない (default)
CONST XDW_REDUCENOISE_NORMAL = 1 //'ふつう
CONST XDW_REDUCENOISE_WEAK = 2 //'弱く
CONST XDW_REDUCENOISE_STRONG = 3 //'強く

//Private Enum XDW_OCR_LANGUAGE //'言語を指定
CONST XDW_OCR_LANGUAGE_AUTO = -1 //'自動判別 (default)
CONST XDW_OCR_LANGUAGE_JAPANESE = 0 //'日本語
CONST XDW_OCR_LANGUAGE_ENGLISH = 1 //'英語

//Private Enum XDW_OCR_FORM //'原稿レイアウトの構成を指定
CONST XDW_OCR_FORM_AUTO = 0 //'自動判別 (default)
CONST XDW_OCR_FORM_TABLE = 1 //'表
CONST XDW_OCR_FORM_WRITING = 2 //'文章

//Private Enum XDW_OCR_COLUMN //'原稿レイアウトの段組を指定
CONST XDW_OCR_COLUMN_AUTO = 0 //'自動判別 (default)
CONST XDW_OCR_COLUMN_HORIZONTAL_SINGLE = 1 //'横書き一段
CONST XDW_OCR_COLUMN_HORIZONTAL_MULTI = 2 //'横書き多段
CONST XDW_OCR_COLUMN_VERTICAL_SINGLE = 3 //'縦書き一段
CONST XDW_OCR_COLUMN_VERTICAL_MULTI = 4 //'縦書き多段

myXDW_OCR_ENGINE = XDW_OCR_ENGINE_DEFAULT //'OCRエンジンにDocuWorks付属の内蔵型OCRを使用する。
myXDW_REDUCENOISE = XDW_REDUCENOISE_NONE
myXDW_OCR_LANGUAGE = XDW_OCR_LANGUAGE_AUTO
myXDW_OCR_FORM = XDW_OCR_FORM_AUTO
myXDW_OCR_COLUMN = XDW_OCR_COLUMN_AUTO

//二か所の部分ですが、指定方法が分かりません。
With myXDW_RECT[0]
.左1 = 1000
.上1 = 1000
.右1 = 6000
.下1 = 6000
EndWith


With myXDW_RECT[1]
.左1 = 10000
上1 = 1000
.右1 = 20000
.下1 = 6000
EndWith

//ここから下も分かりません。
// 'XDW_OCR_OPTION_V5_EX構造体に変数を設定
With myXDW_OCR_OPTION_V5_EX
.nNoiseReduction = myXDW_REDUCENOISE
.nLanguage = myXDW_OCR_LANGUAGE
.nInsertSpaceCharacter = 0
.nJapaneseKnowledgeProcessing = 1
.nForm = myXDW_OCR_FORM
.nColumn = myXDW_OCR_COLUMN
.nDisplayProcess = 1
.nAutoDeskew = 1
.nAreaNum = UBound(myXDW_RECT, 1) + 1
.pAreaRects = VarPtr(VarPtr(myXDW_RECT(0)))
.nSize = LenB(myXDW_OCR_OPTION_V5_EX)
End With

'DocuWorksファイルの指定ページの指定部分をOCR処理する。
Err_XDW_ApplyOcr = XDW_ApplyOcr(lngHandle, 3, myXDW_OCR_ENGINE, VarPtr(myXDW_OCR_OPTION_V5_EX), vbNullString)


よろしくお願い致します。

No.239 2019/03/02(Sat) 09:23:45

Re: DOCU OCRのUWSCでの操作について / stuncloud
ネタ元はここかと思われます
http://tokidokidokin.com/2011/11/docuworks-apixdwapiを使って、vbaでdoduworksファイルをocr処理する/
一応こちらもさっと目を通してみました

まず、dimで変数をたくさん宣言されてますが、大半が不要です
> DIM XDW_OCR_OPTION_V5_EX[12]
ひとまずこれだけでいいかな?
constは使います

そして
> // 'XDW_OCR_OPTION_V5_EX構造体に変数を設定
については XDW_OCR_OPTION_V5_EX 代入していけばいいです

XDW_OCR_OPTION_V5_EX[0] = 48 // nSize
XDW_OCR_OPTION_V5_EX[1] = XDW_REDUCENOISE_NONE // nNoiseReduction
XDW_OCR_OPTION_V5_EX[2] = XDW_OCR_LANGUAGE_AUTO // nLanguage
XDW_OCR_OPTION_V5_EX[3] = 0 // nInsertSpaceCharacter
XDW_OCR_OPTION_V5_EX[4] = 1 // nJapaneseKnowledgeProcessing
XDW_OCR_OPTION_V5_EX[5] = XDW_OCR_FORM_AUTO // nForm
XDW_OCR_OPTION_V5_EX[6] = XDW_OCR_COLUMN_AUTO // nColumn
XDW_OCR_OPTION_V5_EX[7] = 1 // nDisplayProcess
XDW_OCR_OPTION_V5_EX[8] = 1 // nAutoDeskew
XDW_OCR_OPTION_V5_EX[9] = 0 // nAreaNum
XDW_OCR_OPTION_V5_EX[10] = 0 // pAreaRects
XDW_OCR_OPTION_V5_EX[11] = 0 // nPriority

あとはmyXDW_RECTについてなんですが、どうやらOCRを行う範囲を複数指定するためのもののようです
全く範囲を指定せずファイル(内の指定ページ?)全体をOCRの対象とすることもできるようですね
範囲指定をしない場合は上記例のようにnAreaNum(範囲の数)を0、pAreaRectsも0(指定がないのでおそらく0で大丈夫)になります
(つまり範囲指定をしないならばmyXDW_RECTに相当するものは不要ということ)

nPriority については記述がなかったので0にしています
サンプルでは nPriority を指定していないのでこれも多分0で大丈夫です

あとは XDW_OCR_OPTION_V5_EX を XDW_ApplyOcr に渡すだけです
ひとまずこれで試してみてもらえますでしょうか

---------

さて、どうしてもOCRの対象範囲を指定をしたい!という場合はUWSCからだと面倒そうですね…

nAreaNumはXDW_RECTの配列のサイズですね
pAreaRectsにはXDW_RECTの配列のポインタのポインタが入るようです
ポインタのポインタとか言い出したよ

こうなってくるとXDW_OCR_OPTION_V5_EXをlong[]による手抜き宣言するわけにはいかなくなりそうです

配列のポインタなら var long[] でいいけどそのポインタとなると…
{var long[]} と書けばうまくいくのかな?

def_dll XDW_ApplyOcr(Long, Long, Long, _
{long,long,long,long,long,long,long,long,long,long,{var long[]},long}, _
String):Long:C:\Windows\System32\xdwapi.dll

つまりこんな感じですかね…?

そんで指定範囲が1つなら
dim XDW_RECT[3]
2つなら
dim XDW_RECT[7]
みたいな感じで配列を定義してそれに値を代入しておけばいけるんじゃないかなーと思いたい…
んですけど試してみないとわかんないですね

---------

環境なくて全部予想なんで全然違ったらごめんなさい

No.240 2019/03/02(Sat) 19:59:23

Re: DOCU OCRのUWSCでの操作について / TmShinza
これはCの構造体(struct)をVBAの構造体(type)に置き換えているようです。
構造体と配列は別物ですから、DIM XDW_OCR_OPTION_V5_EX[12] は無意味です。
同じくRECT構造体を DIM XDW_RECT[3] に置き換えることもできません。

UWSCは、構造体を宣言して使用することはできないので、VBAのコードを直接置き換えることはできないと思います。

ただUWSCは、構造体を引数に取るAPIを利用するために、DLL使用定義で構造体のメンバを単体の変数に対応付ける宣言ができるようになっています。

XDW_ApplyOcr()は、本来は5個の引数を取るAPIですが、構造体引数のメンバを分解して、16個の引数を取るAPIとして、呼び出すことができます。

試みにXDW_ApplyOcr()のプロトタイプに合わせてWin32 DLLを作成して、UWSCから呼んでみました。

stuncloudさんがおっしゃっているように、nAreaNumとnAreaRectsを0にすれば、値が渡るようです。ただし、第一引数は long ではなく {long} と思います。

{var long[]} はRECT構造体を配列に置き換えた時点で無理がありますが、あえて呼び出してみると Access violation が発生しました。構造体の配列をUWSCのDLL使用定義で記述するのは無理かも知れません。

No.241 2019/03/05(Tue) 20:31:31

Re: DOCU OCRのUWSCでの操作について / stuncloud
TmShinzaさん、検証ありがとうございます!
やはり無理がありましたね{var long[]}

>構造体と配列は別物ですから、DIM XDW_OCR_OPTION_V5_EX[12] は無意味です。
def_dllの構造体の代わりに配列を渡す、というのは実はできちゃうんですよね
バッドノウハウの類ではありますが
しゅんさんのブログが詳しいです
https://junjun777.hatenablog.com/entry/20131205/uwsc_def_dll
(これ読めば{var long[]}はダメってわかりますね…ううう)

あと、もっと本気で構造体を扱う手段があるにはあるんですが
とにかく面倒で面倒で面倒なのであんまりおすすめしません
でも今回の要件を満たすものもちゃんと作れるはず
(僕やしゅんさんのブログを掘り返すとそういうことをしている記事が出てきます)

No.242 2019/03/06(Wed) 00:06:38

Re: DOCU OCRのUWSCでの操作について / みつ
stuncloudさん、TmShinzaさんご返信ありがとうございます。

> XDW_OCR_OPTION_V5_EX を XDW_ApplyOcr に渡すだけです
>ひとまずこれで試してみてもらえますでしょうか


XDW_ApplyOcr(Long, Long, Long, var long[], String)
XDW_ApplyOcr(inghandle, XDW_DOCUMENT_INFO[1], XDW_OCR_ENGINE_DEFAULT, XDW_OCR_OPTION_V5_EX, NULL)

全体をOCRは、var long[] で XDW_OCR_OPTION_V5_EX[12] をバッチリポインタに渡すことができ、OCRできました。
ありがとうございます。


>あと、もっと本気で構造体を扱う手段があるにはあるんですが
>とにかく面倒で面倒で面倒なのであんまりおすすめしません
>でも今回の要件を満たすものもちゃんと作れるはず


やりたいことは、自分が指定した2箇所の位置の文字の取得なので、何とかポインタのポインタを渡すことができないでしょうか?
{var long[]}もまだ試せていないので、試してみます。

No.243 2019/03/06(Wed) 21:45:09

Re: DOCU OCRのUWSCでの操作について / stuncloud
XDW_OCR_OPTION_V5_EXが配列でうまくいったようなのでよかったです
XDW_RECTだけ面倒な方法でやりましょう
明日サンプル書きます

No.244 2019/03/07(Thu) 00:36:59

Re: DOCU OCRのUWSCでの操作について / stuncloud
書きました
使うモジュールは以下から
https://stuncloud.wordpress.com/2012/08/10/uwsc_module_structures/

==========================================================
call Module_Structure.uws

// 構造体の定義
// 今回は範囲を2つ指定したい、つまりXDW_RECTが2つ必要
// 構造体の配列なので並べて定義すればよかろう

with Struct
.DefineStruct("XDW_RECT")
// 1個目
.DefineMember("XDW_RECT", "Rect1.left", .TYPE_LONG)
.DefineMember("XDW_RECT", "Rect1.top", .TYPE_LONG)
.DefineMember("XDW_RECT", "Rect1.right", .TYPE_LONG)
.DefineMember("XDW_RECT", "Rect1.bottom", .TYPE_LONG)
// 2個目
.DefineMember("XDW_RECT", "Rect2.left", .TYPE_LONG)
.DefineMember("XDW_RECT", "Rect2.top", .TYPE_LONG)
.DefineMember("XDW_RECT", "Rect2.right", .TYPE_LONG)
.DefineMember("XDW_RECT", "Rect2.bottom", .TYPE_LONG)
// メンバの名前は書いてる本人が識別するためのものなので
// わかりやすくする以上の意味はありません
// 左1、左2とかでもいいです

// メモリ確保、pXDW_RECTはXDW_RECT構造体の配列のポインタ
pXDW_RECT = StructAlloc("XDW_RECT")

// 値のセット
// ここで任意の値をセットしてください
// とりあえずサンプルの数値をそのまま入れてます
// 1個目
.SetMemberValue("XDW_RECT", "Rect1.left", 1000)
.SetMemberValue("XDW_RECT", "Rect1.top", 1000)
.SetMemberValue("XDW_RECT", "Rect1.right", 6000)
.SetMemberValue("XDW_RECT", "Rect1.bottom", 6000)
// 2個目
.SetMemberValue("XDW_RECT", "Rect2.left", 10000)
.SetMemberValue("XDW_RECT", "Rect2.top", 1000)
.SetMemberValue("XDW_RECT", "Rect2.right", 20000)
.SetMemberValue("XDW_RECT", "Rect2.bottom", 6000)
endwith

// 次に配列のポインタのポインタが必要になります
// ポインタというのはメモリのアドレスを格納した変数なので
// ポインタのポインタはアドレスを格納した変数のポインタということになります
// pXDW_RECTがポインタなのでこの変数のアドレスがわかればいいんですが
// UWSCだとちょっと無理なので別の方法を取ります

with Struct
// ポインタのアドレスを格納するためのメモリを確保
ppXDW_RECT = ._memoryAlloc(4)

// XDW_RECT構造体の配列のアドレスを確保したメモリに書き込む
def_dll RtlMoveMemory(dword, dword, dword):kernel32
RtlMoveMemory(ppXDW_RECT, pXDW_RECT, 4)
// これにより、ppXDW_RECTはXDW_RECT構造体の配列のアドレスの値を格納したメモリのアドレス
// つまりポインタのポインタになります
// ややこしいですね!
endwith

// あとは値をセットしてOCRを実行してください
XDW_OCR_OPTION_V5_EX[9] = 2 // nAreaNum
XDW_OCR_OPTION_V5_EX[10] = ppXDW_RECT // pAreaRects


// 諸々の処理が終わったら最後にメモリを開放します
Struct.FreeStruct("XDW_RECT")
Struct._freeMemory(ppXDW_RECT)
==========================================================

・構造体の配列について

メモリ上に並んでりゃ大丈夫なはずじゃろ、ということでこんな感じになりました
ここがダメだとぜんぶダメになっちゃうんですが、大丈夫だと思いたい
あとダメだった場合はじゃあどうすんの?が未解決なのも厳しい

・ポインタのポインタについて

ポインタてのは要するにメモリのアドレス(の数値)を格納した変数なので
アドレスの情報が入ってる部分のアドレスの入ってる変数ができれば
それがポインタのポインタです


どうにかして構造体を扱いたいということでこんなモジュールを書いたんですが
正直扱いが面倒すぎて結局使わなくなりました
def_dllで構造体を{}展開する代わりにvar配列するという発想も
とにかく楽をしたいがために編み出されました、面倒は良くない
しかし、標準の{}展開も使えない今回のようなケースだと
こんなモジュールでも使わざるを得ないんですよね

なお、しゅんさんのjsオブジェクト版だと構造体がもっとシュッと書ける
https://junjun777.hatenablog.com/entry/20130523/uwsc_struct
メンバーに.でアクセスできるのがいいですよね
こちらもお試しあれ!

No.245 2019/03/07(Thu) 13:46:16

Re: DOCU OCRのUWSCでの操作について / みつ
stuncloudさん 詳しいサンプルありがとうございます。

ご連絡が遅くなってしまいすみません。
結論から言いますと、無事に2箇所のOCRを行うことができました。
ありがとうございます。

できたのは一番初めに教えて頂いた方です。

def_dll XDW_ApplyOcr(Long, Long, Long,{long,long,long,long,long,long,long,long,long,long,{var long[]},long},String):Long:C:\Windows\System32\xdwapi.dll

DIM XDW_RECT[7]
//1個目
XDW_RECT[0] = 33000
XDW_RECT[1] = 28200
XDW_RECT[2] = 35250
XDW_RECT[3] = 28950
//2個目
XDW_RECT[4] = 36000
XDW_RECT[5] = 28200
XDW_RECT[6] = 37500
XDW_RECT[7] = 28950

XDW_ApplyOcr(inghandle, XDW_DOCUMENT_INFO[1], XDW_OCR_ENGINE_DEFAULT,48,0,-1,0,1,0,0,1,1,2,XDW_RECT,0,NULL)


二番目に教えて頂いたサンプルは、試しているのですが、StructAllocがありませんのエラーが出てしまいます。
私が内容を理解しきれていない為、上手く書けていないだけだと思いますので、お教えて頂いたサイトも見ながら色々と試してみます。
まだまだ時間が掛かりそうでが・・・

やりたかったOCRができるようになり、本当に助かりました。
いつもありがとうございます。

No.254 2019/03/09(Sat) 16:05:41

Re: DOCU OCRのUWSCでの操作について / stuncloud
成功してなによりです
配列でうまくいったんですね!よかったよかった

エラーはサンプルのtypoが原因でした、すいません
StructAllocではなくStruct.Allocが正しいです

No.255 2019/03/10(Sun) 01:05:47
COMオブジェクトのエクセルをアクティブにしたい / YMK
Excel = GETACTIVEOLEOBJ("Excel.Application")
で取得したExcelを操作したいのですが、

CTRLWIN(Excel,ACTIVATE) や
CTRLWIN(HNDTOID(Excel),ACTIVATE) では動作しませんでした。

CTRLWIN(GETID("Microsoft Excel - ",ACTIVATE))では動作しましたが、
複数エクセルがある場合は不安定ですし、ファイル名が変わるので決め打ちが出来ません。

何か良い方法があれば教えてください。

No.231 2019/02/25(Mon) 13:04:27

Re: COMオブジェクトのエクセルをアクティブにしたい / しろまさ
// oXL は取得できている前提として
idXL = GetID(oXL.ActiveWorkbook.Name, "XLMAIN", 0.2)
CtrlWin(idXL, ACTIVATE) // アクティブ

No.232 2019/02/25(Mon) 15:22:29

Re: COMオブジェクトのエクセルをアクティブにしたい / YMK
有り難うございました。
No.233 2019/02/25(Mon) 15:59:23

Re: COMオブジェクトのエクセルをアクティブにしたい / stuncloud
hndtoid(Excel.Hwnd)
でもid取れます

No.234 2019/02/25(Mon) 16:17:49

Re: COMオブジェクトのエクセルをアクティブにしたい / TmShinza
ひとつ気になる点があります。「複数エクセルがある場合」ですが、通常そのどちらも
「Excel = GETACTIVEOLEOBJ("Excel.Application")で取得したExcel」に属しています。

これは次のようなスクリプトを実行してみれば判ります。

Test.UWS
--------------------------------------------------------
Excel = GETACTIVEOLEOBJ("Excel.Application")
print Excel.WorkBooks.count
for i in Excel.WorkBooks
print i.Name
next

A.xlsx と B.xlsx のように複数のExcelファイルを開いてTest.UWSを実行すると
開いているExcelの数とそれぞれのファイル名を表示するはずです。

Excel = GETACTIVEOLEOBJ("Excel.Application")で取得したExcelオブジェクトが
複数のエクセル(ウィンドウ)を管理しているので、どれか一つのウィンドウを
選ぶ必要があります。

ActiveWorkbook は、Activeなエクセル画面を選びます。したがって

Excel = GETACTIVEOLEOBJ("Excel.Application",)
id = GetID(Excel. ActiveWorkbook.Name, "XLMAIN", -1)
CTRLWIN(id, ACTIVATE)

は、ActiveなエクセルをActiveにするという操作になります。

A.xlsxが前面でActive、B.xlsxが背面のように「複数エクセルがある場合」
A.xlsxが(Excel以外を含む)全てのウィンドウの前面になります。
B.xlsxを前面に出すことはできません。

「Excel = GETACTIVEOLEOBJ("Excel.Application")で取得したExcel」という前提だけ
だと「複数エクセルがある場合」ActiveWorkbookのように、どのExcelか選択する条件
を追加する必要があるということです。

開いているExcelが一つだけなら何も問題はないのですが。

No.235 2019/02/26(Tue) 05:02:49

Re: COMオブジェクトのエクセルをアクティブにしたい / YMK
そうですね、前提が間違っていました。

file = "Book2.xlsm"
Excel = GETACTIVEOLEOBJ("Excel.Application",file)

idXL = GetID(Excel.ActiveWorkbook.Name)
//idXL = hndtoid(Excel.Hwnd) //どちらかで

CtrlWin(idXL, ACTIVATE)

で安定動作しました。
有り難うございました。

No.236 2019/02/26(Tue) 16:10:17

Re: COMオブジェクトのエクセルをアクティブにしたい / TmShinza
もう一つの方法として、開いているExcelが一つなら問題ない→複数開いているならエラーにする手もあります。

Excel = GETACTIVEOLEOBJ("Excel.Application")
if Excel.WorkBooks.count > 1 then
MsgBox("Excelが複数開いています")
ExitExit
endif

No.238 2019/02/28(Thu) 08:54:19
マウスポインター下の情報を取得するスクリプト / トンボ
ただの感想で恐縮ですが、質問「GETSTR関数の番号指定を自動化したい」に回答していただいたおかげで、マウスポインター下の情報を取得するプロトタイプができました。ありがとうございます。
ウィンドウの文字列など情報取得がマウス操作だけで実現できるようになり、嬉しい限りです。

OPTION EXPLICIT
//OPTION OPTPUBLIC

Fukidasi("タイトルバーなどオブジェクトにカーソルを合わせてください。")
Sleep(3)

GetAllPosAcc(G_MOUSE_X, G_MOUSE_Y)
GetAllPeekColor(G_MOUSE_X, G_MOUSE_Y)

// 親ウィンドウと子ウィンドウのIDリストを1つの配列としてまとめる
Dim wid = GetId(GET_FROMPOINT_OBJ)
Dim n = GetAllWin(wid)
Dim aryAllId = Split(wid + " " + Join(ALL_WIN_ID))

// ボタン名の配列を作成して、セレクトボックス表示
DIM i, aryBtn[n]
For i = 0 to n
  aryBtn[i] = Status(aryAllId[i], ST_CLASS) + " [" + Status(aryAllId[i], ST_TITLE) + "]"
Next
Dim Res = SlctBox(SLCT_NUM, 0, "親/子ウィンドウのクラスを選んでください。", aryBtn)
if (Res = -1)
  Print "キャンセルしました。"
  Exit
endif
wid = aryAllId[Res]    // 多分-1になることはない

GetAllStatus(wid)
GetAllStr(wid)
GetAllItem(wid)

Procedure GetAllPosAcc(m_x, m_y)
  Print "----------PosAcc----------"
  Dim aryAccMode[] = "0", "ACC_ACC", "ACC_API", "ACC_NAME", "ACC_VALUE", "ACC_ROLE", _
            "ACC_STATE", "ACC_DESCRIPTION", "ACC_LOCATION", "ACC_BACK"
  Dim ACC_MODE
  For ACC_MODE In aryAccMode
    Print ACC_MODE + "<#TAB>=" + POSACC(0, m_x, m_y, EVAL(ACC_MODE))
  next
  Print
Fend

Procedure GetAllPeekColor(m_x, m_y)
  Print "----------PeekColor----------"
  Dim aryColRGB[] = "0", "COL_RGB", "COL_R", "COL_G", "COL_B"
  Dim COL_RGBTYPE
  For COL_RGBTYPE In aryColRGB
    Print COL_RGBTYPE + "<#TAB>=" + PEEKCOLOR(m_x, m_y, EVAL(COL_RGBTYPE))
  Next
  Print
Fend

Procedure GetAllStatus(wid)
  Print "----------Status----------"
  Dim aryStItem[] = "ST_TITLE", "ST_CLASS", "ST_X", "ST_Y", "ST_WIDTH", "ST_HEIGHT", "ST_CLX", "ST_CLY", _
            "ST_CLWIDTH", "ST_CLHEIGHT", "ST_PARENT", "ST_ICON", "ST_MAXIMIZED", "ST_VISIBLE", _
            "ST_ACTIVE", "ST_BUSY", "ST_ISID", "ST_WIN64", "ST_PATH", "ST_PROCESS", "ST_MONITOR"
  Dim ST_ITEM
  For ST_ITEM In aryStItem
    Print ST_ITEM + "<#TAB>=" + Status(wid, Eval(ST_ITEM))
  Next
  Print
Fend

Procedure GetAllStr(wid)
  Print "----------GetStr----------"
  Dim aryStrType[] = "STR_EDIT", "STR_STATIC", "STR_STATUS", "STR_ACC_EDIT", "STR_ACC_STATIC", "STR_ACC_CELL"
  Dim STR_TYPE, Str, i
  For STR_TYPE In aryStrType
    Print "【" + STR_TYPE + "】"
    i = 1
    While True
      Str = GetStr(wid, i, Eval(STR_TYPE))
      if (Str <> EMPTY) then Print i + "<#TAB>=" + Str else Break
      i = i + 1
    Wend
    Print "合計<#TAB>=" + (i - 1); Print
  Next
Fend

Procedure GetAllItem(wid)
  Print "----------GetItem----------"
  Dim aryItmType[] = "ITM_BTN", "ITM_LIST", "ITM_TAB", "ITM_MENU", "ITM_TREEVIEW", "ITM_LISTVIEW", _
            "ITM_EDIT", "ITM_STATIC", "ITM_STATUSBAR", "ITM_TOOLBAR", "ITM_LINK", "ITM_ACCCLK", _
            "ITM_ACCCLK2", "ITM_ACCTXT", "ITM_ACCEDIT"
  Dim ITM_TYPE, i
  For ITM_TYPE In aryItmType
    Print "【" + ITM_TYPE + "】"
    For i = 0 To GetItem(wid, Eval(ITM_TYPE)) - 1
      Print i + "<#TAB>=" + ALL_ITEM_LIST[i]
    Next
    Print "合計<#TAB>=" + i; Print
  Next
Fend

No.225 2019/02/16(Sat) 18:01:27

Re: マウスポインター下の情報を取得するスクリプト / satocha
コードの提供ありがとうございます。

こういう情報が欲しいとき、私は眠たい詩人さん作の「UWSCコードの断片生成器」を使っています。しかし、万能ツールのため、文字情報だけ得たいときにはオーバースペックで、取得時間が長く待たされます。
http://nem.symphonic-net.com/uwsct/fcuc_readme.htm

その点、トンボさんの単機能スクリプトは手軽に使えそうですね。

あと、この掲示板でいうのはなんですが、AUtoitとAuto Hot Keyのウインドウスパイツールもなかなか使い勝手がよかったです。
https://www.autoitscript.com/autoit3/docs/intro/au3spy.htm
http://ahkwiki.net/Window#Window_Spy_.E3.82.92.E5.88.A9.E7.94.A8.E3.81.97.E3.81.A6.E8.AA.BF.E6.9F.BB.E3.82.92.E8.A1.8C.E3.81.86

No.226 2019/02/17(Sun) 07:01:58

Re: マウスポインター下の情報を取得するスクリプト / トンボ
ありがとうございます。
スパイツールではコンボボックスの下に開くリストのクラスが取得できない、またクラスが多いとGETCTLHNDなど関数の引数変更も多くなり骨が折れるため、スクリプトを作成しました。
UWSCコードの断片生成器がありましたね。当時はUWSC初心者でそのツールの価値を理解できず、すっかり忘れていました。オロオロ。
フリーのスパイツールを使用していましたが、AUtoitとAuto Hot Keyの方が便利そうですね。
最近は業務アプリ操作の自動化を進めているので、紹介していただいたツールで試用してみます。

No.227 2019/02/17(Sun) 20:26:16

Re: マウスポインター下の情報を取得するスクリプト / しろまさ
オーバースペック いいね!
No.228 2019/02/22(Fri) 16:39:00

Re: マウスポインター下の情報を取得するスクリプト / satocha
>しろまささん
とっておきのコードありがとうございます。美しいコードで眼福です。
変数名の付け方などコーディングの手本にしたいと思います。

No.229 2019/02/23(Sat) 22:13:58

Re: マウスポインター下の情報を取得するスクリプト / しろまさ
ちょっとやめてください><
CやPowerShell使いこなす方は私より上級者ですから!

No.230 2019/02/24(Sun) 18:19:45

Re: マウスポインター下の情報を取得するスクリプト / トンボ
本日、業務アプリで試しましたが、コード記入が楽になり便利です。フル実行は2時間かかって中断したので、今後はカスタム実行のみに絞った方が良さそうですね。ありがとうございます。
私がプログラミングに詳しくなったのはVBAのおかげですが、VBAもUWSCも独学なので、コードは参考になります。眼福眼福…(×10回)。
サンプルページを閲覧しましたが、提供ツールも含め沢山ありますね。特にスクリプト作成補助ツールは多用しそうです。

No.237 2019/02/26(Tue) 19:53:10
GETSTR関数の番号指定を自動化したい / トンボ
GETSTR関数でウィンドウ文字列を取得するスクリプトを作成しています。
GETSTR関数の番号(引数)の指定を自動にするべく、当初GETITEM関数の取得数(戻り値)を検討していましたが、ウィンドウによってGETITEM関数とGETSTR関数それぞれの取得数に差異が出ることが判明しました。例えば、GETITEM関数が1個、GETSTR関数が4個です。
これはやむを得ないですが、番号指定の自動化で何か良い方法は無いでしょうか。

SLEEP(3)
id = GETID(GET_FROMPOINT_OBJ)

n = 5  // ←これを自動化したい
//n = GETITEM(id, ITM_EDIT, 1) // ←ここの番号を変更してもダメでした
FOR i = 0 TO n - 1
  PRINT GETSTR(id, i, STR_EDIT)
NEXT

ここではSTR_EDITだけですが、それ以外の全ての種類を扱うつもりですので、STR_ACC_CELLの場合はどうしよう…と思っています。

#久々にUWSCを調べてたら仮掲示板が開設されてたんですね。ありがとうございます。またお世話になります。

No.211 2019/02/09(Sat) 09:15:53

Re: GETSTR関数の番号指定を自動化したい / satocha
getstrは種別ごとに1番目から順に取得し、空文字列が帰ってきたらそこで終わりという仕様のような気がします。
スクリプトで書けばこんな感じでしょうか。

sleep(2)
id=getid(get_active_win)
str=getAllStr(id)
sendstr(exec("notepad"),str)

function getAllStr(id)
  result=""
  for GSType=STR_EDIT to STR_ACC_CELL
    number=1
    repeat
      s=getstr( id, number, GSType )
      if s="" then break
      result=result+"種別="+GSType+",番号="+number+",文字列="+s+"<#CR>"
      number=number+1
    until false
  next
fend

No.212 2019/02/09(Sat) 23:09:28

Re: GETSTR関数の番号指定を自動化したい / Rayna
>>211 トンボ さん

 GetStr は 指定番号の要素がない場合 空文字列 ではなく EMPTY が返るのでそれを終了フラグにするといいです
 全部の要素を獲得したいなら獲得対象を For でまわせばいいと思います
 そこまでGetStrとGetItemの要素数違うのかなと思ってGetItem版書いてみましたけど
 何回か試した感じそこまで変わるかな...?って感じでした
 GetItemで要素が獲得できるのであればGetItemを使うことをおすすめします

//| No211.uws |/////////////////////////////////
Sleep(3)
Dim wid = GetId(GET_FROMPOINT_WIN)
Print "-----GetStr-----"
Print GetAllStr(wid)
Print "-----GetItem-----"
Print GetAllStrItem(wid)
Print Format("-", $F)
While Status(GetId(GET_LOGPRINT_WIN), ST_VISIBLE); Sleep(1); WEnd

Function GetAllStr(wid)
 Dim i, Str, STR_TYPE
 Dim aryStrType[] = "STR_EDIT", "STR_STATIC", "STR_STATUS", "STR_ACC_EDIT", "STR_ACC_STATIC", "STR_ACC_CELL"
 For STR_TYPE In aryStrType
  If Length(RESULT) Then RESULT=RESULT+"<#CR>【"+STR_TYPE+"】" Else RESULT="【"+STR_TYPE+"】"
  STR_TYPE = Eval(STR_TYPE)
  i=0; Repeat
   If Str<>EMPTY Then RESULT=RESULT+"<#CR>"+Str
   i = i + 1
   Str = GetStr(wid, i, STR_TYPE)
  Until Str=EMPTY
 Next
FEnd
Function GetAllStrItem(wid, varBack=FALSE)
 Dim i, ITM_TYPE
 Dim aryItmType[] = "ITM_EDIT", "ITM_STATIC", "ITM_STATUSBAR", "ITM_ACCEDIT", "ITM_ACCTXT"
 If varBack Then varBack=ITM_BACK Else varBack=0
 For ITM_TYPE In aryItmType
  If Length(RESULT) Then RESULT=RESULT+"<#CR>【"+ITM_TYPE+"】" Else RESULT="【"+ITM_TYPE+"】"
  ITM_TYPE = Eval(ITM_TYPE) Or varBack
  For i = 0 To GetItem(wid, ITM_TYPE)-1
   RESULT=RESULT+"<#CR>"+ALL_ITEM_LIST[i]
  Next
 Next
FEnd
////////////////////////////////////////////////

No.214 2019/02/10(Sun) 01:49:53

Re: GETSTR関数の番号指定を自動化したい / トンボ
>getstrは種別ごとに1番目から順に取得し、空文字列が帰ってきたらそこで終わりという仕様のような気がします
私も予想していましたが、GETSTR関数をきちんと吟味するようになったのは最近で、確証が必要でした。ありがとうございます。

> 何回か試した感じそこまで変わるかな...?って感じでした
> GetItemで要素が獲得できるのであればGetItemを使うことをおすすめします

Microsoft VisioのようなGUIの業務アプリで発生します。私も疑問に思いざっと調査した結果、GETITEM関数を実行すると、文字列の取得数が変化する模様です。
また、文字列を入力した図形オブジェクトをウィンドウから削除しても文字列が取得できるなど、不可解な現象に驚愕しました。
想像ですが、図形の文字列はただのイメージであり、ウィンドウには不可視オブジェクトが存在していて、アクティブによってそこの文字列データが変化するのではと思っています。

変化する条件を精査したいですが、業務繁忙でなかなか進まず、EMPTYを終了条件とした無限ループを暫定採用しました。

そのような経緯で返信が遅くなりましたが、ありがとうございます。

No.224 2019/02/16(Sat) 16:40:06
スマホでuwsファイルを開くには / sen
お世話になっております。

余りにもレベルが低すぎて今まで聞けなかったのですが、
みなさんはどうされていますでしょうか?

No.215 2019/02/11(Mon) 00:19:54

Re: スマホでuwsファイルを開くには / Rayna
>>215 sen さん

UWSC 5.302(最新版) の動作環境は Windows XP, Vista, 7, 8.x, 10 ですので
iOS、AndroidOS上で実行することは不可能です

どれもしたことないですが、ぱっと思いつくのはこれぐらいですかね
・PCでスマートフォンを遠隔操作できるソフトを使い、ソフトの操作を自動化する
・スマートフォンに対応した自動化ツールを使う
・スマートフォンに対応した自動化ツールを作る
・PCでスマートフォンOSのエミュを使い、エミュの操作を自動化する(既存のスマートフォンの自動化ではない)
・諦める

No.216 2019/02/11(Mon) 02:38:10

Re: スマホでuwsファイルを開くには / satocha
Raynaさんに追加して
・実行環境をWindowsマシンに構築しchromeリモートデスクトップでモバイルから接続する。
参考:  https://join.biglobe.ne.jp/mobile/sim/gurashi/remote180510/
・動作環境の対象外ですが、UWSCはUNIX系OS上のWine(Windowsアプリケーション実行環境)でもそこそこ動きます。この場合、UWSCで操作できるのは自分自身および、同じくWineで動くWindowsアプリだけです(スマホアプリは操作できません)。
参考:  https://smartasw.com/archives/29144770.html
本家:  https://wiki.winehq.org/Android
番外
・スマホのエディターアプリでuwsファイルを開き、「ああ、こう動くんだな」などと頭の中でWindowsの動作を想像して楽しむ。

No.217 2019/02/11(Mon) 08:58:45

Re: スマホでuwsファイルを開くには / sen
色々とありがとうございます。
エディターで見るだけにしておきます。

ただ、文字化けしたり、dropboxでは開けなかったりと個人的にはレベルの低いところで、オロオロしております。(^_^)

No.218 2019/02/11(Mon) 19:35:15

Re: スマホでuwsファイルを開くには / stuncloud
>文字化けしたり
uwsファイルの文字エンコーディングがShift-JISなのにスマホのテキストエディタがUTF8で開こうとしている、とかじゃないかと思います
エディタがShift-JIS対応しているのであれば文字エンコーディングをShift-JISにすることで読むことができるはずです
あと、UWSCはUTF8でもちゃんと読んでくれるのでそもそもuwsファイルをUTF8で書くという手もあります

>dropboxでは開けなかったり
dropboxアプリにはuwsファイルがテキストだとわからないので開けない…ということなんでしょうかね?
dropbox使ってないのでよくわからないです、すいません
…ので、代わりにgoogle driveアプリで見てみたところこちらでもアプリ内で参照はできなかったのでやはり拡張子のせいですかねぇ

No.219 2019/02/13(Wed) 12:04:52

Re: スマホでuwsファイルを開くには / sen
ありがとうございます。
もう少し、勉強します。

No.223 2019/02/15(Fri) 21:22:08
コマンドプロンプトの処理がすべて終了したのを判断して、コマンドプロンプトのウィンドウを終了させる方法 / せつき
コマンドプロンプトのFTPで画像ファイルをアップロードすべてしたのを、判断してコマンドプロンプトのウィンドウを閉じたいのですが良い方法が見つかりません。
コマンドプロンプトの処理が終わりのメッセージが
「221 Goodbye」と表示されます。このメッセージを判断してウィンドウを閉じる方法があればと思っていますが、どうコードを書いたらいいか分かりません。

ちなみに、コマンドプロンプトのウィンドウタイトルは下記です。

// id99=GETID("WINDOWS\system32\cmd.exe","ConsoleWindowClass")
// ctrlwin(id99,close)

No.172 2019/01/26(Sat) 11:16:24

Re: コマンドプロンプトの処理がすべて終了したのを判断して、コマンドプロンプトのウィンドウを終了させる方法 / TmShinza
「221 Goodbye」を文字ではなく、イメージとして判定するので良ければ
次のような方法があります。


//ウィンドウ識別・最前面化
id=GETID("コマンド プロンプト", "ConsoleWindowClass", -1)
//id=GETID("WINDOWS\system32\cmd.exe","ConsoleWindowClass")

//ウィンドウ相対座標・ウィンドウサイズ取得
MOUSEORG(id)
width = STATUS(id, ST_WIDTH)
height = STATUS(id, ST_HEIGHT)

//終了待ち
while CHKIMG("c:\uwsc5302\end.bmp", 0, 0, 0, width, height) = FALSE
SLEEP(3)
wend

//ウィンドウを閉じる
CTRLWIN(id, CLOSE)


最初のGETIDのウィンドウタイトルは、動作確認のため"コマンド プロンプト"
にしていますが、そちらの環境に合わせて差し替えてください。

end.bmp は、そちらの環境で実際に表示したイメージで作成する必要があります。
「221 Goodbye」を表示したコマンドプロンプトをPrint Screenキーでイメージ
取得して、ペイント等を用いて「221 Goodbye」の範囲を切り出して作成します。

注意点として、CHKIMGは画面表示を判定するので、コマンドプロンプトを最小化
した表示を隠したり、他のウィンドウが表示を遮るなどすると、動作しません。

No.179 2019/01/31(Thu) 01:27:37

Re: コマンドプロンプトの処理がすべて終了したのを判断して、コマンドプロンプトのウィンドウを終了させる方法 / TmShinza
コードに1行抜けがありました。
id=GETID(...
の次行に
acw(id)
を追加してください。

No.180 2019/01/31(Thu) 11:32:33

Re: コマンドプロンプトの処理がすべて終了したのを判断して、コマンドプロンプトのウィンドウを終了させる方法 / せつき
TmShinza様、回答ありがとうございます。
画像の読み取りはなるだけさせていたのですが、今回を機会に試してみようと思います。

No.207 2019/02/08(Fri) 12:10:29

Re: コマンドプロンプトの処理がすべて終了したのを判断して、コマンドプロンプトのウィンドウを終了させる方法 / トンボ
GETITEM関数やGETSTR関数では取得不可だったので、クリップボードを使用するしかありませんでした。それでよろしければ、下記ですね。
id = GETID("コマンド プロンプト", "ConsoleWindowClass")

SCKEY(id, VK_END) // 最下段へカーソル移動
SCKEY(id, VK_SHIFT, VK_HOME, VK_HOME) // 1行分範囲選択
SCKEY(id, VK_CTRL, VK_C) // コピー
SLEEP(1)

IF POS("221 Goodbye", GETSTR(0)) > 0
  CTRLWIN(id, CLOSE)
ENDIF

蛇足ですが、EXEC関数やKBD関数などのコマンドプロンプト操作ではなく、DOSCMD関数を使用していれば、その関数の戻り値でコマンドプロンプト内容を取得できます。
PRINT DOSCMD("とりあえずエラーを出します")

No.210 2019/02/08(Fri) 22:46:23

Re: コマンドプロンプトの処理がすべて終了したのを判断して、コマンドプロンプトのウィンドウを終了させる方法 / せつき
トンボ様、貴重なコードありがとうございます。
「221 Goodbye」が出るまで、待ってコマンドプロンプトのウィンドウを閉じたいのですが、
下記のコードだと先にスクリプトが走ってしまって期待どおりの処理ができません。
コマンドプロンプトの画面で221 Goodbyeが出るまで待って閉じる処理ができればと思ったのですが、
221 Goodbyeが出るまで待つというのを、どういうコード書けばいいのかいまいち分かりません。
ご教授頂ければありがたいです。


dim cmd1a[] = "start","C:\Users\Desktop\画像アップロード.bat"

doscmd(join(cmd1a))
id = GETID("コマンド プロンプト", "ConsoleWindowClass")

SCKEY(id, VK_END) // 最下段へカーソル移動
SCKEY(id, VK_SHIFT, VK_HOME, VK_HOME) // 1行分範囲選択
SLEEP(1)
SCKEY(id, VK_CTRL, VK_C) // コピー

IF POS("221 Goodbye", GETSTR(0)) > 0
// IF POS("C:\Users\user>", GETSTR(0)) > 0
  CTRLWIN(id, CLOSE)
ENDIF

No.220 2019/02/14(Thu) 21:50:14

Re: コマンドプロンプトの処理がすべて終了したのを判断して、コマンドプロンプトのウィンドウを終了させる方法 / Rayna
>>220 せつき さん

環境にもよりますがその書き方だと
GetId でタイトルが見つからなくてウインドウIDの獲得に失敗している気がします

私の環境では
 "cmdパス - batパス"
というウインドウタイトルで実行されましたのでそちらの環境で試行錯誤してみてください

あと 第3引数に -1 を指定して無限待ちにしないとウインドウIDの獲得漏れが起こる恐れがあります
無限待ちにしたくない場合でも余裕を持って設定してあげたほうが安全です

次に以下の処理は
 Win10からはコマンドプロンプトでCtrl+C等のショートカットキーが扱える設定がありますが
 Win10未満で実行すると失敗します
 Win10であっても恐らくデフォルトで無効だと思うので設定していなければ失敗するのではないかと思われます
  SCKEY(id, VK_END) // 最下段へカーソル移動
  SCKEY(id, VK_SHIFT, VK_HOME, VK_HOME) // 1行分範囲選択
  SLEEP(1)
  SCKEY(id, VK_CTRL, VK_C) // コピー
 代替手段として以下を使いました
  ScKey(id, VK_ALT, VK_SPACE, VK_E, VK_S) // 全選択
  ScKey(id, VK_ENTER) // コピー

書き方は違いますけどやっていることは殆ど同じです
 @cmdのウインドウID獲得
 AScKeyでコピー
 BGetStrでクリップボード獲得
 CPosで文字列の存在確認

サンプルのbatファイルの内容ではPauseを使用して意図的に停止していますが
実際のbatファイルが "221 Goodbye" を表示した後終了するのであれば
Start で実行しないほうが簡潔に済みます
その場合 "221 Goodbye" が出力されてるかを確認したい場合は
トンボさんも書かれていますがDosCmdの戻値を確認すれば大丈夫です

//| No172.uws |///////////////////////////////////////
//| Demo
 Const PATH_USERPROF_DIR = Trim(DosCmd("Echo %USERPROFILE%"))
 Const PATH_TEST_BAT = PATH_USERPROF_DIR + "\Desktop\Test.bat"
 Const PATH_CMD_EXE = GET_SYS_DIR+"\cmd.exe"
 Dim cmd1[] = "Start", PATH_TEST_BAT
 Dim wid, str="221 Goodbye", colBg=$000000

 DosCmd(Join(cmd1))
 wid=GetId(PATH_CMD_EXE+" - "+cmd1[1], "ConsoleWindowClass", -1)

 While (! PosCmd(wid, str)) And Status(wid, ST_ISID)
  Balloon("ステータス:"+str+"は出力されていません", 0, 0, 0, EMPTY, EMPTY, 0, colBg)
  Sleep(0.5)
 WEnd

 IfB Status(wid, ST_ISID) Then
  str="ステータス:"+str+"が出力されました"; colBg=$7FFF7F
 Else
  str="ステータス:ウインドウが閉じられました"; colBg=$7F7FFF
 EndIf

 Balloon(str, 0, 0, 0, EMPTY, EMPTY, 0, colBg)
 Sleep(5)
 CtrlWin(wid, CLOSE)
 Balloon()
//| Test Batch Source (PATH_TEST_BATの内容)
 //| 10秒待って 221 Goodbye を表示
 TextBlock
 @Echo Off
 Sleep 10
 Echo 221 Goodbye
 Pause
 EndTextBlock
//| Function
 //| たまに獲得漏れがあるので獲得文字列を検証してます
 Function PosCmd(widCmd, strSrc, nPos=0)
  Dim strClip, strGet; RESULT=0
  If Status(widCmd, ST_CLASS)<>"ConsoleWindowClass" Then Exit
  Repeat; strClip=GetStr(0) ; Until strClip<>EMPTY
  Repeat; SendStr(0, "") ; Until GetStr(0)=""
  ScKey(widCmd, VK_ALT, VK_SPACE, VK_E, VK_S) // 全選択
  ScKey(widCmd, VK_ENTER) // コピー
  Repeat; strGet=GetStr(0) ; Until strGet<>EMPTY
  Repeat; SendStr(0, strClip); Until GetStr(0)=strClip
  RESULT = Pos(strSrc, strGet, nPos)
 FEnd
//////////////////////////////////////////////////////

No.221 2019/02/15(Fri) 11:12:08

Re: コマンドプロンプトの処理がすべて終了したのを判断して、コマンドプロンプトのウィンドウを終了させる方法 / TmShinza
単にバッチプログラムの終了でコマンドプロンプトが閉じれば良いのならstartではなくcallを使用すれば待ち合わせ不要です。

dim cmd1a[] = "call","C:\Users\Desktop\画像アップロード.bat"
doscmd(join(cmd1a), FALSE, TRUE)

No.222 2019/02/15(Fri) 18:00:28
ヤフオク内で出品をしたいと思います / rinmoku
諸先輩の皆様、宜しくお願い致します。
UWSCで、ヤフオク内の出品の自動化をしたいと思っております。

下記は、ヤフオク内の出品URLなのですが、どうしても出来ない3点がありましてご教示願えればと思います。
https://auctions.yahoo.co.jp/sell/jp/show/submit?category=0&select=flea_market

1.「画像」のエリアをクリックして、フォルダの中の「test.jpg」を選択
   して画像を掲載したい。

2.「説明」のエリアの中に「商品説明」を記載したい。
  (又は「商品説明エリア」にフォーカスを当てたい)

3.「発送方法」を「定形郵便」にしたい。
  (下の方に「その他の発送方法」があり、そこをクリックしますと
  「定形郵便」が選択できます)

上記の3点が、どうしても出来ない状況です。
どのようにスクリプトを記述しましたら実現が可能か教えて頂けないでしょうか。

宜しくお願い致します。

No.195 2019/02/06(Wed) 10:29:13

Re: ヤフオク内で出品をしたいと思います / X+
2と3は、web記録でできると思うよ。
No.198 2019/02/06(Wed) 23:53:33

Re: ヤフオク内で出品をしたいと思います / rinmoku
X+さん

残念ながら、IeRecの記録では正常に動きませんでした。

No.200 2019/02/07(Thu) 11:02:44

Re: ヤフオク内で出品をしたいと思います / X+
2は、mouseorg、3は、iesetdataでいけそうだけど。
試して無理だったんなら、ごめんなさい。

No.201 2019/02/07(Thu) 13:52:46

Re: ヤフオク内で出品をしたいと思います / stuncloud
>どうしても出来ない3点
以外がどの程度できるのかがわからないのですが、以下が分かる前提で説明をします

・getElementById、getElementsByName、querySelectorなどで任意のエレメントのオブジェクトを取得する
・取得したエレメントオブジェクトのメソッドの実行、プロパティの値を読み書きする

分からない場合は先にこれらを学んでいただく必要があります

以下の説明をするにあたって僕は対象のページを参照しておりません(アカウント持ってないので)
なので細かい部分は自力でやっていただく必要があります

>1.「画像」のエリアをクリックして、フォルダの中の「test.jpg」を選択
>   して画像を掲載したい。


「画像」のエリアに該当するエレメントを取得してclick()を実行します
非表示かもしれませんが input[type="file"] があると思うのでそれを操作するのが確実でしょう
その後はファイル選択ダイアログが表示されると思います
それはgetid、sendstr、clkitemなどで処理してください

>2.「説明」のエリアの中に「商品説明」を記載したい。
>  (又は「商品説明エリア」にフォーカスを当てたい)


「説明」のエリアはtextareaだと推測されますので、そのvalueに説明文を代入すれば良いでしょう
フォーカスを移すのであればfocus()メソッドを実行します

>3.「発送方法」を「定形郵便」にしたい。
>  (下の方に「その他の発送方法」があり、そこをクリックしますと
>  「定形郵便」が選択できます)


「その他の発送方法」はラジオボタンでしょうか?
何にせよクリックできるものはclick()メソッドを実行してください
その後「定形郵便」の部分もclick()します
間にsleepを挟んだほうがいいかもしれません


これらはiesetdataでも実現できるかもしれない…のですが
僕はあまりiesetdataに明るくないので十分な解説ができません、ごめんなさい

No.204 2019/02/08(Fri) 11:56:41

Re: ヤフオク内で出品をしたいと思います / トンボ
アカウント問題とやりたい事が多すぎで回答困難ですね。

UWSC掲示板(更新停止中)の最下部リンクから検索ツールをDLして使用すれば、色々学べるので、今回は自力で調べた方が得策かもしれません。
http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi

そしてスクリプトを作成して仮掲示板に記載すれば、もっと的確にアドバイスできるかもしれません。

No.209 2019/02/08(Fri) 21:14:13

Re: ヤフオク内で出品をしたいと思います / rinmoku
皆様、どうも有り難うございます。

1.結局諦めです。
2.Tabキーで何とかなりました。
3.初期値のまま、どうにもなりませんでした。

勉強に励みたいと思います。
どうも有り難うございました。

No.213 2019/02/09(Sat) 23:14:11

SearchRocketbbs(掲示板DL検索)

以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
71/200件 [ ページ : << 1 2 3 4 5 6 7 8 >> ]

- HOME - お知らせ(3/8) - 記事検索 - 携帯用URL - フィード - ヘルプ - 環境設定 -

- Skin: Modern v2.0 - Author: ロケットBBS -

Rocket Board Type-X (Free) Rocket BBS