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

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

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
既存UWSC.INIを指定キーで指定スクリプト / tadayosi
"C:\Users\user\AppData\Roaming\UWSC\UWSC.INI"にあるUWSC.INIのタイトルの左端のキーを押すとスクリプトが起動できるようになっていますが、このキーを書き換えて指定キーで指定のスクリプトを起動させるようにしたいのですが、そもそもこの変更とかってできるのでしょうか?現状だと、下記のようになっています。

0~9:T1~t10
a~t:t11~t30


[SET]
Position=156,429
PlayHotKey=51,5
StopHotKey=52,5
RecHotKey=53,5
TrayHotKey=50,5
LunchMenuHotKey=27,0
MouseOrg=1
NotActive=0
StayOnTop=0
LogLines=2000
DefaultFont=,
TaskTrayStart=0
RecLevel=0
Cp2Clipboard=1
NotExtraMovRec=1
[LUNCHMENU]
Position=0,0
T1=
S1=

T30=
S30=
[SCHEDULE]
MaxNumber=40
WakeUp=0
Sound=0

No.202 2019/02/08(Fri) 11:50:02

Re: 既存UWSC.INIを指定キーで指定スクリプト / トンボ
UWSC.INIはあくまで設定の記録保持用です。ヘルプでのUWSC.INIの説明は下記だけなので、キー指定のための編集はしない方がいいでしょう。
>[LUNCHMENU] セクション
>  Position = x, y (ホットキーにてメニューを出す時の位置を指定、 -1,-1にてカーソル位置)


キーの指定ですが、ランチメニューの左端のキーは変更不可なので、代替案を考えました。
UWSC.exeの[ランチメニュー設定]からスクリプト設定画面を開いて、[タイトル]で「test(&t)」または「&test」と設定すれば、[T]キー押下だけでスクリプト実行できます。(もちろんタイトル名やキーを変更しても構いません。)

No.208 2019/02/08(Fri) 21:03:22
IEのウィンドウの既定サイズ変更する方法 / あらわし
IEを指定のサイズで開くスクリプトを前回やった後に、次回IEをIE = CREATEOLEOBJ("InternetExplorer.Application")で開いた際に前回の指定サイズでIEが起動してしまいます。
下記のスクリプトでサイズを指定して開いてもウィンドウのサイズは、指定サイズで開けますが既定サイズの変更にはなりません。
なにか良い方法ないでしょうか?

---------------------
w=1600
h=862
TRY
   IE = CREATEOLEOBJ("InternetExplorer.Application")
  EXCEPT
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
  ENDTRY
IE.visible = true
IE.navigate(url)
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
id =hndtoid(IE.hwnd)
ACW(id,0,0,G_SCREEN_W,h)
ctrlwin(id,close)

No.173 2019/01/27(Sun) 17:40:45

Re: IEのウィンドウの既定サイズ変更する方法 / stuncloud
IE.visible = true
を行う前に好きなサイズに変更しておけば良さそうな気がするのですが、そういうことではないのかな

前回閉じたときに保存された座標やサイズの情報を変更したい、ということであれば以下を直に書き換えれば良さそうです
IE起動時にここの値が読み取られていることまでは確認しました

HKCU\Software\Microsoft\Internet Explorer\Main\Window_Placement

ただし、REG_BINARYなので結構めんどくさいです
・WindowPlacement構造体に相当するbyte配列を準備する
・WMIで書き込む

WScript.ShellのRegWriteで書き込めたら良かったんですけど、REG_BINARはDWORD分しか書き込めないという仕様らしいので残念ながら無理でした

時間があればサンプル書けるんですが…
ヒントだけ書いておくと
・byte配列のサイズは44、encode(format(chr(0), 44), CODE_BYTEARRAY) で作るのが簡単
・実際レジストリ見るとわかると思うのですが、44だったら 0 0 0 44 じゃなくて 44 0 0 0 になります
・WindowPlacement構造体の構造は検索すれば出てきます
・WMIによるレジストリ書き込みはVBScriptとかのサンプルが結構あるのでそれを参考に

No.176 2019/01/29(Tue) 14:31:52

Re: IEのウィンドウの既定サイズ変更する方法 / satocha
powershellならバイナリ書き込みは簡単でした。
----------------------setIeDefaultRectangle.uws-----------------------
if get_uwsc_name="setIeDefaultRectangle.uws"
  fukidasi( "現在のIEのサイズと位置に注目" )
  exec( "<#dbl>C:\Program Files\Internet Explorer\iexplore.exe<#dbl>" )
  sleep( 3 )
  fukidasi( "IEのサイズと位置を変更" )
  powershell( "ps iexplore|kill" )
  sleep( 3 )
  setIeDefaultRectangle( 300, 60, 400, 700 )
  exec( "<#dbl>C:\Program Files\Internet Explorer\iexplore.exe<#dbl>" )

endif
procedure  setIeDefaultRectangle( x1, y1, x2, y2 ) //x1,y1は左上座標 x2,y2は右下座標
  src  =replace( setIeDefaultRectangle.src, "<X1>", x1 )
  src  =replace( src, "<Y1>", y1 )
  src  =replace( src, "<X2>", x2 )
  src  =replace( src, "<Y2>", y2 )
  powershell( src )
  module setIeDefaultRectangle
  textblock src
function  setIeDefaultSize( $X1, $Y1, $X2, $Y2 ){
$ORG  =(get-ItemProperty hkcu:software\microsoft\Internet` Explorer\main Window_Placement).Window_Placement
$Head28  =$ORG[0..27]
$Head28  =$Head28|%{$_.toString("x").padleft(2,"0")}
$X1    =($X1.toString("x").padleft(8,"0") -replace "(..)",'$1 ' -replace " $","" -split" ")[3..0]
$X2    =($X2.toString("x").padleft(8,"0") -replace "(..)",'$1 ' -replace " $","" -split" ")[3..0]
$Y1    =($Y1.toString("x").padleft(8,"0") -replace "(..)",'$1 ' -replace " $","" -split" ")[3..0]
$Y2    =($Y2.toString("x").padleft(8,"0") -replace "(..)",'$1 ' -replace " $","" -split" ")[3..0]
$data  =$Head28
$data  +=$X1
$data  +=$Y1
$data  +=$X2
$data  +=$Y2
$data  =$data|%{"0x$_"}
set-ItemProperty hkcu:software\microsoft\Internet` Explorer\main Window_Placement -value $data -type binary
}

setIeDefaultSize <X1> <Y1> <X2> <Y2>
  endtextblock
  endmodule
fend

No.178 2019/01/30(Wed) 13:51:44

Re: IEのウィンドウの既定サイズ変更する方法 / Rayna
>>173 あらわし さん
 COM状態で起動されたIEはウインドウサイズの復元保持はされません

 @ objIe = CreateOleObj("InternetExplorer.Application")
    COMモードで起動するのでウインドウサイズの復元保持されない
 A Exec("<#DBL>C:\Program Files\Internet Explorer\iexplore.exe<#DBL> -embedding")
   objIe = GetActiveOleObj("InternetExplorer.Application")
    COMモードで起動するのでウインドウサイズの復元保持されない
 B Exec("<#DBL>C:\Program Files\Internet Explorer\iexplore.exe<#DBL>")
   objIe = GetActiveOleObj("InternetExplorer.Application")
    通常モードで起動するのでウインドウサイズの復元保持される

 ウインドウサイズのサイズを保持したいだけなら
 ReadIni, WriteIni を使って起動時に読み込み、終了時に保存するのが簡単だと思います
 以下実装例(ModuleでまとめてCallで呼び出したほうが便利だと思います)

//| No173.uws |//////////////////////////////////
//|
Const PATH_WPOS_INI_DIR = GET_APPDATA_DIR+"\UWSC\Demo\"
Const PATH_WPOS_INI = PATH_WPOS_INI_DIR+"\WindowPosition.ini"
Dim i, objIe, widExplorer

For i = 1 To 2
 objIe = IeCreate(EMPTY, TRUE)
 Repeat; Balloon(i+"回目の実行:IEの終了を待機中 位置とサイズ変更を保持します", G_MOUSE_X+10, G_MOUSE_Y+10); Sleep(0.001); Until ! objIe.Visible
Next

widExplorer = Exec("explorer.exe <#DBL>"+PATH_WPOS_INI_DIR+"<#DBL>")
Balloon("Demo用なので使わないならフォルダごと削除してください("+PATH_WPOS_INI_DIR+")<#CR>[Pause/Break] か このウインドウを閉じる とスクリプト終了", Status(widExplorer, ST_X), Status(widExplorer, ST_Y), 0, 9)
Repeat; Sleep(0.1); Until GetKeyState(VK_PAUSE) Or (! Status(widExplorer, ST_VISIBLE))

Function IeCreate(urlNav=, boolVisible=FALSE, x=, y=, w=, h=)
 Dim pathIeExe = "C:\Program Files\Internet Explorer\iexplore.exe"
 Try
  RESULT = CreateOleObj("InternetExplorer.Application")
 Except
  Exec("<#DBL>"+pathIeExe+"<#DBL> -embedding")
  Repeat; Com_Err_Ign; RESULT=GetActiveOleObj("InternetExplorer.Application"); Com_Err_Ret; Until ! COM_ERR_FLG
 EndTry
 IeLoadPosition(RESULT, PATH_WPOS_INI)
 With RESULT
  If Length(x) Then .Left =Val(x, 0)
  If Length(y) Then .Top =Val(y, 0)
  If Length(w) Then .Width =Val(w, 800)
  If Length(h) Then .Height=Val(h, 600)
  .Visible = boolVisible
 EndWith
 If Length(urlNav) Then IeNavigate(RESULT, urlNav)
 OleEvent(RESULT, "DWebBrowserEvents2", "OnQuit", "IeEventOnQuit")
FEnd
Procedure IeSavePosition(objIe, path=)
 //| パスが指定されなければ 現在のディレクトリ\自ファイル名.ini を指定
 If ! Length(path) Then path=GET_CUR_DIR+"\"+Copy(GET_UWSC_NAME, 1, Pos(".", GET_UWSC_NAME, -1))+"ini"
 //| 指定されたパスのディレクトリがなければ作成
 Dim pathDir=Split(path, "\", TRUE); pathDir=Join(pathDir, "\", FALSE, 0, Resize(pathDir)-1)
 If ! FOpen(pathDir+"\", F_EXISTS) Then DosCmd("MkDir <#DBL>"+pathDir+"\<#DBL>")
 With objIe
  WriteIni("IE", "X", .Left, path); WriteIni("IE", "Y", .Top, path); WriteIni("IE", "W", .Width, path); WriteIni("IE", "H", .Height, path)
 EndWith
FEnd
Procedure IeLoadPosition(Var objIe, path=)
 //| パスが指定されなければ 現在のディレクトリ\自ファイル名.ini を指定
 If ! Length(path) Then path=GET_CUR_DIR+"\"+Copy(GET_UWSC_NAME, 1, Pos(".", GET_UWSC_NAME, -1))+"ini"
 If ! FOpen(path, F_EXISTS) Then IeSavePosition(objIe, path)
 With objIe
  .Left=ReadIni("IE", "X", path); .Top=ReadIni("IE", "Y", path); .Width=ReadIni("IE", "W", path); .Height=ReadIni("IE", "H", path)
 EndWith
FEnd
Procedure IeEventOnQuit()
 Dim objIe=GetActiveOleObj("InternetExplorer.Application")
 IeSavePosition(objIe, PATH_WPOS_INI)
 objIe=NOTHING
FEnd
Procedure IeNavigate(Var objIe, urlNav); objIe.Navigate(urlNav); IeBusyWait(objIe); FEnd
Procedure IeBusyWait(Var objIe); Repeat; Sleep(0.1); Until (! objIe.Busy) And (objIe.ReadyState=4); FEnd
Procedure IeQuit(Var objIe); objIe.Quit(); objIe=NOTHING; FEnd
//|
//////////////////////////////////////////////////////

No.183 2019/01/31(Thu) 13:14:08

Re: IEのウィンドウの既定サイズ変更する方法 / あらわし
stuncloud様、返信ありがとうございます。
けっこう難しいですね。
IE.visible = true
を行う前に好きなサイズに変更するのは、思いついてなかったので使わせていただきます。

No.203 2019/02/08(Fri) 11:52:58

Re: IEのウィンドウの既定サイズ変更する方法 / あらわし
satocha様、回答ありがとうございます。
希望どおりの処理ができました、助かりました。

No.205 2019/02/08(Fri) 11:58:49

Re: IEのウィンドウの既定サイズ変更する方法 / あらわし
Rayna様、回答ありがとうございます。
かなり難しい内容で読み取るだけで今の私には、精いっぱいな感じです。
何回も頂いたコードを熟読させて頂き、利用させて頂きます。

No.206 2019/02/08(Fri) 12:08:32
固定長テキストファイルを、FOPENで使用できないのでしょうか? / sen
お世話になっております。
固定長テキストファイルを、FOPENで使用できないのでしょうか?
エクセルとかでCSVに変換しないと駄目でしょうか?

ご教授の程宜しくお願い致します。

KOTB.TXT.
ND22 012BX623W 01 018

KOTB.CSV
ND22,1,2BX623W,1,18

No.196 2019/02/06(Wed) 22:27:13

Re: 固定長テキストファイルを、FOPENで使用できないのでしょうか? / sen
少し分かったのですが、
FGET(fid,i)で1行を取り出し、
copyで切り出せば良いのでしょうか?

No.197 2019/02/06(Wed) 22:44:42

Re: 固定長テキストファイルを、FOPENで使用できないのでしょうか? / Rayna
>>196 sen さん
固定長の文字列が含まれるテキストファイルはFOpenで使用できます
別に固定長じゃなくてもできます
csvも拡張子が違うだけでテキストファイルと同等なので変換しても労力は同じだと思います

>> FGET(fid,i)で1行を取り出し、copyで切り出せば良いのでしょうか?
それでも大丈夫です

No.199 2019/02/07(Thu) 00:05:08
LINEにコメントを載せる事はできませんでしょうか? / sen
いつもお世話になっております。
WINDOWS版のLINEに、コメントを載せる事はできませんでしょうか?

EXEC("C:\Users\AppData\Local\LINE\bin\LineLauncher.exe")
id = GETID("LINE", "Qt5QWindowIcon", -1)
CLKITEM(id, ItemName, CLK_LIST) // アイテム名は手動で直して!

No.189 2019/02/03(Sun) 17:54:53

Re: LINEにコメントを載せる事はできませんでしょうか? / Rayna
>>189 sen さん

「コメントを載せる」が漠然としてますが
Lineアプリに文字列を送ることができれば実現できるのではないでしょうか
ただ、UIの描画が特殊なので ClkItem関数 では難しいかもです
ショートカットキーとクライアント座標を利用すると簡単かもです

//| No189.uws |////////////////////////////////
//| WindowId 獲得
Dim widLineApp
Exec(Trim(DosCmd("Echo %LOCALAPPDATA%\LINE\bin\LineLauncher.exe")))
widLineApp = GetId("LINE", "Qt5QWindowIcon", -1)
AcW(widLineApp)

//| ログイン画面 操作例
LockHardEx(widLineApp)
 MouseOrg(widLineApp)
  Btn(LEFT, CLICK, 100, 175)
  ScKey(widLineApp, VK_SPACE, VK_BACK)
  ScKey(widLineApp, VK_CTRL, VK_A, VK_DELETE)
  SendStr(widLineApp, "example@mail.com")
  ScKey(widLineApp, VK_TAB)
  ScKey(widLineApp, VK_CTRL, VK_A, VK_DELETE)
  SendStr(widLineApp, "exampleword")
// ScKey(widLineApp, VK_RETURN)
 MouseOrg(0)
LockHardEx()

//| クライアント座標 指定例(座標は自分で調べる)
MouseOrg(widLineApp)
 MMv(100, 175) // UserName Edit
 Balloon("UserName Edit", G_MOUSE_X, G_MOUSE_Y)
 Sleep(1)
 MMv(100, 200) // Password Edit
 Balloon("Password Edit", G_MOUSE_X, G_MOUSE_Y)
 Sleep(1)
 MMv(100, 250) // LogIn Btn
 Balloon("LogIn Btn", G_MOUSE_X, G_MOUSE_Y)
 Sleep(1)
MouseOrg(0)
//|
///////////////////////////////////////////////

No.190 2019/02/04(Mon) 14:42:42

Re: LINEにコメントを載せる事はできませんでしょうか? / sen
ありがとうございます。

LINEは、左側の友達タブの順番が変わるんです。
そこの判断が、うまくいかないのです。(´・ω・`)

No.191 2019/02/05(Tue) 00:48:16

Re: LINEにコメントを載せる事はできませんでしょうか? / Rayna
>>191 sen さん

友達の順番が変わるってことですかね
どういう条件で順番が変わるのかは知りませんが

上記でできないのであれば更にChkImgを使って
bmp画像をマッチングさせて判断するとかどうでしょう

相手がプロフィールを変える可能性がある以上条件分岐にプロフ画像は使えません
友達の名前は自分で編集して指定して固定することができるので
友達の名前部分のbmp画像を作成してマッチングさせることで条件分岐できます
ただやりたい操作に何通りもパターンがある場合は割と面倒くさいです

他は名前変更のエディットボックスから現在のカーソルの表示名獲得したりとか
OCRでスクリーンショットから文字列に起こしたりとか、少し調べると非公式のapiとかあるみたいですね
色々やり方はあると思いますので色々試してみてはいかがでしょう

No.192 2019/02/05(Tue) 16:46:23

Re: LINEにコメントを載せる事はできませんでしょうか? / sen
検索で友達を絞り込めば、位置が固定できる事を発見しました。
ありがとうございました。

No.193 2019/02/05(Tue) 20:41:01
フォームにツイートを埋め込みたい / 森
こんにちは
ご無沙汰しております、森です。

フォームにツイートを埋め込みたいのですが表示されません。
アラートは表示されるので、javascriptが無効になっているようではないようです。
※stuncloudさんのツイートを例に使わせていただきました。

form = CREATEFORM("about:blank", "tweet", True)
form.Document.write(tweet)
sleep(30)
textblock tweet
<blockquote class="twitter-tweet" data-lang="jp"><p lang="ja" dir="ltr">んー、ちょっと順位微妙か? <a href="https://t.co/ilNEjLpH8s">pic.twitter.com/ilNEjLpH8s</a></p>—; すたんくらうど (@stuncloud) <a href="https://twitter.com/stuncloud/status/1089089081852583936?ref_src=twsrc%5Etfw">January 26, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<script>alert("テスト");</script>
endtextblock

自力で解決できず困っております。
お力を貸してください。

No.177 2019/01/30(Wed) 13:03:47

Re: フォームにツイートを埋め込みたい / 森
やってみたこと等
<meta http-equiv="X-UA-Compatible" content="IE=11">を付けてみる --> ダメ
webサーバーにアップして form.Navigate(URL) --> ダメ
インターネットオプションでアクティブ スクリプトを有効に --> ダメ
同-マイコンピューターのファイルでのアクティブコンテンツの実行を許可 --> 元からチェック済
同-インターネットゾーンのアクティブスクリプト --> 元からチェック済
同-保護モードを無効化 --> ダメ

No.181 2019/01/31(Thu) 11:56:30

Re: フォームにツイートを埋め込みたい / stuncloud
X-UA-Compatibleで最新のIEを指定する必要があります
参考: http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=240

htmlファイルを読ませるならそれに書いておけばいいんですが、document.writeするならこうですかね

form = CREATEFORM("about:blank", "tweet", True)

// headにmeta要素を追加
meta = form.document.CreateElement("meta")
meta.setAttribute("http-equiv", "X-UA-Compatible")
meta.setAttribute("content", "Edge")
head = form.document.getElementsByTagName("head")
head.item(0).appendChild(meta)

form.Document.write(tweet)

// 再描画
form.refresh()

No.182 2019/01/31(Thu) 12:01:53

Re: フォームにツイートを埋め込みたい / 森
stuncloudさん、いつもありがとうございます。
最新のIEは11ではなく、Edgeになるんですね。
さっそくやってみたのですが、やはりjavascript無効時の表示しかされないです。

form = CREATEFORM("tweet.html", "tweet", True)
sleep(30)

----- tweet.html -----
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="Edge">
</head>
<body>
<blockquote class="twitter-tweet" data-lang="jp"><p lang="ja" dir="ltr">んー、ちょっと順位微妙か? <a href="https://t.co/ilNEjLpH8s">pic.twitter.com/ilNEjLpH8s</a></p>—; すたんくらうど (@stuncloud) <a href="https://twitter.com/stuncloud/status/1089089081852583936?ref_src=twsrc%5Etfw">January 26, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</body>
</html>


試しにIEでやってみたら、ツイートの表示はできていましたが、COMエラーが発生しました。
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate(GET_CUR_DIR + "\tweet.html")
BusyWait(IE)
Procedure BusyWait(ie)
 repeat
  Sleep(0.2)
 until (! ie.busy) and (ie.readyState=4)
Fend

ie.busy と ie.readyState=4 でエラーが発生していて、
Document.write()なども試しましたが、COMエラーとなりIE操作ができない状態です。

何か関係あるでしょうか。

ちなみに、IEではEdgeを指定しなくてもツイートは表示されました。

No.184 2019/01/31(Thu) 13:23:17

Re: フォームにツイートを埋め込みたい / stuncloud
うまくいかない場合の再現できました

http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=5249

ここの僕のコメント(No.5249)にあるレジストリの書き込みを試してみてください
これがあるとツイートの表示もうまくいくようです
(こちらの環境ではこれがすでに有効でした)
X-UA-Compatibleも必要なくなります

ちなみに content="Edge" は最新のIEの機能を使えという意味なので
IE10が入ってる環境ならIE10、IE11があればIE11相当で動作するようになります

No.185 2019/01/31(Thu) 14:41:29

Re: フォームにツイートを埋め込みたい / 森
stuncloudさん
わざわざお時間をとって検証して頂きありがとうございます。
レジストリの書き込みを試してみたのですが、こちらでは状況変わらずでした。

絶対にフォームでという拘りは無いので、ダメならIEでも構わないのですが、、
先ほど書きましたように、comエラーでIE操作ができません(T_T)

今、 https://github.com/stuncloud/UwscWebDriver を使ってのchrome操作を勉強中です。

No.186 2019/01/31(Thu) 15:19:03

Re: フォームにツイートを埋め込みたい / stuncloud
こちらではIEでも特に問題ないですね、すいませんがちょっと原因はわからないです

UwscWebDriverはdomを書き換えるような(document.write的な)ことは現時点ではできません
chromeにローカルのhtmlファイルを読み込ませてそれを操作、ということならある程度可能です

No.187 2019/01/31(Thu) 17:31:03

Re: フォームにツイートを埋め込みたい / 森
UwscWebDriverでのChrome操作で上手くいきそうだったのですが、
onClickで書き出した要素を読み込むことができないようで断念しました。

IEでCOMエラーが出ていた問題は、IE.Navigate()の後に IE=GETACTIVEOLEOBJ()することでエラーが出なくなりました。
何故だか分からないのですが、ツイート表示の外部スクリプトが実行された時に、COMが変わってしまうようです。

しかし、ツイートをたくさん(10個)並べると、フリーズしてしまいました。
ローカルファイルではなく、HTMLをサーバーにアップロードすることでフリーズは解決しました。
同時にGETACTIVEOLEOBJ()しなおす必要もなくなりました。

ツイートリストは動的なので、サーバーとやり取りをするプログラムが必要になりましたが、それは何とかなると思います。
※実際はファイルアップロードではなく、POSTでツイートIDリストを送り、PHPで動的にHTMLを生成する予定です。

フォームでの実現が一番よかったのですが、次善策でも問題ないので一先ずOKです。

UwscWebDriverでのChrome操作も面白かったので、またの機会にじっくり挑戦したいと思います。

stuncloudさん、色々とありがとうございました。

No.188 2019/01/31(Thu) 18:07:51
SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
共通化.uwsによく使う関数を書いているのですが、SLCTBOXで各項目にキー割り当てをしたいと思っています。
項目数は使う場面によって変動します。Loop()の中の引数をどのようにして書けば変動する項目にも対応して使える関数になるのでしょうか?また、CLASS内からの呼び出しの書き方としてはCOMMON.Loop()のみで良いのかもわからない状態です。ClickButtonの関数をLoop内で使用しているので。どうかご教授願いませんでしょうか

【メイン上】

call C:\Users\user\Desktop\共通化.uws

r_fp="C:\Users\user\Desktop\a.txt"
ID_f= FOpen(a_Path_File)
res= FGet(ID_f, F_ALLTEXT)
hai_cat=split(res,"<#CR>")
fclose(ID_f)

COMMON.Loop()

iti0=SLCTBOX(SLCT_BTN or SLCT_NUM, 0, "サンプル",hai_cat)

【共通化.uws】
CLASS COMMON
PROCEDURE Loop()
// Dim hai_cat= COMMON.test_hairetu(fp)
 WHILE TRUE
  IF ClickButton(VK_a, hai_cat[0]) _
  OR ClickButton(VK_s, hai_cat[1]) _
  OR ClickButton(VK_d, hai_cat[2]) _
  OR ClickButton(VK_f, hai_cat[3]) _
  OR ClickButton(VK_j, hai_cat[4]) _
  OR ClickButton(VK_r, hai_cat[5]) THEN
BREAK
  ENDIF
  SLEEP(0.1)
 WEND
FEND


FUNCTION ClickButton(Key, Name)
 RESULT = FALSE
 // 指定キーが押下されていない場合、終了
 IF !GETKEYSTATE(key) THEN EXIT
 // セレクトボックスが非アクティブの場合、終了
 id = GETID("UWSC - " + Get_UWSC_Name, "TUslctBox_uwsc")
 IF !STATUS(id, ST_ACTIVE) THEN EXIT
 // セレクトボックスの指定ボタンをクリック
 CLKITEM(id, Name, CLK_BTN)
 RESULT = TRUE
FEND
endclass

No.105 2018/12/21(Fri) 17:44:23

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / しろまさ
昔の記憶で、押されたキーを取得する気の利いたAPIは無かったはずなので
ループチェックでいいんじゃないですかね? 少々効率化しました。 

Dim btns[] = "btn1 a","btn2 s","btn3 d","btn4 f","btn5 g"

Thread th_ChkVK(btns)
Dim re = SlctBox(SLCT_BTN or SLCT_NUM, 0, "キーを打つべし", btns)
MsgBox(re)

Function th_ChkVK(btns[])
  Dim vks[] = vk_a,vk_s,vk_d,vk_f,vk_g,vk_h,vk_j,vk_k,vk_l,vk_z,vk_x,vk_c,vk_v,vk_b,vk_n,vk_m
  Dim i, len = Length(btns), idsl = GETID("UWSC - " + Get_UWSC_Name, "TUslctBox_uwsc")
  For i = 0 To len - 1 // リセット用
    GetKeyState(vks[i])
  Next
  Repeat
    Sleep(0.5)
    IF IDtoHND(idsl) = -1 THEN Exit
    IF ! STATUS(idsl, ST_ACTIVE) THEN Continue
    For i = 0 To len - 1
      Ifb GetKeyState(vks[i])
        Result = i
        Break 2
      EndIf
    Next
    If GetKeyState(VK_ESC) Then Exit
  Until FALSE
  CLKITEM(idsl, btns[i], CLK_BTN)
FEnd

No.112 2018/12/22(Sat) 11:58:10

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
しろまさ様、今の私ではとうてい考えつけないすごいスクリプトです。私が期待した動作が完璧にできます。
こういうスクリプトを短時間で書けるしろまさ様の実力、さすがです。しろまさ様のブログいつも見させて頂いてるのですが、もっと更新していただければありがたいです、UWSCスクリプトのフレームワークの考え方とか記事にしていただければありがたいですね。たとえば、whileとrepeat until使い方の違いやbreak、Continue等。話しがそれましたが、このスクリプトありがたく使わせていただきます。

No.113 2018/12/22(Sat) 12:16:24

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / しろまさ
ホメられた^^

最近、建築の本業が忙しくて、ネタが生まれないんです。。
今見返したらこの下り、不要でしたね。すません。
If GetKeyState(VK_ESC) Then Exit

threadなのにfunctionとか
result入れてiそのまま使うとか
なんか支離滅裂に見えてきた。。後で修正します〜><

No.114 2018/12/22(Sat) 17:50:35

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
下記のスクリプトをwxe化すると指定キーを押しても、反応しなくなりました。
これは、なぜなのでしょうか?

call C:\Users\user\Desktop\ショットカット構文一覧\共通化.uws

dim hai1[]="項目1","項目2","項目3"


Thread th_ChkVK(hai1)


SELECT SLCTBOX(SLCT_BTN or SLCT_NUM, 0,"接続先選択",hai1)
CASE 0
msg=1
msgbox(msg)

CASE 1
msg=2
msgbox(msg)


CASE 2
msg=3
msgbox(msg)

SELEND


Function th_ChkVK(btns[])
  Dim vks[] = vk_a,vk_s,vk_d,vk_f,vk_g,vk_h,vk_j,vk_k,vk_l,VK_OEM_PLUS,VK_OEM_1,VK_Q,VK_W,VK_E,VK_R,VK_U,VK_I,VK_O,VK_p,VK_z,VK_X,VK_C,VK_V,VK_M
  Dim i, len = Length(btns), idsl = GETID("UWSC - " + Get_UWSC_Name, "TUslctBox_uwsc")
  For i = 0 To len - 1 // リセット用
    GetKeyState(vks[i])
  Next
  Repeat
    Sleep(0.5)
    IF IDtoHND(idsl) = 0 THEN Exit
    IF ! STATUS(idsl, ST_ACTIVE) THEN Continue
    For i = 0 To len - 1
      Ifb GetKeyState(vks[i])
        Result = i
        Break 2
      EndIf
    Next
  Until FALSE
  CLKITEM(idsl, btns[i], CLK_BTN)
FEnd

No.116 2018/12/23(Sun) 20:01:20

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
修正です。
wxe化→exe化

No.117 2018/12/23(Sun) 20:57:25

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / しろまさ
多分ここでid取れてない。検証してみて。
GETID("UWSC - " + Get_UWSC_Name

No.118 2018/12/24(Mon) 09:50:13

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
下記でいけました。ありがとうございます。
title=chgmoj(Get_UWSC_Name,".exe","")

No.119 2018/12/24(Mon) 19:04:34

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / satocha
しろまささんwrote:
> 昔の記憶で、押されたキーを取得する気の利いたAPIは無かったはずなので
> ループチェックでいいんじゃないですかね? 少々効率化しました。 

GetKeyboardState:user32で押された複数キーを取得できるみたいなので書いてみました。
https://plaza.rakuten.co.jp/satocchia/diary/201812190001/

No.120 2018/12/25(Tue) 08:42:53

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
satocha様のブログ見させて頂きました。下記のvks配列をいちいち書かなくてすむ関数と認識しているのですが、いまいち関数の使い方がわからない。ブログにコメントさせて頂きました。お時間のある時に返信頂ければありがたいです。


Dim vks[] = vk_a,vk_s,vk_d,vk_f,vk_g,vk_h,vk_j,vk_k,vk_l,VK_OEM_PLUS,VK_OEM_1,VK_Q,VK_W,VK_E,VK_R,VK_U,VK_I,VK_O,VK_p,VK_z,VK_X,VK_C,VK_V,VK_n,VK_M
---------------------
[変化する部分]
dim hai[]="1","2","3"

[希望処理]
dim hai1[]="1(a)","2(s)","3(d)"

No.121 2018/12/25(Tue) 11:08:36

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / しろまさ
> GetKeyboardState:user32で押された複数キーを取得できるみたいなので書いてみました。

ありがとうございます。にゃるほど。同時押しチェック用ですね。
buffの指定キーのみチェックすれば動作も軽快そうですね。よいページも見つけました。
http://www016.upp.so-net.ne.jp/garger-studio/gameprog/vb0142.html

なんか昔もこんな話、した気がします。

No.122 2018/12/25(Tue) 22:10:15

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / satocha
> せりあ様
あっちに書きましたが、getPushedKeys()が返すキーコード値をslctboxで使用する文字列に変換するようなテーブルをハッシュテーブルで書いておけば簡単だと思います
hashtbl KeyStrings
KeyStrings["65"]="1(a)"
以下略
slctStr=""
for KeyCode in getPushedKeys()
 slctStr=slctStr+","+KeyStrings[KeyCode]
next
SLCTBOX(SLCT_BTN or SLCT_NUM, 0,"接続先選択",split(slctStr,","))

> しろまさ様
ネタ元のページがバレ…いや、なんでもありません。

ところで、気になったのが、同じuser32にUWSCに同名関数のあるGetKeyStateがあるのですが、これをdef_dllで使うとどうなるのでしょう。
特にエラーは出ないけど、組み込み関数が動いているのか、APIが動いているのか…。

No.123 2018/12/26(Wed) 00:51:27

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / satocha
> > せりあ様
> あっちに書きましたが、getPushedKeys()が返すキーコード値をslctboxで使用する文字列に変換するようなテーブルをハッシュテーブルで書いておけば簡単だと思います


なんて書きましたが、よく考えたらピント外れでした。セレクトボックスで使うなら、複数同時押しを調べる必要はないので、組み込みのgetkeystateで十分だと思います。

No.124 2018/12/26(Wed) 02:00:45

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / stuncloud
こういうのはどうでしょ

dim list[] = "aaa","bbb","ccc"

// slctbox(SLCT_BTN, 0, "通常", list)
r = COMMON.slctbox(SLCT_BTN or SLCT_NUM, 0, "ショートカットキーあり", list)
if r > -1 then
 msgbox(list[r] + "が選択されました")
endif

module COMMON
 // COMMON.slctbox() でショートカットキーを割り当てる順番
 const slct_order = "asdfjr"

 function slctbox(type, timeout, msg, item[])
  i = 0
  for l in slct_order
   item[i] = item[i] + " (&" + l + ")"
   i = i + 1
   if i >= length(item) then
    break
   endif
  next
  result = global.slctbox(type, timeout, msg, item)
 fend
endmodule

No.125 2018/12/26(Wed) 14:52:49

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / しろまさ
> ところで、気になったのが、同じuser32にUWSCに同名関数のあるGetKeyStateがあるのですが、これをdef_dllで使うとどうなるのでしょう。
> 特にエラーは出ないけど、組み込み関数が動いているのか、APIが動いているのか…。


未検証ですが、def_dll定義したときに関数上書きされてる気がします。
Module内で標準関数が上書きできるときように。

asd.as()
Module asd
  Procedure  as()
    MsgBox( Copy() )
  FEnd
  Function  Copy()
    Result = 1
  FEnd
EndModule

No.126 2018/12/26(Wed) 15:49:20

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
stuncloud様、返信ありがとうございます。
シンプルでわかりやすく期待通りの処理がすんなりできます。
GetKeyStateを使わずにこういう処理できるんですね。
これは、すごいです。

No.127 2018/12/26(Wed) 18:49:56

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / ばい
> ところで、気になったのが、同じuser32にUWSCに同名関数のあるGetKeyStateがあるのですが、これをdef_dllで使うとどうなるのでしょう。
> 特にエラーは出ないけど、組み込み関数が動いているのか、APIが動いているのか…。


APIのGetKeyStateの動きが欲しかったので、検証してみました。
結果、組み込み関数が動いているようです。
APIのGetKeyStateを使いたい場合はModule内で宣言すると使えました。

以下テストプロ
// WindowsAPIのGetKeyStateは
// 最上位ビットが 1 のときはキーが押されていることを、0 のときはキーが押されていないことを示します。
// 最下位ビットが 1 のときはキーがトグル状態にあることを示します。
// のはずなんだけど.....結果はいかに

Const CNT = 5
Const WAIT = 3 // Sec
Def_dll GetKeyState( int ):word :user32.dll
For i = 1 to CNT
  SlctBox(0 , WAIT, "組込み " + i + "/"+ CNT + "回目 Aを押下しますか?")
  ans = GetKeyState(VK_A)
  MsgBox(i + "/" + CNT + "回目の結果 $" + Replace(Format(ans, 2,-1), " ", "0") + " " + ans )
Next
//////////////
For i = 1 to CNT
  Slctbox(0 , WAIT, "Module " + i + "/"+ CNT + "回目 Aを押下しますか?")
  ans = Api.GetKeyState(VK_A)
  msgbox(i + "/" + CNT + "回目の結果 $" + Replace(Format(ans, 2,-1), " ", "0") + " " + ans )
Next
Exit

Module Api
  Def_dll GetKeyState( int ):word :user32.dll
Endmodule

No.131 2018/12/27(Thu) 21:44:38

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
slctboxでのキー割り当てをSLCT_LSTでもしたいのですが、stuncloud様の回答頂いた関数でやってもうまくいきません。SLCT_BTNだとうまくいきます。なにか良い方法ないでしょうか?質問ばかりですみません。

call C:\Users\user\Desktop\ショットカット構文一覧\00_共通化.uws

IE = GETACTIVEOLEOBJ("InternetExplorer.Application")

r_fp1="C:\Users\user\カテゴリー.txt"

hai1 = COMMON.test_hairetu(r_fp1)

iti=slc_key(SLCT_LST or SLCT_NUM, 0, "カテゴリー選択",hai1)

select iti
case 0
iti=2
case 1
iti=3
case 2
iti=4
selend


 function slc_key(type, timeout, msg, item[])
 const slct_order = "asdfjkl;gh:qweruiopzxcvnm,."
  i = 0
  for l in slct_order
   item[i] = item[i] + " (&" + l + ")"
   i = i + 1
   if i >= length(item) then
    break
   endif
  next
  result = global.slctbox(type, timeout, msg, item)
 fend

No.142 2019/01/01(Tue) 12:47:49

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / せりあ
stuncloud様、以前回答頂いたコードで一つ分からないのがあります。

下記のresult = global.slctbox(type, timeout, msg, item)のglobal.の意味が分かりません。これは、どういう役割を果たしているのでしょうか?

dim list[] = "aaa","bbb","ccc"

// slctbox(SLCT_BTN, 0, "通常", list)
r = COMMON.slctbox(SLCT_BTN or SLCT_NUM, 0, "ショートカットキーあり", list)
if r > -1 then
 msgbox(list[r] + "が選択されました")
endif

module COMMON
 // COMMON.slctbox() でショートカットキーを割り当てる順番
 const slct_order = "asdfjr"

 function slctbox(type, timeout, msg, item[])
  i = 0
  for l in slct_order
   item[i] = item[i] + " (&" + l + ")"
   i = i + 1
   if i >= length(item) then
    break
   endif
  next
  result = global.slctbox(type, timeout, msg, item)
 fend
endmodule

No.174 2019/01/28(Mon) 13:48:12

Re: SLCTBOXで各項目にキー割り当ての関数の引数について / stuncloud
globalはモジュールの外の関数を明示して使うためのものです
この場合COMMONモジュール内でslctboxという関数を定義しているため、ただslctboxと書くとCOMMON内の自作関数が呼ばれてしまいます
ここでは自作関数ではなく元々のslctboxが呼びたいのでglobalを付けています
ヘルプの スクリプト-スクリプト構文-MODULE化 にちょこっと書かれてますね
globalを付けて呼ぶのはわりとレアケースなので普段は気にしなくても良いやつです

あとすいません、過去の質問見逃してました

> slctboxでのキー割り当てをSLCT_LSTでもしたいのですが、stuncloud様の回答頂いた関数でやってもうまくいきません。SLCT_BTNだとうまくいきます。なにか良い方法ないでしょうか?

リストだと無理ですね
&に続けてアルファベットなどを書いておくとそれがショートカットキーとして機能する、というボタンなどの性質を利用したものなのでそういった性質のないリストでは使えないです
その場合は他の方が回答されているような方法を取るしかないと思います

No.175 2019/01/29(Tue) 12:18:53

SearchRocketbbs(掲示板DL検索)

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

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

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

Rocket Board Type-X (Free) Rocket BBS