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

タイマーのインターバルよりも、15秒早く起動させるには / MT
ある動作を、5分ごとに動かしたいのですが、スケージュール設定のタイマーでインターバルの5分毎で設定した動作よりも、15秒早く起動させるにはどうしたらいいのでしょうか?
No.5164 2018/02/28(Wed) 22:37:42

Re: タイマーのインターバルよりも、15秒早く起動させるには / トンボ
条件を明確にした上で解決策を検討するので、回答お願いします。

@15秒速く起動というのは最初の1回だけでよいでしょうか?それとも毎回でしょうか?
A毎回だとして、4分45秒間隔で起動すればよいでしょうか?それとも5分間隔でしょうか?
B起動とは、UWSC.exe起動でしょうか?それともスクリプト(*.uws)実行でしょうか?

No.5170 2018/03/01(Thu) 20:28:14
エクスプローラでフォーカス中のファイルの取得 / mt
エクスプローラをキーボードで操作して
フォーカス中のファイル内をリアルタイムで表示するツールの作成を考えていますが
可能でしょうか?

マウスであれば、
マウス下のファイル名とパスを取得することで可能と思われますが、
その様なことをキーボードの矢印キー移動で実現したいと考えています。

よろしくお願いします。

No.5142 2018/02/18(Sun) 22:12:40

Re: エクスプローラでフォーカス中のファイルの取得 / satocha
qキーでループを抜けます。
いちいちpowershellを起動しているので動きがもっさり(表示まで1秒程度必要)です。
powershell高速化の方法はしゅんさんがブログで書かれていたような記憶があります。

<以下ソース>

sendstr(0,"")
while !getkeystate( vk_q )
    fukidasi( getIconPath() )
    sleep( 0.1 )
wend
exitexit

function    getIconPath()
    id  =getid( GET_ACTIVE_WIN )
    if status( id, st_class ) <> "Progman"  and status( id, st_class ) <> "cabinetWClass"
        result  =""
        exit
    endif
    kbd( VK_ctrl, down )
    kbd( VK_c, click )
    kbd( VK_ctrl, up )
    result  =getClipPath()
fend
function    getClipPath()
    result  =powershell_STA( getClipPath.src )
    module getClipPath
textblock src
[void][reflection.assembly]::loadwithpartialname("System.Windows.Forms")
if (  [windows.forms.clipboard]::ContainsFileDropList() ){
     [windows.forms.clipboard]::getFileDropList()
}
endtextblock
    endmodule
fend
function    powershell_STA( src )
    encodedSource   =powershell( "[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes( '" + src + "' ))" )
    encodedSource   =replace( encodedSource, "<#CR>", "" )
    result  =powershell( "powershell -sta -EncodedCommand " + encodedSource )
fend

No.5143 2018/02/19(Mon) 08:40:56

Re: エクスプローラでフォーカス中のファイルの取得 / mt
satochaさん

返答ありがとうございます。
後に上記の確認を行います。

取り急ぎ、お礼まで。

No.5145 2018/02/19(Mon) 12:09:18

Re: エクスプローラでフォーカス中のファイルの取得 / satocha
まともな速度で動くよう、改良しました。こっちを使ってください。
sendstr(0,"")
thread getClipPath()
while !getkeystate( vk_q )
    fukidasi( getIconPath() )
    sleep( 0.1 )
wend
exitexit

function    getIconPath()
    id  =getid( GET_ACTIVE_WIN )
    if status( id, st_class ) <> "Progman"  and status( id, st_class ) <> "cabinetWClass"
        result  =""
        exit
    endif
    kbd( VK_ctrl, down )
    kbd( VK_c, click )
    kbd( VK_ctrl, up )
    id0 =getid( "getClipPath_hiddenDialog" )
    if status( id0, st_isid )
        result=getstr( id0, -1, STR_STATIC )
    else
        result=""
    endif
fend
procedure   getClipPath()
    uwsc_pid    =status( getid( GET_THISUWSC_WIN ), ST_PROCESS )
    src         =replace( getClipPath.src, "<PID>", uwsc_pid )
    powershell_STA( src )
    module getClipPath
textblock src
[void][reflection.assembly]::loadwithpartialname("System.Windows.Forms")
$UWSC_pid="<PID>"
do{
    if (  [windows.forms.clipboard]::ContainsFileDropList() ){
        $pathstr    =[windows.forms.clipboard]::getFileDropList()
        #[windows.forms.messagebox]::show($pathstr)
        $form=new-object system.windows.forms.form
        $form.text="getClipPath_hiddenDialog"
        $label=new-object system.windows.forms.label
        $label.text=$pathstr
        $form.controls.add($label)
        $form.formborderstyle="none"
        $form.opacity=0.01
        $form.show()
        sleep  -m 100
        $form.close()
    }
    if ( !( gwmi win32_process|?{$_.processID -eq $UWSC_pid } ) ) {
        break
    }
}while( $true )
endtextblock
    endmodule
fend
procedure   powershell_STA( src )
    encodedSource   =powershell( "[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes( '" + src + "' ))" )
    encodedSource   =replace( encodedSource, "<#CR>", "" )
    powershell( "powershell -sta -EncodedCommand " + encodedSource, true )
fend

No.5146 2018/02/19(Mon) 13:30:56

Re: エクスプローラでフォーカス中のファイルの取得 / mt
わざわざ改良までしていただき、ありがとうございました。
powershellの知識が全くないので、これを機に勉強してみます。

No.5148 2018/02/19(Mon) 20:21:19

Re: エクスプローラでフォーカス中のファイルの取得 / mt
実行時にpowershellのタスクバーボタンが連続で何度も表示されるのを非表示にする事はできないでしょうか。
powershell関数の第3引数はデフォルト(非表示)になっていますが、
タスクバーボタンには一瞬表示されるものですか?

No.5150 2018/02/20(Tue) 07:04:45

Re: エクスプローラでフォーカス中のファイルの取得 / satocha
uwscのpowershell関数は起動のオーバーヘッドが極めて大きい(1秒近い)ので、powershellを起動しっぱなしにして、UWSCと情報のやり取りを行う仕組みにしました。

その方法として目に見えないウインドウ(ドットネットのWindows.Forms.form)を開いています。

しかし、powershellでWindows.Forms.formを表示し、そのウインドウ上の情報を更新することはもう一手間かかるため、ウインドウに情報を表示したらウインドウごと落として次の情報を表示するという手抜きコーディングを行いました。

手抜きなので一見うまく行っているように見えても、タスクスイッチャーなどでみると、アイコンが点滅するような感じになってしまいます。

なので、手抜きでなくきちんと動作させたいのなら、ウインドウを1回だけ開き、そのウインドウに載せる情報を更新する手段が必要になります。

ウインドウを表示すること
情報を随時更新すること

この2つを並行動作するためには、バックグラウンドプロセスでいけそうな気がしますが、実はpowershellではUIに絡むバックグラウンド動作はできないようです。そこで、RunSpacePoolという機能(私も詳しくない)を使ってコーディングしたところ、うるさいタスクのオンオフがなくなりました。powershell windows.forms RunSpacePoolなどのキーワードで検索すれば情報が得られると思います。
参考URL
https://hinchley.net/articles/creating-a-windows-form-using-powershell-runspaces/

ただ、ソースを全部のせてしまうとせっかくの意欲をそいでしまいかねないので、宿題ということでどうでしょうか。

No.5152 2018/02/20(Tue) 16:09:19

Re: エクスプローラでフォーカス中のファイルの取得 / mt
ありがとうございます。
リンクを参考にトライしてみます。

No.5153 2018/02/20(Tue) 19:33:04

Re: エクスプローラでフォーカス中のファイルの取得 / mt
RunSpacePoolでの実現は私には難しかったため、
フォーカスしているファイルに変更があった場合だけ更新する方法で妥協しました。
とりあえずはこの動作で利用しようと思います。ありがとうございました。

sendstr(0,"")
thread getClipPath()

oldpass = getIconPath()
while !getkeystate( vk_q )
newpass = getIconPath()
if newpass = "" then
//何もしない
elseif newpass = oldpass then
//何もしない
else
fukidasi( newpass )
oldpass = newpass
endif
sleep( 0.1 )
wend
exitexit

function getIconPath()
id =getid( GET_ACTIVE_WIN )
if status( id, st_class ) <> "Progman" and status( id, st_class ) <> "cabinetWClass"
result =""
exit
endif
kbd( VK_ctrl, down )
kbd( VK_c, click )
kbd( VK_ctrl, up )
id0 =getid( "getClipPath_hiddenDialog" )
if status( id0, st_isid )
result=getstr( id0, -1, STR_STATIC )
else
result=""
endif
fend


procedure getClipPath()
uwsc_pid =status( getid( GET_THISUWSC_WIN ), ST_PROCESS )
src =replace( getClipPath.src, "<PID>", uwsc_pid )
powershell_STA( src )
module getClipPath
textblock src
[void][reflection.assembly]::loadwithpartialname("System.Windows.Forms")
$UWSC_pid="<PID>"
do{
if ( [windows.forms.clipboard]::ContainsFileDropList() ){


if ( $pathstr -eq [windows.forms.clipboard]::getFileDropList() ){
sleep -m 100
continue
}

$pathstr =[windows.forms.clipboard]::getFileDropList()
#[windows.forms.messagebox]::show($pathstr)
$form=new-object system.windows.forms.form
$form.text="getClipPath_hiddenDialog"
$label=new-object system.windows.forms.label
$label.text=$pathstr
$form.controls.add($label)
$form.formborderstyle="none"
$form.opacity=0.01
$form.show()
sleep -m 100
$form.close()
}
if ( !( gwmi win32_process|?{$_.processID -eq $UWSC_pid } ) ) {
break
}
}while( $true )
endtextblock
endmodule
fend
procedure powershell_STA( src )
encodedSource =powershell( "[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes( '" + src + "' ))" )
encodedSource =replace( encodedSource, "<#CR>", "" )
powershell( "powershell -sta -EncodedCommand " + encodedSource, true )
fend

No.5161 2018/02/28(Wed) 16:49:02

Re: エクスプローラでフォーカス中のファイルの取得 / satocha
runspaceを使った例を挙げておきます
https://plaza.rakuten.co.jp/satocchia/diary/20180220/
下の方です

No.5162 2018/02/28(Wed) 19:01:16

Re: エクスプローラでフォーカス中のファイルの取得 / mt
ありがとうございます。
確認してみます。

No.5169 2018/03/01(Thu) 08:25:29
テキストファイルを開いてExcelに張り付ける / ちーちゃん
はじめまして。
@〜Eの操作を行いたいのですが、@がうまく書けません。
@のプログラムを教えてもらえないでしょうか?
BのExcelは

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.open("C:\Users\Chisa\Desktop\書籍データ\集計.xlsx")

で立ち上がったのですが。

@Data.txtを開く
AData.txtのCtrl+Aですべてのデータを選択する。
B集計.xlsxを立ち上げ、Dataシートをアクティブにする。
CA1セルでCtrl+Vでデータを張り付ける。
DData.txtを保存せずに閉じる。
E集計.xlsxを保存して閉じる。



なお、ファイルは以下の位置に格納されてます。

C:\Users\Chisa\Desktop\書籍データ\Data.txt
C:\Users\Chisa\Desktop\書籍データ\集計.xlsx

よろしくお願いします。

No.5159 2018/02/27(Tue) 21:16:49

Re: テキストファイルを開いてExcelに張り付ける / しろまさ
// @AD を満たす
fp = "C:\Users\Chisa\Desktop\書籍データ\Data.txt"
SendStr(0, DosCmd("Type <#DBL>" + fp + "<#DBL>"))

No.5160 2018/02/28(Wed) 08:41:42

Re: テキストファイルを開いてExcelに張り付ける / ちーちゃん
しろまささん

ありがとうございます。
おかげでうまくいきました♪

No.5165 2018/02/28(Wed) 23:03:28
if〜endif間にFunctionを入れるとエラー / がき
if〜endif間にFunctionを入れるとifに対するendifを見つけられず、エラーが出ます。
このため、条件によってfunctionの内容を切り替える事ができません。解決を願います。
宜しくお願い致します。


例:
ifb 0 then
Function 音楽を入れるかキーチェック(chk_key, moji)
Result = False // 戻り値
sv_tm = GetTime()
while GetTime()-sv_tm < 5 // 5秒まで待つ
wk_sec = 5 - (GetTime()-sv_tm)
Balloon(moji+" "+wk_sec, msgx, msgy, 0, 14)
if GETKEYSTATE(chk_key) // 指定キーチェック
    Result = True // 戻り値=True
      break
endif
sleep(0.2)
wend
Balloon() // 吹出しOFF
fend
endif

No.5154 2018/02/24(Sat) 17:15:22

Re: if〜endif間にFunctionを入れるとエラー / がき
掲示板の仕様か例のコードのインデントが消えてしまったので、書き直しました。

ifb 0 then
 Function 音楽を入れるかキーチェック(chk_key, moji)
   Result = False            // 戻り値
   sv_tm = GetTime()
   while GetTime()-sv_tm < 5      // 5秒まで待つ
     wk_sec = 5 - (GetTime()-sv_tm)
     Balloon(moji+" "+wk_sec, msgx, msgy, 0, 14)
     if GETKEYSTATE(chk_key)     // 指定キーチェック
       Result = True        // 戻り値=True
       break
     endif
     sleep(0.2)
   wend
   Balloon()              // 吹出しOFF
 fend
endif

No.5155 2018/02/24(Sat) 17:18:09

Re: if〜endif間にFunctionを入れるとエラー / satocha
ヘルプに
「※ 関数はメインルーチンの後に書いてください。
  (メインルーチンは関数前までであり、関数後にメインルーチンを書いても実行されません)」
とあります。
if なんとか
 function 関数名()
 …
 fend
endif
と記述すると、「if なんとか」まで実行し、そこで実行がストップします。すると、ifの後にあるはずのendifがないよ、というエラーになるわけです。
条件分岐を行いたいなら関数の中で行ってください。
なんか、ソースを見た感じ、関数定義をコメントアウトしたいのかな、とも思います。
その場合は関数の前後にtextblock、endtextblockを入れてやるとうまく行きます。

javascriptやpowershellなんかではfunctionは関数を定義する命令文としての機能を持っているので、書かれたような構文は可能なのですが、UWSCではfunctionは関数を定義する書式のようなものだと考えるとわかりやすいと思います。
なので、関数の中に関数を定義することもできません。

No.5156 2018/02/25(Sun) 02:27:03

Re: if〜endif間にFunctionを入れるとエラー / がき
>ソースを見た感じ、関数定義をコメントアウトしたいのかな、とも思います
恐れ入りました。その通りです。別言語でデバッグ時に「if 0」の0をいじることで簡単にON、OFFする事をよくやっていたもので・・・。

ご対応頂き、ありがとうございました。

No.5157 2018/02/26(Mon) 15:04:12
Re: エクスプローラでフォーカス中のファイルの取得 / mt
実行時にpowershellのタスクバーボタンが連続で何度も表示されるのを非表示にする事はできないでしょうか。
powershell関数の第3引数はデフォルト(非表示)になっていますが、
タスクバーボタンには一瞬表示されるものですか?

No.5149 2018/02/20(Tue) 07:02:06

Re: Re: エクスプローラでフォーカス中のファイルの取得 / mt
返信先を間違えました。申し訳ありません。
削除パスを設定しておかないと削除できない?

No.5151 2018/02/20(Tue) 07:06:41
SublimeText用UWSCパッケージを更新しました / stuncloud
・GETID(GET_ACTIVE_WIN) などの補完がささっとできるようになりました
・#32770 などの#から始まる数字のクラス名を補完できるようにしました
・EXE化用のバージョン情報をスニペットにしました

近日中に配信されると思います

https://twitter.com/stuncloud/status/963357268816248833

No.5124 2018/02/13(Tue) 19:33:07

Re: SublimeText用UWSCパッケージを更新しました / satocha
ありがとうございます。
普段、サクラエディタを使っているのですが、試しに使ってみました。
キーワードや関数がいい感じにに色分けされて使いやすそうですね。

1点、質問があります。

Windowsの設定でUWSファイルの既定アプリケーションをエディタ(サクラエディタ)にして使っていますが、そのためスクリプトを実行(ビルド)しようとすると、UWSCが動かずエディタが開いてしまいます。

buildファイルを新規作成してuserフォルダに投入し、とりあえず、ビルドメニューの一覧から選んでUWSC.exeが動くようにはできたのですが、できれば、ビルドメニューの「自動」で使いたいと思います。

どこを設定すればいいでしょうか。

No.5133 2018/02/14(Wed) 16:12:00

Re: SublimeText用UWSCパッケージを更新しました / stuncloud
Userフォルダに作成したビルドファイルのなかに
"selector":"source.uwsc"
を加えてください

{
 "selector":"source.uwsc",
 "windows":
 {
  "encoding": "cp932",
  "cmd": ["C:\\UWSC\\uwsc.exe", "$file"],
  "shell":true
 }
}

こんな感じ
SublimeTextを開いている場合は一旦閉じて再実行してください

すると、uwsファイルを開いていれば Ctrl+Shift+B から自分で定義したビルド方法が(ファイル名で)表示されるはずなので、それを選んでください
以後は Ctrl+B でそのビルド方法が実行されるようになります
※ Ctrl+Shift+B で別のビルドを選ぶとその都度 Ctrl+B が変更されてしまうのには注意してください

# 実を言うと僕自身も単純にスクリプト実行だけを Ctrl+B のデフォルトにしたいんですけど、Ctrl+Shift+B の度に入れ替わってしまうのにはちょっと困ってるんですよね…対処法が知りたい

No.5135 2018/02/14(Wed) 18:47:24

Re: SublimeText用UWSCパッケージを更新しました / satocha
stuncloud さま
ありがとうございました。
一覧に表示され、うまくいきました。

No.5138 2018/02/15(Thu) 08:50:59

Re: SublimeText用UWSCパッケージを更新しました / なる
すみません、私もサブライムエディターを使用しているのですがサブライムエディターからuwscをビルド起動する方法が色々試しているのですがうまくいきません。

>Userフォルダに作成したビルドファイルのなかに
"selector":"source.uwsc"
を加えてください

下記パスにファイルを作成しています。
"C:\Sublime Text Build 3065 x64\Data\Packages\User\builds\uwsc1.sublime-build"

[uwsc1.sublime-build]ファイルに下記を入力済み。

{
 "selector":"source.uwsc",
 "windows":
 {
  "encoding": "cp932",
  "cmd": ["C:\\UWSC\\uwsc.exe", "$file"],
  "shell":true
 }
}

UWSC.exeファイルは下記のパスにあります。
"C:\Program Files (x86)\UWSC\UWSC.exe"

uwsファイルをダブルクリックするとサブライムエディターが開くようになってます。
uwsファイルのサブライムエディター上でCtrl+Shift+Bを押しても下のコンソールには何も反応はありません。

この問題はずっと前から起きていて放置していたのですが、今回同じような質問がでたので質問させて頂きました。

解決方法ないでしょうか?

No.5141 2018/02/18(Sun) 17:01:10

Re: SublimeText用UWSCパッケージを更新しました / stuncloud
3点ほど思いついたことがあるので確認してみてください

> "C:\Sublime Text Build 3065 x64\Data\Packages\User\builds\uwsc1.sublime-build"
buildsフォルダって元々あったんでしょうか?
もしかしたらST3がそのフォルダの中を見てないのかもしれないので、一つ上の階層(Userフォルダ)にビルドファイルを置いてみてください

例で書いたビルドファイル内のUWSC.exeのパスはご利用の環境にあわせて適宜書き換える必要があります
> UWSC.exeファイルは下記のパスにあります。
> "C:\Program Files (x86)\UWSC\UWSC.exe"

とのことなので
"cmd": ["C:\\Program Files (x86)\\UWSC\\UWSC.exe", "$file"]
としてください
jsonなので\はエスケープする必要があります

それと、この掲示板だと半角スペースやタブ文字でのインデントができないので例で書いたjsonのインデントを全角スペースで表現しています
> {
>  "selector":"source.uwsc",

例えばこの部分だと"selector"の前の空白が全角スペースです
もしそのままコピペされたのでしたらjsonが破損した状態ですので、全角スペース部分を半角スペースかタブ文字に置換してください
(全角スペースが可視化される日本語フォントを導入するとわかりやすくなります)

No.5144 2018/02/19(Mon) 11:27:17

Re: SublimeText用UWSCパッケージを更新しました / なる
stuncloud様、ありがとうございます。指摘して頂いた3点を全て試してたうまくいきました。
2年ぐらいずっと分からず放置していた問題が解決しました。本当にありがとうございました。

No.5147 2018/02/19(Mon) 18:05:22
capture2textを利用したOCR / かん
capture2textを利用して、指定範囲の文字を読み取る方法を教えてください。

http://mgg.wp.xdomain.jp/archives/367
こちらのサイトを参考にしてみたのですが、何も出力されず、
どうしたら良いのか分かりません…。


// スペースを含むパスは"ダブルコーテーション"で括る必要
CONST OCR = "<#DBL>C:\Program Files (x86)\" + _
"Capture2Text\Capture2Text.exe<#DBL>"

DIM CapI_STX = 1
DIM CapI_STY = 1
DIM CapI_EDX = 300
DIM CapI_EDY = 50

// Captue2Text
cmd = OCR + " " + FORMAT( CapI_STX, 1 ) + " " _
+ FORMAT( CapI_STY, 1 ) + " " + FORMAT( CapI_EDX, 1 ) _
+ " " + FORMAT( CapI_EDY, 1 )
DOSCMD( cmd )
// クリップボードから
msg = GETSTR(0)

// 結果表示
print msg

No.5139 2018/02/17(Sat) 15:51:11

Re: capture2textを利用したOCR / satocha
いくつか可能性があります。

@ちゃんと機能しているのにprint文でスクリプトが終了しているので出力が間に合わずスクリプトが終了している場合→
 スクリプト実行後にメモ帳に貼り付けると認識文字列がペーストされる →
 printのあとにsleep(10)などを入れる
  あるいはprintでなく
 sendstr(exec("notepad"),msg)

Acapture2textのexeのパスが間違っている場合(32ビットOSで使っている場合など)→
 スクリプト中のDOSCMD( cmd )を
  msgbox(DOSCMD( cmd ))に変えて出力を確認 →
  正しいパスを指定する

Bcapture2textの設定がクリップボードに出力するようになっていない →
  手動でcapture2textを起動し設定画面を確認する

No.5140 2018/02/18(Sun) 14:25:27
マウスカーソルを一時的に消す。 / YMK
マウスカーソルを一時的に消す、若しくは変更する方法はありますか?

BTN関数でスクリプトを組んだのですが、
画面上をマウスカーソルが激しく行き来し、目が疲れてしまいます。

Windows10
UWSC-PRO最新版

No.5121 2018/02/13(Tue) 09:33:02

Re: マウスカーソルを一時的に消す。 / K.N

LOCKHARDEXが使えないでしょうか?

No.5128 2018/02/14(Wed) 07:53:13

Re: マウスカーソルを一時的に消す。 / stuncloud
マウスカーソルを消すことができるソフトは存在するようです
https://www.vector.co.jp/soft/winnt/util/se493828.html
これを実際の処理の前後で操作すれば処理中のマウスカーソルを消したままにできるのではないでしょうか

実際にマウスカーソルを消すことができるのならばと、UWSCでの実装に挑戦してみました
ShowCursor()を使うのがそれっぽいので試していたのですが、自身のウィンドウ上(msgboxとかprint窓とか)でならマウスカーソルを消せたんですけど全体で消すとなるとどうしたものか見当がつきませんでした…
残念

> LOCKHARDEXが使えないでしょうか?

入力を受け付けなくさせるものなので、今回のように目障りなマウスカーソルの動きをどうにかしたいという場合は不適切でしょう

No.5129 2018/02/14(Wed) 11:36:28

Re: マウスカーソルを一時的に消す。 / koi
改めて確認してません

基本的には WindowsAPI の ShowCursor関数で
マウスカーソルを消すことができますが
強制的にカーソル非表示にしたい場合には
戻り値が0(マイナスだったかも)になるまで繰り返しコールする必要があるはずです

No.5130 2018/02/14(Wed) 13:51:55

Re: マウスカーソルを一時的に消す。 / stuncloud
これは僕宛てかな

>戻り値が0(マイナスだったかも)になるまで繰り返しコールする必要があるはずです
マイナスですね
0が起点でShowCursor(FALSE)を一回でも呼べば自身のUI上では消えます
もちろん実際には以下のようにしていました
repeat
 sleep(0)
until ShowCursor(FALSE) < 0

ただ、元々の状況のように何かしら別のアプリケーションのUIを操作している場合はカーソルが隠れるということはありませんでした
僕が調べた限りではShowCursor()の効果があるのはそれが実行されたスレッドだけ?ということなので、なるべくしてなってるようです
YMKさんの希望通りの動作を実現するには別のアプローチが必要そうです

No.5131 2018/02/14(Wed) 15:54:23

Re: マウスカーソルを一時的に消す。 / satocha
強引で汚いコードですが目的は果たせるようです。win8以降また、win7でもpowershellをv3.0以降にバージョンアップしている方はpowershell_STAでなく組み込みのpowershell関数でいけると思います。
   ※カッコ悪いミスがあったので、こっそり直しました

fukidasi("カーソルを消します。qキーで復帰します")
HideCursor()//消すときは引数trueまたは省略
while !getkeystate( vk_q )
sleep(0.01)
wend
HideCursor( false ) //戻すときはfalseで呼ぶ
//////////////////////////////////
Procedure HideCursor( flag=true )
 if flag
  powershell_STA( HideCursor.hideC )
 else
  doscmd( "echo 0|copy con CusorBlockScreenOff", true )
 endif
module HideCursor
textblock hideC
[reflection.assembly]::loadwithpartialname("System.Windows.Forms")
[reflection.assembly]::loadwithpartialname("System.Drawing")
[system.windows.forms.cursor]::hide()
$form=new-object System.Windows.Forms.Form
$scrSize =([system.windows.forms.screen]::PrimaryScreen).bounds
$form.width=$scrSize.width
$form.height=$scrSize.height
$form.opacity=0.01
$form.Topmost=$true
$form.show()
do{
gwmi win32_process|?{$_.commandline -match "copy con CusorBlockScreenOff" }|%{
$_.terminate()
$finish=$true
}
sleep -m 100
}while( !$finish )
endtextblock
endmodule
fend
function powershell_STA( src )
 encodedSource =powershell( "[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes( '" + src + "' ))" )
 encodedSource =replace( encodedSource, "<#CR>", "" )
 result =powershell( "powershell -sta -EncodedCommand " + encodedSource, true )
fend

No.5132 2018/02/14(Wed) 15:55:31

Re: マウスカーソルを一時的に消す。 / しゅん
書きました。ご参考まで。
http://d.hatena.ne.jp/junjun777/20180214/uwsc_systemcursor

No.5134 2018/02/14(Wed) 18:17:39

Re: マウスカーソルを一時的に消す。 / YMK
みなさんご返答有り難うございます。
satochaさん、しゅんさん、マウスカーソルが透明になる動作確認が取れました。

参考になるコードが沢山書かれていますので、あとは自分のスクリプトに取り込もうと思います。

有り難うございました。

No.5137 2018/02/15(Thu) 03:13:58
ランダムなタイミングで表示されるポップの処理について / pon
タイトルの通りランダムなタイミングで表示されるポップアップが常に最前面に表示されるため処理が止まってしまう事があります。
現在下記のような記載でポップアップを見つけたら終了させていますが、表示されるタイミングによってはUWSCの再起動を繰り返すだけの処理になってしまっています。

各処理の前にポップアップが存在するか?という処理を入れると安定はするのですが、他の画像認識処理が増えるのと連動して確認が必要になるため、あまり効率的ではないので避けたいのですがどのようにすると画像認識を止めることなく、ポップアップを消すことができるでしょうか?よろしくお願いします。

使用しているUWSCはフリー版です。

IFB CHKIMG("GazouA.BMP")
BTN(LEFT,CLICK,545,400,300)
 Sleep(10)
IFB CHKIMG("GazouC.BMP")
BTN(LEFT,CLICK,545,400,300)
  Sleep(10)
ENDIF
ENDIF

IFB CHKIMG("GazouB.BMP")
BTN(LEFT,CLICK,500,800,300)
 Sleep(10)
ENDIF

IFB CHKIMG("GazouD.BMP")
GetID("ポップアップタイトル","#32770", -1)
id = GetID("ポップアップタイトル", "#32770", -1)
ClkItem(id, "OK")
ELSE

POFF(P_UWSC_REEXEC, True)

No.5091 2018/02/02(Fri) 00:12:38

Re: ランダムなタイミングで表示されるポップの処理について / satocha
ポップアップダイアログを処理するだけの短いスクリプトを作り、それをUWSCのスケジュール機能で起動すればいいのでは。起動方法はスケジュール設定のタイマー画面で「指定Windowが現れた時」に"ポップアップタイトル", "#32770"を指定します。
別プロセスで実行にチェックを入れると、getid(GET_SCHEDULE_WIN )が効かなくなりますので注意を。

No.5092 2018/02/02(Fri) 04:27:49

Re: ランダムなタイミングで表示されるポップの処理について / トンボ
CHKIMG関数の処理時間とポップアップ表示頻度によって安定性が変わると思いますが、いつでもポップアップを閉じたいならsatochaさんの案を、ポップアップ表示有りの場合は最初からやり直すで良いなら下記の案ですね。(ポップアップによる画像認識失敗の防止にはなっていません。)

// 1巡のみ
REPEAT
 // GazouAとGazouC処理
 // GazouB処理
 // GazouD処理(一致した場合、CONTINUE)
 
 //ポップアップ表示の場合、[OK]を押下してループの先頭へ移動
 //(画像認識処理に失敗した可能性があるため)
 id = GetID("ポップアップタイトル", "#32770")
 IF id <> -1 THEN
  ClkItem(id, "OK")
  CONTINUE
 ENDIF
UNTIL TRUE
POFF(P_UWSC_REEXEC, True)

No.5095 2018/02/03(Sat) 06:56:41

Re: ランダムなタイミングで表示されるポップの処理について / pon
ご回答ありがとうございます。
お二方のご提示試したのですが、トンボさんから頂いたものですと画像Cの判定をしている最中にポップアップがあるとうまく行かないので、satochaさんの案採用させていただきました。


以下現在の解決までの手順です。
もし、そこはこうやったほうが楽なのに…と言う箇所ありましたら指摘お願いします。

UWSCはデフォルトでは多重起動できないと表示されてしまいましたのでNotMultiplex.INI書き換え
→UWSC.exeを複数回実行してもタスクマネージャに変化なし

UWSCにsatochaさんの案の通りタイトル、クラス等指定して実行
→目的通り表示されたポップアップが削除されました。

上に記載したとおり多重実行できないのでCMD上でuwsc.exe uwcファイル /kを実行
→起動時毎回CMDが残る、目的の動作を得るのに2回UWSCを別方法で起動しなければならないということはありますが、目的は達成できました。
(両方のuwcをGUIの方で動作させたかったのですが難しいようです)

No.5101 2018/02/04(Sun) 21:11:12

Re: ランダムなタイミングで表示されるポップの処理について / トンボ
色々試して理解を深めた方が良さそうですね。

@CMDによるUWSC多重起動?しなくても「別のプロセスで実行」するだけでよいと思います。
 余談ですが、別のプロセスで実行やTHREADを使用すれば、同一スクリプトを多重実行(並列実行)できます(複数プロセス×最大64スレッド分実行可)。また、タスクマネージャでプロセス生成/終了を確認できます。
//ユラユラな吹き出し表示(THREAD使用例)
//吹き出しは1スレッドに1つしか表示できません(1プロセスに最大64つまで)。
FOR n = 0 TO 63
 THREAD test(n) ; SLEEP(0.1)
NEXT
SLEEP(10)
PROCEDURE test(n)
 FUKIDASI(n, 30 * n, RANDOM(30)) ; SLEEP(60)
FEND

ACHKIMG関数は処理が若干重いですが、PC負荷軽減や処理高速化の方法があります。
 STATUS関数を利用して、ウィンドウの表示範囲だけをサーチ範囲とする。
 ビットマップ画像の不要な部分を削除して、画像サイズを小さくする。
 CHKIMG関数実行後はSLEEP関数で時間を置く。(SLEEP無しで実行回数が多いと、負荷が多くなります。)

No.5104 2018/02/05(Mon) 20:13:16

Re: ランダムなタイミングで表示されるポップの処理について / しゅん
この辺がわからないですね。

> UWSCはデフォルトでは多重起動できないと表示されてしまいましたのでNotMultiplex.INI書き換え
> →UWSC.exeを複数回実行してもタスクマネージャに変化なし


NotMultiplexが何か調べましたでしょうか?
関連付け等で実行する際の制限数で、そもそも本体は一つしか起動できません。
ツールの特性上、当然の制限だと思われます。


> 上に記載したとおり多重実行できないのでCMD上でuwsc.exe uwcファイル /kを実行
> →起動時毎回CMDが残る、目的の動作を得るのに2回UWSCを別方法で起動しなければならないということはありますが、目的は達成できました。


CMDをどう実行しているのかさっぱりわかりませんが、cmdのオプションで/kを指定しているのなら、ウインドウを残す指定なので、毎回CMDが残るのは当然です。
/cにすればいいんじゃ、、、という気がしますが、そもそもsatochaさんの「別プロセスで実行にチェックを入れると」の注意事項の意味がわかっているのでしょうか?
「getid(GET_SCHEDULE_WIN)」等をしないなら、あまり気にしなくて良いと思います。


> UWSCにsatochaさんの案の通りタイトル、クラス等指定して実行
> →目的通り表示されたポップアップが削除されました。


で「getid(GET_SCHEDULE_WIN)」等をしてないなら、別プロセスで実行にチェック入れてしまえば、解決ではないでしょうか。

No.5109 2018/02/06(Tue) 20:03:13

Re: ランダムなタイミングで表示されるポップの処理について / pon
トンボさん
ご回答ありがとうございます
サンプル頂きました
THREAD を使うことで処理を待たずに実行できることが確認できました。
CHKIMG関数についてはウィンドウのサイズを検出してその範囲内を検索というものはまだ実施していなかったので、試してみたいと思います。

しゅんさん
exeを複数個機動できるもの。 と思っていましたがスクリプトでしたね。
/kは実行後はUWSC本体を終了します。との説明を見ていたので、終了されては困ると使用していました。
記載としてはcmd上から
uwsc.exe XXX.uws /k の様に実行していました。
これを実行するとカーソルが点滅しているだけのcmdが機動するので、これを"起動時毎回CMDが残る"と記載していました。

No.5127 2018/02/14(Wed) 02:59:04

Re: ランダムなタイミングで表示されるポップの処理について / トンボ
上記機能を利用すれば、POFF関数による再起動が不要だったりします。あと、長時間稼働はPCパーツ寿命に影響するので、色々知っておくと便利ですね。お疲れ様でした。
No.5136 2018/02/14(Wed) 19:20:11
FOR内でPUBLIC配列に数値をいれる / れいれい
以下のようにFOR内でPUBLIC配列に数値をいれようとすると
iが定義されていませんと表示されてしまい数値を入れることができません。
どうすればよいでしょうか。

public Dim deki[100]
for i = 1 to 10
public deki[i]=i*2+1

NEXT

No.5125 2018/02/14(Wed) 00:22:06

Re: FOR内でPUBLIC配列に数値をいれる / トンボ
変数宣言時ではPublicとDimのどちらかを使い、それ以降はPublicとDimを使いません。
詳細はUWSCヘルプの<変数>を参照し、変数宣言の意味はググってみてください。

Dim deki[100]    // 変数宣言です。Public deki[100]でも可。
for i = 1 to 10
 deki[i] = i * 2 + 1 // 変数宣言ではありません。
 Print deki[i]
Next

なお、UWSC実行直前において、PUBLIC変数が先に実体を確保しますが、DIM変数はまだ実体を確保しないため、DIM変数は存在しないエラーになります。その仕様はUWSCヘルプの<変数>に記載されています。
「※ 注:PUBLIC変数の初期化はスクリプト実行前に行われます」

No.5126 2018/02/14(Wed) 01:05:55


 過去ログ(〜2017/08/24)・検索ツール


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