106405
UWSC 仮 掲示板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオン
動作不具合での質問の場合には環境を表記(OS,バージョン等)
タイトルは内容を表し、内容はネットゲーム関係禁止
自身でコードを書く気の無いナマケモノは特に質問禁止
失敗作でもコードを投稿すること(具体性の無い質問は無視される可能性大)

UWSC掲示板 が復活することを祈り、それまでの繋ぎとして。
環境設定[s7777777]

chrome legacy window について / 藍
いつもお世話になれます。
chormeを利用してスクリプトを実行しています。
?@ id = GETID(" 商品マスタ - Google Chrome", "Chrome_WidgetWin_1", -1)
?A SLEEP(1)
?B CLKITEM(id, "商品マスタ取込", CLK_BTN)

たまにこのスクリプトが動かなくなり調べたら
?Bの部分が
  CLKITEM (id,"chrome legacy window",CLK_BTN)

"chrome legacy window"になってしまうのかわかりません。
なぜなのかわかりません。ご存じの方ご教授よろしくお願いします。

No.1638 2023/10/12(Thu) 08:07:16

Re: chrome legacy window について / stuncloud
何を聞かんとしているのかがわかりません
ボタン名が"商品マスタ取込"ではなく"chrome legacy window"になっている場合があるということですか?であれば以下で解決でしょう

if ! CLKITEM(id, "商品マスタ取込", CLK_BTN) then // 「商品マスタ取込」ボタン押下に失敗した場合
 CLKITEM (id,"chrome legacy window",CLK_BTN) // 「chrome legacy window」ボタンを押す
endif

> "chrome legacy window"になってしまうのかわかりません。
これが再現するコードを書いておく必要があります
確実に再現せずとも例えばそれを100回もやれば再現する場合がある、といった形でも構いません (その場合はその旨を明記してください)
少なくとも実際に現象が発生しているところを見れなければ誰も回答できないでしょう

> chrome legacy window
で調べたところAccessibilityに関連しているかもしれない?というようなことがわかりましたが詳細は不明です
また、Chrome上に「Chrome Legacy Window」というコントロールが存在しており、このコントロールのウィンドウクラスは「Chrome_RenderWidgetHostHWND」となっていておそらくボタンではありません
また、getitemでITM_ACCCLKやITM_ACCCLK2を見てみましたが該当するボタンは見つかりませんでした

No.1639 2023/10/12(Thu) 16:18:17

Re: chrome legacy window について / 藍
ご返事ありがとうございます。

この処理は2年ぐらい何事もなく動いていました。
1ヶ月前ぐらいから不安定な状態になりました。

なかなか再現しないのですがたまたま出たときに
UWSCの記録でその部分を作り直そうとした結果
  CLKITEM (id, "商品マスタ取込", CLK_BTN)
      ↓
  CLKITEM (id,"chrome legacy window",CLK_BTN)
  になっているのがわかりました。
  
ちなみにchormeの起動は
  path="C:\ProgramFiles\Google\chrome\Application\chrome.exe"
id = Exec(path + " --force-renderer-accessibility -process-per-tab --new-window " + URL)

もうちょと調べてみます。

No.1640 2023/10/12(Thu) 22:41:41

Re: chrome legacy window について / stuncloud
操作記録で出てきたコードなんですね
Chrome Legacy Windowに対してAccessibility ControlやUI Automation(UWSCで言うところのACCやUIA)によるアクセスができなくなるという不具合が潜在的なバグとしてかなり古いバージョンの頃からあったようです
おそらく現象再現時に記録を行った際、ACCまたはUIAによる検出ができずウィンドウ全体のコントロール名がボタン名として入ってしまったのではないか?と考えています、確証はないですが
多分なんですけどこうなったらChromeを再起動すべき(※)で、
- 「商品マスタ取込」ボタンのクリックに失敗した場合
- 事前にITM_ACCCLKで検査して該当ボタンの有無を確認してないことがわかった場合
などの状況であればChromeを終了しスクリプトを再実行するのが良いのではないでしょうか

※ 滅多に生じない現象のようなのでChromeを再起動することで解消するのではないか?という予想に基づいてます、実際はわかりませんが

No.1641 2023/10/13(Fri) 01:49:43

Re: chrome legacy window について / 藍
ご返事ありがとうございます。
助かります。
事前にITM_ACCCLKで検査して該当ボタンの有無を確認してないことがわかった場合
の処理を追加してみます。
今後ともよろしくお願いします。

No.1642 2023/10/13(Fri) 19:39:10
カテゴリーファイルの結合とカテゴリーに紐づいたサブカテゴリーの結合ファイル作成 / nanai
カテゴリーごとに、カテゴリー紐づいたサブカテゴリーを結合ファイルとして作成するスクリプトですが、カテゴリーが増えるごとに変数を作成していく必要があり、これを変数を作成しなくとも、結合ファイルを作成できるようにしたいです。

もっと、汎用的に使えるスクリプトに編集したいのですが、私の力だとアイデアが思いつきません。先輩方、ご教授願いませんでしょうか?

[InitSet.txt] // カテゴリー名
StringControl
RegularExpress
Array

StringControlには、サブカテゴリーがない為、空欄。
[InitSet_sub.txt] // カテゴリー名:サブカテゴリー名
StringControl:
RegularExpress:基本
RegularExpress:Executeメソッド
RegularExpress:Replaceメソッド
RegularExpress:Testメソッド
RegularExpress:SubMatches
Array:配列
Array:連想配列

[Summary.txt]
------------------StringControl
------------------RegularExpress
------------------Array
------------------------------------------------------
------------------StringControl
サブカテゴリーありません
------------------
内容1

---------------------
内容2

---------------------
内容3


---------------------
内容4

---------------------

------------------StringControl
------------------------------------------------------
------------------RegularExpress
\$ 基本
\$ Executeメソッド
\$ Replaceメソッド
---------------------
\$ 基本
---------------------

基本内容1
---------------------
基本内容2
---------------------
\$ 基本
---------------------
\$ Executeメソッド
---------------------
Executeメソッド内容

---------------------
\$ Executeメソッド
---------------------
\$ Replaceメソッド
---------------------
Replaceメソッド内容1


---------------------
Replaceメソッド内容2


---------------------
\$ Replaceメソッド
---------------------

------------------RegularExpress
------------------------------------------------------
------------------Array
\$ 配列
\$ 連想配列
---------------------
\$ 配列
---------------------
// 配列の内容
---------------------
\$ 配列
---------------------
\$ 連想配列
---------------------
連想配列

// 連想配列の内容

---------------------
\$ 連想配列
---------------------

------------------Array
------------------------------------------------------


[スクリプト]
// 「 InitSet.txt 」には、カテゴリー名の入力があること、「 InitSet_sub.txt 」には、カテゴリーに紐づいたサブカテゴリーの入力があることが前提

dn = replace(GET_UWSC_NAME, ".uws", "")

dp = GET_CUR_DIR + "\" + dn + "\Catogory\"

r_fpInitSetFile = GET_CUR_DIR + "\" + dn + "\InitSet.txt"
r_fpInitSetSubFile = GET_CUR_DIR + "\" + dn + "\InitSet_sub.txt"

w_fp = GET_CUR_DIR + "\" + dn + "\Summary.txt"
extension = ".uws"

dim AllCategorySubCategoryStrCancat
dim SubCategoryName1,SubCategoryName2,SubCategoryName3 // ここを増やしていかないといけない
dim SubCategorysAlltext

Delimiter1 = ":"

dim Category_arr[-1],SubCategory_arr[-1] // Category_arr:カテゴリー,SubCategory_arr:サブカテゴリー

RowDelimiterArr2Create(r_fpInitSetSubFile,Delimiter1,Category_arr,SubCategory_arr)


comment = ""
separate = comment + "------------------"
CategorySeparate = comment + "------------------------------------------------------"


InitSetFileStr = ReadALLText(r_fpInitSetFile) // catogory_メイン

delimiter2 = "<#CR>"
emptyflg = true
InitSet_Category_arr = split(InitSetFileStr, delimiter2, emptyflg) // InitSetにある各カテゴリー名を配列取得

dim SeparateCategoryStr

for aa in InitSet_Category_arr
SeparateCategoryStr = SeparateCategoryStr + separate + aa + "<#CR>"
next


for i = 0 to Length(InitSet_Category_arr) - 1

for x = 0 to length(Category_arr) - 1 // 各CatororyのSubCategoryを格納_現在3つカテゴリーまでしか機能しない

if InitSet_Category_arr[i] = Category_arr[x] then
if Category_arr[x] = InitSet_Category_arr[0] then // ここを増やしていかないといけない
SubCategoryName1 = SubCategoryName1 + SubCategory_arr[x] + "<#CR>"
elseif Category_arr[x] = InitSet_Category_arr[1] then
SubCategoryName2 = SubCategoryName2 + SubCategory_arr[x] + "<#CR>"
elseif Category_arr[x] = InitSet_Category_arr[2] then
SubCategoryName3 = SubCategoryName3 + SubCategory_arr[x] + "<#CR>"
elseif Category_arr[x] = InitSet_Category_arr[3] then
endif
endif
next
next


SubCategoryNameArr1 = split(SubCategoryName1, "<#CR>") // ここを増やしていかないといけない
SubCategoryNameArr2 = split(SubCategoryName2, "<#CR>")
SubCategoryNameArr3 = split(SubCategoryName3, "<#CR>")


dim utuwa1,utuwa2,utuwa3

if length(SubCategoryNameArr1) <> 1 then // ここを増やしていかないといけない
for z1 in SubCategoryNameArr1
utuwa1 = utuwa1 + "\$ " + z1 + "<#CR>"
next
endif

if length(SubCategoryNameArr2) <> 1 then
for z2 in SubCategoryNameArr2
utuwa2 = utuwa2 + "\$ " + z2 + "<#CR>"
next
endif


if length(SubCategoryNameArr3) <> 1 then
for z3 in SubCategoryNameArr3
utuwa3 = utuwa3 + "\$ " + z3 + "<#CR>"
next
endif



if length(SubCategoryNameArr1) <> 1 then // ここを増やしていかないといけない
SubCategoryName1 = utuwa1 + separate + "<#CR>"
endif


if length(SubCategoryNameArr2) <> 1 then
SubCategoryName2 = utuwa2 + separate + "<#CR>"
endif


if length(SubCategoryNameArr3) <> 1 then
SubCategoryName3 = utuwa3 + separate + "<#CR>"
endif



all = SubCategoryName1 + "#" + SubCategoryName2 + "#" + SubCategoryName3

arr1 = split(all, "#")


for i = 0 to Length(InitSet_Category_arr) - 1
r_fp = dp + InitSet_Category_arr[i] + extension // 各カテゴリーファイルフルパス
str = ReadAllText(r_fp) // 各カテゴリーファイル内容
str99 = trim(arr1[i])
if str99 = "" then
SubCategorysAlltext = SubCategorysAlltext + separate + InitSet_Category_arr[i] + "<#CR>サブカテゴリーありません<#CR>" + separate + "<#CR>" + str + "<#CR>" + separate + InitSet_Category_arr[i] + "<#CR>" + CategorySeparate + "<#CR>"
else
if i = 0 then
SubCategorysAlltext = SubCategorysAlltext + separate + InitSet_Category_arr[i] + "<#CR>" + str + "<#CR>" + separate + InitSet_Category_arr[i] + "<#CR>" + CategorySeparate + "<#CR>"
else
SubCategorysAlltext = SubCategorysAlltext + separate + InitSet_Category_arr[i] + "<#CR>" + str + "<#CR>" + separate + InitSet_Category_arr[i] + "<#CR>" + CategorySeparate + "<#CR>"
endif
endif
next


AllCategorySubCategoryStrCancat = SeparateCategoryStr + CategorySeparate + "<#CR>" + SubCategorysAlltext

WriteALLText(w_fp,AllCategorySubCategoryStrCancat)

procedure RowDelimiterArr2Create(r_fp,Delimiter,var arr1[],var arr2[]) //ファイル内行ごと「:」区切って配列を2つ,dim arr1[-1],arr2[-1]で利用可能_Array_17
str = ReadAlltext(r_fp)
dim i = 0
d = GetRow(r_fp)
fid = fopen(r_fp,F_READ)
resize(arr1, d - 1)
resize(arr2, d - 1)

for y = 1 to d
str = fget(fid,y)
arr1[i] = token(Delimiter,str)
arr2[i] = token(Delimiter,str)
i = i + 1
next

fclose(fid)
fend


Procedure WriteAlltext(w_fp,str) //テキストを全て書込(上書き)_FileControl_5
fid = FOpen(w_fp, F_READ or F_WRITE8 or F_NOCR)
FPut(fid, str, F_ALLTEXT)
FClose(fid)
FEnd


Function ReadAlltext(r_fp) //テキストを全て読込_FileControl_5
Dim fid = FOpen(r_fp)
Result = FGet(fid, F_ALLTEXT)
FClose(fid)
FEnd


Function GetRow(r_fp) //ファイルの行数取得_パス_FileControl_6
fid=fopen(r_fp,F_READ)
row_total_number=fget(fid,-1)
Result=row_total_number
fclose(fid)
Fend

No.1635 2023/10/10(Tue) 10:35:23

Re: カテゴリーファイルの結合とカテゴリーに紐づいたサブカテゴリーの結合ファイル作成 / stuncloud
サブカテゴリ名を入れる変数を可変長配列にすれば良いでしょう
UWSCの場合は連想配列が扱いやすい可変長配列なのでそれを利用します
コードを見る限りInitSet_Category_arrのインデックスがそのまま連想配列のキーとして使えそうなのでそのようにしています
詳細はリンク先を参照してください

https://gist.github.com/stuncloud/365be2619ddbaf1e913bc756aedb093b

わかりやすいようにdiffとしています
赤い部分が元のコードを修正して削除されたもの
緑が新しく書き加えられたコードです
コピペする場合は行頭の - や + に注意してください

可能な限り元のコードと同等の動きになるように書いているつもりですが、実際の動作に関しては未検証です

No.1636 2023/10/10(Tue) 13:49:26

Re: カテゴリーファイルの結合とカテゴリーに紐づいたサブカテゴリーの結合ファイル作成 / nanai
ありがとうございます、完璧に私の期待通りのスクリプトになりました。
これで、カテゴリーが増えた時に、変数を用意する必要がなくなりました。
連想配列の使いこなせるようになりたいと思いました。

No.1637 2023/10/11(Wed) 17:27:28
pos / seen
お世話になります。

文字列に指定文字列があるにもかかわらず、以下の1つ目が”ありません”、となります、理由がわかる方、ご教授ください、また、この場合、どう解決すればいいのでしょうか。

OK=1
京都="りんご表示"

ifb OK=1 AND POS("表示",京都)
print "あった"
else
print "ありません"
endif

ifb POS("表示",京都)
print "あった"
else
print "ありません"
endif

ifb OK=1 AND POS("りんご表示",京都)
print "あった"
else
print "ありません"
endif

No.1631 2023/10/03(Tue) 07:19:33

Re: pos / リキュール
京都="りんご表示"

print POS("表示",京都)

表示は4文字目なので結果は4が返ります。

No.1632 2023/10/03(Tue) 09:34:38

Re: pos / しゅん
// リキュールさんの回答で良い気もしますが、気が向いたので私も回答してみます。

// ヘルプにあるように、POS関数は見つかった場合1以上の数値が返ります。
// 見つかったか判定したいのであれば、0より大きいか比較すればOKです。

OK=1
京都="りんご表示"

// A)
ifb OK=1 AND POS("表示",京都)>0
  print "あった"
else
  print "ありません"
endif

// B)
ifb POS("表示",京都)>0
  print "あった"
else
  print "ありません"
endif

// C)
ifb OK=1 AND POS("りんご表示",京都)>0
  print "あった"
else
  print "ありません"
endif



// 以下余談

// 前提
// UWSCのANDやORは、論理演算ではなく、ビット演算です。
// IF文は、0以外で真、0で偽が実行されます。

// 実際評価。まずはC)
// 「OK=1」は、TRUEに評価され、内部値は1です。
// 「POS("りんご表示",京都)」は、1が返ります。元のように「>0」がなくても1のままAND演算に入ります。
// 1と1のANDは、1です。
// 元の場合でも、「あった」になります。

// 次B)
// 「POS("表示",京都)」は、4が返ります。
// 元の場合でも、4は0以外なので、「あった」です。

// 最後A)
// 上記B)、C)より、1と4のANDになります。
// ビット演算なので、それぞれ二進数3桁で表現すると、1は「001」、4は「100」で、ANDの結果は「000」です。
// これは0なので、「ありません」になります。

// おまけ
// ではここで京都の内容を「りんごす表示」にしてみましょう。

京都="りんごす表示"

ifb OK=1 AND POS("表示",京都)
  print "あった"
else
  print "ありません"
endif

// はい、お分かりかと思いますが、「りんごす表示」にした場合「POS("表示",京都)」は5が返ります。
// 5を二進数3桁で表現すると「101」、1とANDの結果は「001」になるため、「あった」になります。

// ま、こんなおまけはどうでも良くて、あるか見たいなら「>0」をつける、としてください。

No.1633 2023/10/04(Wed) 18:08:01

Re: pos / seen
詳しくわかりやすい解説ありがとうございます、りんごす!。
このおまけの内容がなかったら、私レベルの頭では理解できていませんでした。
今までの不具合の原因がすべて解決できました、本当にありがとうございました。

No.1634 2023/10/05(Thu) 21:11:18
UWSCRに関し質問 / ROM
「UWSC掲示板」が無くなりましたが、現在も”UWSC Pro”を使って、自動化の恩恵を受けている者です。
最近になって”UWSCR”の存在を知りました。
私が調べた範囲では、UWSCとの互換性を持ちながら様々な機能アップが行われ、継続して機能アップが期待できるようです。

しかし・・・・
UWSC Proの持つ、”RecIE”、"UDebug”、”Uws2Exe”、に相当する機能は、用意されているのか判然としません。

お手数ですが、情報をいただけたら幸いです。よろしくお願いします。

No.1627 2023/09/16(Sat) 16:47:46

Re: UWSCRに関し質問 / stuncloud
いずれも今のところありません

> RecIE
ChromeやMSEdgeを操作記録モードで起動し、操作をスクリプトとして出力する仕組みの実装は検討しています

> UDebug
Language Serverを実装予定なので、それに対応したVSCode拡張もリリースする予定があります
デバッガも可能であれば対応したいと考えています

> Uws2Exe
現時点では実現方法がわからないので保留中ですが、機能としては実装したいものではあります
実現に関する情報をお持ちの方がいたら教えていただきたいです

これらについては実装の方針や時期が決まり次第githubのwikiやdiscordで情報を公開していきます
https://github.com/stuncloud/UWSCR/wiki

No.1628 2023/09/16(Sat) 17:45:50

Re: UWSCRに関し質問 / ROM
ご回答ありがとうございます。

私としては、UDebug相当を希望しますが、UWSCの資産を引き継ぎながら、更に発展させるには大変な努力・知識がなければできないことであることは、容易に推察できます。

私は、高齢者で、ボケ防止として、毎日パソコンをつついています。
UWSCは大変重宝しています。
それと、stundcloudさんのページからは多くの知識をいただきました。ありがとうございます。

⇒”リブート”、良いですね。元気をいただきました。重ねてお礼申しあげます。

No.1629 2023/09/17(Sun) 10:00:52

Re: UWSCRに関し質問 / stuncloud
当面の目標はUWSCRのスクリプト実行機能を完成させバージョン1.0.0をリリースすることです
なので、先に挙げられた機能はどちらかといえば優先度の低いものとなるので、実装もまだ先になりそうです
気長にお待ちいただけたらと思います

No.1630 2023/09/17(Sun) 11:38:43
BusyWaitのSLEEPについて / とし

少し気になったので質問させてください。
下記のようなマクロでサイトを開くまでの BusyWait(IE) に SLEEP(0.001) を指定しているのですが、
この数値が早いことで相手のサーバに負荷がかかるということはないですよね?
私の理解ではIEの読み込み進行具合を確認しているだけで、例えばこの頻度で相手サーバーに残りデータはいくつか問い合わせているような処理はしてないですよね。


//////////

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("https://www.yahoo.co.jp/")
BusyWait(IE)


//------
Procedure BusyWait(ie)
REPEAT
SLEEP(0.001)
UNTIL !IE.busy AND IE.readystate = 4
Fend

//////////

No.1624 2023/09/09(Sat) 21:56:24

Re: BusyWaitのSLEEPについて / stuncloud
BusyWait関数に関してはその理解で問題はありません
しかし、未だにIEを使い続けていることは問題であると断言できます
速やかに使用を中止すべきです

No.1625 2023/09/09(Sat) 23:45:02

Re: BusyWaitのSLEEPについて / とし
> BusyWait関数に関してはその理解で問題はありません
> しかし、未だにIEを使い続けていることは問題であると断言できます
> 速やかに使用を中止すべきです


ご回答ありがとうございます。
「IEを使い続けていることは問題」とはサポート終了していることによりセキュリティー的危険という意味でしょうか?
セキュリティー的にしっかりしたごく一部のサイトでしか使わないのでその点では大丈夫です。

No.1626 2023/09/10(Sun) 17:07:14
7-ZIPによる圧縮 / ROM
お世話になります。

複数のファイルを”7-ZIP”で、パスワード付きZIP圧縮したいと思っています。

ZIP圧縮に関して、ググったところ、以下を見つけました。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11165033606?__ysp=dXdzYyBaSVDlnKfnuK4%3D

中身の技術的な意味は全くチンプンカンプンですが、とりあえず成功しました。

しかし、7-ZIPの例は見当たりませんでした。

パスワードを付ける時、間違ったパスワードを付けてしまう危険性もあり、できることなら複数のファイルを所定の名前で圧縮し、更にパスワードを設定するところ までを希望しますが、どなたか知見のある方からご教授いただければ幸いです。

よろしくお願いします。

No.1617 2023/08/21(Mon) 10:22:02

Re: 7-ZIPによる圧縮 / RAM
ちんぷんかんぷんかも知れません。

sevenzip = "C:\Program Files\7-Zip\7z.exe"
pw = "password"
zip = "C:\hoge\fuga.zip"
txt_1 = "C:\hoge\fugafuga.txt"
txt_2 = "C:\hoge\piyopiyo.txt"

cmd = "<#DBL>@7z@<#DBL> a -p@password@ <#DBL>@zipfile@<#DBL> <#DBL>@sourcefile_1@<#DBL> <#DBL>@sourcefile_2@<#DBL>"

cmd = replace(cmd, "@7z@", sevenzip)
cmd = replace(cmd, "@zipfile@", zip)
cmd = replace(cmd, "@sourcefile_1@", txt_1)
cmd = replace(cmd, "@sourcefile_2@", txt_2)
cmd = replace(cmd, "@password@", pw)

doscmd(cmd)

No.1622 2023/08/23(Wed) 17:20:33

Re: 7-ZIPによる圧縮 / ROM
RAMさん

DOSCMDを利用する方法が簡単ですね!!
うっかりしていました!
ありがとうございました!!m(__)m

No.1623 2023/08/24(Thu) 17:42:58
JAVAアプリの制御について / みつ
お世話になります。

JAVAアプリから文字を取得したり、カーソルに文字を送ったりしたいのですが、
GETSTR や SENDSTR が動きませんので原因を教えて頂けないでしょうか。


JAVAアプリは、mcframeで名前の値は以下となっていました。
Java HotSpot(TM) 64-Bit Server VM
Java(TM) SE Runtime Environment


JavaAccessBridgeとJRE(32bit) はインストール済で、試したコードは以下になります。

//1
id = GETID("メイン-mcframe","SunAwtFrame",-1)
dim name[] = "ボタン", "リスト/コンボ", "タブ", "メニュー", "ツリービュ", "リストビュ", "エディト", "スタテック文字", "ステータスバー", "ツールバー", "ACCクリック可", "ACCテキスト", "ACCエディト"
dim kid[] = ITM_BTN, ITM_LIST, ITM_TAB, ITM_MENU, ITM_TREEVEW, ITM_LSTVEW, ITM_EDIT, ITM_STATIC, ITM_STATUSBAR, ITM_TOOLBAR, ITM_ACCCLK, ITM_ACCTXT, ITM_ACCEDIT
for x = 0 to Length(name)-1
print name[x]
for n in GETITEM(id, kid[x], -1)
print " " + n
next
print
next


//2
While True
  x = G_MOUSE_X; y = G_MOUSE_Y
  id = GETID(GET_FROMPOINT_WIN)
  ofx = x - STATUS(id, ST_CLX)
  ofy = y - STATUS(id, ST_CLY)
wks = PosACC(id, ofx, ofy)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_NAME)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_VALUE)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_ROLE)
  wks = wks + "<#CR>" + PosACC(id, ofx, ofy, ACC_STATE)
wks = wks + "<#cr>" + "x="+ofx+", y="+ofy
  Fukidasi(wks, x+10, y+10, 3)
  Sleep(0.5)
Wend


//3
id = GETID("メイン-mcframe","SunAwtFrame",-1)
SendStr(id, "111", 1, True, True)
SendStr(id, "222", 3, True, True)
SendStr(id, "444", 4, True, True)


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

No.1621 2023/08/22(Tue) 17:09:23
UWSCRでのWeb関連操作について / レフト
どうにもわからなかったので教えてください。
私がquerySelectorの理解を出来ていないという事なのかも知れないのですが、
UWSCRで以下を実行すると検索キーである「hoge」が保持されず検索ボタンだけクリックされてしまいます。
バージョンはuwscr 0.12.1 chkimg です。

---
chrome = BrowserBuilder(BC_CHROME)_
.profile("C:\uwscr\chrome\profile1")_
.start()

chrome = BrowserControl(BC_CHROME)

tab = chrome.tabs[0]
tab.navigate("https://www.yahoo.co.jp/")

document = tab.document
document.querySelector("input[type='search']").value = "hoge"
document.querySelector("button[type='submit']").click()
---

ブラウザ上で「hoge」が入力されている事は視認できるのですが、
検索ボタンをクリックするとクリアされてしまうイメージです。

なお、UwscWebDriverを使用して、UWSCで以下を実行した場合は
問題なく「hoge」を検索する事ができました。

---
call UwscWebDriver.uws
driver = WebDriver.Chrome()

driver.Navigate("https://yahoo.co.jp/")
driver.FindElement( By.Tag("input") + By.Attribute("type", "search") ).SetValue("hoge")
driver.FindElement( By.Tag("button") + By.Attribute("type", "submit") ).Click()
---

No.1618 2023/08/21(Mon) 13:17:25

Re: UWSCRでのWeb関連操作について / stuncloud
開発者ツール(F12)で同様のことをしても再現するので、Yahoo側の仕様でinputのvalueを変更しただけだとだめっぽいですね
なので手入力を偽装するためにkbd関数を使うようにしたところうまく検索できました

document = tab.document
search = document.querySelector("input[type='search']")
search.value = "" // 検索ボックスを事前に空にしておく
search.focus() // 検索ボックスをフォーカス
kbd("hoge") // hogeを入力
document.querySelector("button[type='submit']").click()



UwscWebDriverのSetValueが成功するのは入力方式が異なるからですね
具体的にどのようなことをしているのかわかりませんが、WebDriverがキーボードをエミュレートしてるなど手入力に近いことをしているのではないかな
WebDriverの動作に近いことができないか検討してみます
ちなみにBRSetDataという関数もありますが、現状これもvalue値を直接書き換えてるだけなので同じ現象が起きます

No.1619 2023/08/21(Mon) 13:56:38

Re: UWSCRでのWeb関連操作について / レフト
stuncloudさん

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

>Yahoo側の仕様でinputのvalueを変更しただけだとだめっぽいですね
サイトの仕様だったのですね。
実際にはYahooで検索したい訳ではなく他サービスサイトへのログインの利用目的でした。
複数サイトで確認されたので、そういったパターンは多いのかも知れませんね。

今後の実装もご検討いただけるとのこと、ありがとうございます。

なお例示いただいたフォーカスした後のkbdで直接入力した場合は
どちらのサイトでも問題なく動作することは確認いたしました。

No.1620 2023/08/21(Mon) 15:32:41
フォルダの選択されたファイル名の取得について / みつ
お世話になります。

フォルダの選択されたファイル名の取得をしようと以下を試してみましたが、両方取得できませんでしたので原因を教えて頂けないでしょうか?


?@
id = GETID("C:\")
wks = GETSLCTLST(id, 3)
while wks <> ""
 print TOKEN("<#TAB>", wks)
wend


?A
const LVM_GETNEXTITEM = $1000 + 12;
const LVIS_SELECTED = $0002;
DEF_DLL SendMessageA(HWND, LONG, LONG, LONG):LONG:user32.DLL

Dim ID = exec("Explorer.exe /E,/Select, C:\")
MsgBox("リストコントロールからアイテムを追加選択してください");

Dim hWnd = GetCtlHnd(ID, "SysListView32");
Dim n = GetItem(id, ITM_LSTVEW);
HashTbl hashFileList;

Dim i;
For i = 0 to n-1
  Dim nIndex = GetSelectedItemList(hWnd, i-1);
  IfB (-1 <> nIndex) Then
    hashFileList[nIndex] = ALL_ITEM_LIST[nIndex];
  EndIf
Next

For i = 0 To Length(hashFileList)-1
  print hashFileList[i, HASH_VAL];
Next

Function  GetSelectedItemList(hWnd, nIndex = -1)
  Result = SendMessageA(hWnd, LVM_GETNEXTITEM, nIndex, LVIS_SELECTED);
FEnd


?B
また、VBAの FileDialog を UWSC で使用できるか教えて頂けないでしょうか?

Dim FileDialog As Object
Set FileDialog = Application.FileDialog(msoFileDialogFilePicker)

' ファイル選択ダイアログの設定
With FileDialog
.AllowMultiSelect = True ' 複数のファイルを選択できるようにする
.Show ' ダイアログを表示


よろしくお願いします。

No.1614 2023/08/10(Thu) 12:29:51

Re: フォルダの選択されたファイル名の取得について / stuncloud
# Explorer上で選択されているファイルのパスを得る

Shell.Applicationが一番確実じゃないかな


e = GetExplorer(title)

for selected in e.document.SelectedItems()
 print selected.path
next

// Explorerのタイトルと部分一致するものを探す
function GetExplorer(title)
 sh = createoleobj("Shell.Application")
 for window in sh.windows()
  if pos(title, window.LocationName) > 0 then
   result = window
   exit
  endif
 next
 result = NOTHING
fend

# FileDialogを使う

Excel VBAってことですよね?
ならExcelから使えます

const msoFileDialogFilePicker = 3

excel = createoleobj("Excel.Application")
// excel.visible = TRUE

// excel非表示でもファイル選択ダイアログは表示される
dlg = excel.FileDialog(msoFileDialogFilePicker)
dlg.AllowMultiSelect = TRUE
if dlg.Show() then
 for item in dlg.SelectedItems
  print item
 next
endif

excel.quit()

No.1615 2023/08/10(Thu) 15:05:50

Re: フォルダの選択されたファイル名の取得について / みつ
stuncloud 様

Shell.Application も FileDialogも 完璧でした。
ありがとうございました。

FileDialogのUWSC置き換えも分かり易くありがとうございました。
助かりました。

No.1616 2023/08/10(Thu) 16:54:22
(No Subject) / Nox
MOUSEORGでウィンドウIDを指定し、KBD関数を使ってAndroidエミュを操作していたのですが、エミュのバージョンを上げたらKBDを受け取らなくなってしまいました。
ACWにするときちんとKBDを実行し動作しました。
何が原因でしょうか?

No.1606 2023/07/18(Tue) 22:23:06

Re: / stuncloud
MORG_DIRECTを使っていたということですか?
(mouseorg(id, 2)という書き方をしている場合も該当します)

MORG_DIRECTの場合はおそらくキー送信に該当するメッセージをPostMessage等で直接送信しているので、対象ウィンドウ側でそのメッセージを処理していなければ動作しません
バージョンアップに伴い該当メッセージを処理しなくなったのが原因ではないでしょうか

> ACWにすると
というのは意味がわかりませんがMORG_DIRECTでなければおそらくSendInput等でキー送信が行われるため正常に動作するのだと思います

MORG_DIRECTが使えるかどうかは対象ウィンドウ次第なので動かない場合は使うことを諦めましょう

No.1607 2023/07/18(Tue) 23:25:18

Re: / Nox
お返事ありがとうございます。

そうです!mouseorg(id, 2)でコードを書いてます。

idについてなのですが、エミュをemu1、emu2、emu3、のように3つ起動しているのですが、
mouseorg(GETID("emu1"), 2)と記載するとKBDが機能せず、
mouseorg(GETID("emu"), 2)と記載すると3のうち一つだけKBDが機能して反応してくれます。
この場合でもPostMessage?は対応していないのでしょうか?
また、ランダムに1つだけ反応するのはなぜでしょうか?

ACW(GETID("emu1"))やctrlwin(GETID("emu1"), ACTIVATE)はきちんとKBD反応しました。

No.1608 2023/07/19(Wed) 01:52:25

Re: / stuncloud
> ランダムに1つだけ反応するのはなぜでしょうか?
getidのウィンドウタイトル指定は部分一致なので1〜3いずれかのIDが取れてるのでしょう
> この場合でもPostMessage?は対応していないのでしょうか?
それでkbdが使える理由はわかりませんが、そこに解決の糸口があるかもしれんですね
emu = getid("emu")
emu1 = getid("emu1")
emu2 = getid("emu2")
emu3 = getid("emu3")
とやってstatusやidtohndで違いを調べてみては?

メッセージが処理されるかどうかは対象ウィンドウ次第と書きましたがウィンドウというのは何もトップレベルだけに限らないんですよね
第1引数にウィンドウIDだけでなくHWNDも渡せるんですけど、これはgetctlhndと併用してメッセージが処理できる子ウィンドウに対して直接キー情報を送信することもできるということです
そのような子ウィンドウが見つかれば希望通りMORG_DIRECTができるでしょうからがんばって探してみてください
子ウィンドウはgetallwin(id)を使うことで網羅できます

> ACW(GETID("emu1"))やctrlwin(GETID("emu1"), ACTIVATE)はきちんとKBD反応しました。
これの意味が全くわかんないんですが、acwやctrlwinをしとけばMORG_DIRECTが効くようになったという話?ですか???
ならそれをやればいいんじゃ????

No.1609 2023/07/19(Wed) 08:30:24

Re: / Nox
> emu = getid("emu")
> emu1 = getid("emu1")
> emu2 = getid("emu2")
> emu3 = getid("emu3")
> とやってstatusやidtohndで違いを調べてみては?

IDTOHND(GETID("emu"))を各々してPrintした所、すべて別の数字の羅列が返ってきました。

> 第1引数にウィンドウIDだけでなくHWNDも渡せるんですけど、これはgetctlhndと併用してメッセージが処理できる子ウィンドウに対して直接キー情報を送信することもできるということです
HWNDというのは先ほどの数字の羅列でしょうか?

> 子ウィンドウはgetallwin(id)を使うことで網羅できます
getallwinでそれらしい物として、sub,subWinというものがあったのですが、説明して下さっているコードの書き方が分からず、書き方を教えて頂きたいです。

> これの意味が全くわかんないんですが、acwやctrlwinをしとけばMORG_DIRECTが効くようになったという話?ですか???
> ならそれをやればいいんじゃ????

出来ればバックグラウンドで処理したいので、アクティブにして処理するのは避けたいのです。

No.1610 2023/07/19(Wed) 14:29:18

Re: / stuncloud
acw云々はフォアグラウンドで通常のkbdって話だったんですね

> 書き方を教えて頂きたいです。
けっこうヒントはあったと思うのですが…

getallwin(id)で子ウィンドウのidが取れるということは、それらの子idを使ってmouseorg(子id, MORG_DIRECT)が試せるということです
で、kbdができる子ウィンドウがもし見つかればstatus(子id, ST_CLASS)でそいつのクラス名がわかるわけです
それを行う調査用スクリプトを別に書きましょう

そしてその調査でクラス名が得られたならば、あとは本番スクリプトでそのクラス名を使いgetctlhndでウィンドウハンドル(HWND)を取得しmouseorgすれば良い、という話です

というわけでがんばってみてくださいね!

No.1611 2023/07/19(Wed) 17:34:49

Re: / Nox
Nox,Qt5QWindowIconのように同一名のIDが複数返ってきた場合、IDを個別に指定する方法などありますか?
同じものが33個ほどあります。

No.1612 2023/07/20(Thu) 15:33:26

Re: / stuncloud
ヘルプを読め
No.1613 2023/07/20(Thu) 17:55:29

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

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

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

Rocket Board Type-X (Free) Rocket BBS