プロが教えるわが家の防犯対策術!

いつもお世話になっております。
UWSC超超初心者です。

早速質問なのですが、アプリを閉じたのに、
GETID(”アプリ”)が「-1」という現象が出てきて悩んでいます。

Windowsタスクマネージャーで「アプリ」がないことを確認しました。
何がいけないか教えていただけませんでしょうか。
ちなみにアプリが立ち上がっていなければ、戻り値は「-1」であるという
認識は合っていますでしょうか。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

完全一致というのは案外厄介です。

というのは、操作の対象となるアプリとよく似たタイトルの別アプリがいて、そちらの方が長いタイトルだと、そのままではチェックできないからです。例えば以下のようなタイトルの二つのアプリがいた場合、1.UWSをキーにしてウィンドウIDを取ってくると、どっちが引っかかるか解りません。

1.UWS -メモ帳
1.UWS -Microsoft Word

運が悪いと、自分が操作したい方じゃないアプリのIDを取ってきて、そっちに操作が行ってしまうことだってあり得ます。まさに今、それに近いことが起こっているわけですよね。

なので、今開いている全部のウィンドウIDをGETALLWIN関数で取ってきて、片っ端からタイトルを比較し、自分の正体をはっきりさせ、覚えておくといった工夫が必要かと思います。一度取得したウィンドウIDはアプリを閉じるまでずっと有効なため、変数に書いておけばいちいち調べ直す必要もありません。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

GETALLWIN関数というのがあるのですね。
それで、もう少しがんばってみます。
ありがとうございました。

お礼日時:2009/07/01 15:52

>ちなみにアプリが立ち上がっていなければ、戻り値は「-1」であるという認識



先にヘルプ読め
// 指定Window の ID を返す
戻値  そのWindowを識別するID (NGの時は -1)

この回答への補足

ご回答、ありがとうございます。

ヘルプを参照しました。
>引数
>タイトル: 識別したいWindowのタイトル (タイトルの一部分だけでもOK)

タイトルの一部分が含まれているファイルがオープンされていたため、
GETIDの戻り値は「-1」でなかったようです。

文字列が完全一致したWindowタイトルのIDを取るには、どうしたら良いでしょうか。

補足日時:2009/07/01 13:34
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q(UWSC) 「#32770」の意味わかりますか?

(UWSC)で、他人が作ったプログラムを見ています。

その中で、
GETID("タイトルの名前","#32770")
となっている箇所があります。
この"#32770"の意味がわかる方いらっしゃいますか?

教えてください。

Aベストアンサー

> この"#32770"の意味

ダイアログのクラス名

QUWSCでIEが開いているか判定する方法

UWSCでIEを操作しています。

しかし、IEは相手側のネットの環境によって動きが左右される場合があり
時々、IEが閉じてしまいます。

そこで、IEが閉じてしまったらUWSCのプログラムをストップするような処理を作りたいのですが、
そのような命令は存在するのでしょうか?

例えば、 IEが起動していればTRUE、起動していなければFALSEを返すような処理があれば良いのですが、もし知っている方がいましたらアドバイスを頂けるとうれしいです。

よろしくお願いします。

Aベストアンサー

こんにちわ

For i = 0 To GetAllWin() - 1
Ifb Status(ALL_WIN_ID[i], ST_CLASS) = "IEFrame" then
  msgbox("BBBBBBBB") // IEが有るときの処理
  exitexit
endif
Next
msgbox("AAAAAAAA") // IEが無いときの処理
exitexit


WIN XP, IE6での処理なので、動くかどうか試してください。

Q(UWSC)エクセルのセルの値を読み込むには?

UWSCで、エクセルのセルの値を読みこむ方法について
悩んでおります。

Excel = GETACTIVEOLEOBJ("Excel.Application");
val1 = Excel.ActiveSheet.range("A1").value;
を使えば、開いているエクセルのA1セルにある値を
「val1」に読み込むことができました。

今、A1~A100にある100個のリストを順々に読み込むことを
考えています。おそらくfor文を使って、以下のようにするのかな?
と思っております。
for i=1 to 100
val=○○
next
A1~A100の値を順々に読み込むにはどのようにすればいいのでしょうか?

Aベストアンサー

Pro版だったらループなんてしなくても、XLGETDATA関数を使えば一発で配列変数に取り込めます。(UWSCのヘルプにサンプルコードがあります)

Pro版ではない通常UWSCだと、以下の処理で一個ずつ値を引っ張ってくるしかないでしょう。

1)F2キーを押す
2)Shift+Homeを押す
3)Ctrl+Cを押す
4)クリップボードから値を変数に読み込む(GETSTR関数を使用)
5)Enterを押す

という一連の処理を100回繰り返すわけです。

QUWSCでMOUSEORG関数が上手く処理できません

UWSCでMOUSEORG関数が上手くいきません

ACW(GETID("無題 - メモ帳","Notepad"))
sleep(1)
KBD(VK_A,CLICK,40)

このコードだとメモ帳に入力出来ます。

しかしバックグラウンドでAと打たせるコードで
id=GETID("無題 - メモ帳","Notepad")
mouseorg(id,2)
sleep(1)
KBD(VK_A,CLICK,40)

これだと無反応です。

処理を画像認識に入れ替えたら画像は認識しますがクリック操作などは受け付けない感じです。

コードに問題ありますか?コードに問題がないとすれば環境に問題があって
それが弊害となるケースはあるのでしょうか?

【環境】
OS Windows7 sp1 64bit
使用しているツール UWSC フリーソフト 5.1.1の最新版
セキュリティーソフト ノートン360(試用版)

Aベストアンサー

以下にそのままのコードがあります
http://fluxonix.asia/kannsuu/mouseorg/

QUWSCでテキストファイルを開いて表示したい

UWSCでテキストファイルやExcelファイルを開きたいのですが、
FOPEN関数を使っても、たとえばテキストファイルを開こうと思っても開けません。

これはなぜでしょうか?
すべてのパソコンでダメでした。
OSはXPSP3、7SP1、です。
UWSCのバージョンは最新のバージョン(4.8e1)です。

UWSC.EXEのあるフォルダに、「test01.txt」を作成し、
fid=FOPEN("test01.txt",F_READ or F_WRITE)

と書いても、絶対パスで、

fid=FOPEN("C:\Users\user01\Desktop\uwsc\test01.txt",F_READ or F_WRITE)

と書いても、ダメでした。

その一行しか書いてないのがダメな原因なのでしょうか?

「C:\Users\user01\Desktop\uwsc\test01.txt」は
コマンドプロンプトやファイルを指定して実行、からは開けます。

アンチウィルスソフトは一時的にOFFにしてもだめでした。

OS(XPSP3)を再インストールして、ネットにつながず、
セキュリティソフトなしでやってみてもダメでした。

多分、自分が何か勘違いをしているのだと思いますが、
FOPEN関数は、ファイルを開いて表示するものだと思っていましたが
違うのでしょうか?

Webで検索すると、他のみなさんは開いているようなのですが・・・

ファイルのIDを取得するだけではだめで、ほかの記述も必要ということなのでしょうか?

ゆくゆくはExcelのファイルを普通に開きたいのです。
COMで開くような事例もあったので、それは試してみましたが、
Office2003のセキュリティの「中」設定が無視されて
開いてしまい、Auto_Openマクロも無視されたりで、
使いたくありません。
「中」設定のまま、「マクロを実行させるダイアログ」を
表示してExcelファイルを開きたいのです。

でもその前にということで、テキストファイルを試しにと思ったのですが
テキストファイルすら開けません。


何度かWeb検索しても一向に手がかりがつかめません。

大変すみませんが、どなたがご存知の方がいらっしゃったら、
よろしくご指導くださいませ。

UWSCでテキストファイルやExcelファイルを開きたいのですが、
FOPEN関数を使っても、たとえばテキストファイルを開こうと思っても開けません。

これはなぜでしょうか?
すべてのパソコンでダメでした。
OSはXPSP3、7SP1、です。
UWSCのバージョンは最新のバージョン(4.8e1)です。

UWSC.EXEのあるフォルダに、「test01.txt」を作成し、
fid=FOPEN("test01.txt",F_READ or F_WRITE)

と書いても、絶対パスで、

fid=FOPEN("C:\Users\user01\Desktop\uwsc\test01.txt",F_READ or F_WRITE)

と書いても、ダメでし...続きを読む

Aベストアンサー

fopenはuwscでファイルを開くための命令です。

> fid=FOPEN("test01.txt",F_READ or F_WRITE)

エラー値が返ってないのなら、

fline=FGET(fid, 1)

とかでflineに1行目が取得できるので、

print fline

なんかで表示できるはず。

--
> UWSCでテキストファイルやExcelファイルを開きたいのですが、

メモ帳(notepad.exe)やExcelでファイルを開くためには、例えば、

exec("C:\Windows\notepad.exe test01.txt")

などとして、メモ帳をアプリとして起動し、同時に引数を指定します。

QUWSCの待機コマンドについて

現在UWSCでソフトのインストール作業を自動化する必要があります。

問題になっているのが、インストールが終了するまで待機する、というコマンドがあるのかないのかが分かりません。

何秒間待機というのは分かるのですが、例えば画面が完全に開くまで待機、とかインストールが完了した時に作業を続行する、などのコマンドが必要です。

どなたかお力をお貸し下さい。ある作業が終了するまで待機するというコマンドです。以上、よろしくお願いいたします。

Aベストアンサー

そういったコマンドは無いです。

が、キチンとウィンドウを識別させていけば同様の処理は可能です。

例1.インストール完了時のウィンドウを取得する
GETID()の第3引数に-1を指定すると、指定したタイトルのウィンドウが見つかるまで待ち状態になります。

// インストールが完了するまで待つ
hogeID = GETID("インストールを完了しました。",,-1)

// 完了のウィンドウで終了のボタンを押す
CLKITEM(hogeID,"終了",CLK_BTN)
以下略


例2.ウインドウのタイトルに変化が無いので、ボタンの文字列から完了を察知し動作させる
事前にウィンドウIDを取得しておくこと。
CLKITEMは処理できなかった場合(下記ケースではボタンが押せなかったり見つからなかった場合)戻り値にFALSE
が返ってきます。

bFlg = 0
// bFlgが1になるまでループ
WHILE bFlg = 1
bFlg = CLKITEM(hogeID,"終了",CLK_BTN)
WEND



簡単な例を2つほど挙げて見ましたが、おそらくこれで解決できるでしょう。

そういったコマンドは無いです。

が、キチンとウィンドウを識別させていけば同様の処理は可能です。

例1.インストール完了時のウィンドウを取得する
GETID()の第3引数に-1を指定すると、指定したタイトルのウィンドウが見つかるまで待ち状態になります。

// インストールが完了するまで待つ
hogeID = GETID("インストールを完了しました。",,-1)

// 完了のウィンドウで終了のボタンを押す
CLKITEM(hogeID,"終了",CLK_BTN)
以下略


例2.ウインドウのタイトルに変化が無いので、ボタンの文字列から完了を察...続きを読む

QUWSCからエクセルのマクロを実行

最近UWSCというソフトを使うようになりました。
で、エクセルからSHELLをつかってUWSCを立ち上げ実行し、UWSCの最後に再度エクセルの指定したマクロを実行したいと思っています。

エクセルファイル名= AAA.xls
Excel = GETACTIVEOLEOBJ("Excel.Application" ,エクセルファイル名)
----
中略
----
Excel.Visible = True
ACW(GETID("MICROSOFT EXCEL - " + エクセルファイル名 ,"XLMAIN"),-4,-4,1288,1002,0)
CTRLWIN(GETID("MICROSOFT EXCEL"), MAX)
msgbox("完了しました。")
Excel.Application.Run エクセルファイル名 & "!Macro1"

といったようなスクリプトを組んだのですが、なにもないままUWSCが終了してしまいます。
UWSCから指定のエクセルマクロを実行する方法を教えてください。

Aベストアンサー

マクロA実行→UWSC起動→(UWSC終了)→マクロB実行
という流れですよね。
SHELLで起動した場合、起動した直後、マクロAは終了します。
これは、SHELL関数がそのままでは非同期実行だからです。
SHELL関数をマクロと同期させ、UWSC終了まで、待機させては
いかがですか?
参照URLでその方法が書かれています。

参考URL:http://www.moug.net/tech/exvba/0150034.htm

QUWSCの終了の仕方

UWSCの終了の仕方

仕事でUWSCのマクロソフトを使っています。
一箇所の部分だけ素早くクリックをループさせるマクロをしていますが、
アプリケーションを開いて使うため、ALT+1などを押しても終了することなく
アプリケーション側のALT+1の動作があるので困っています。
ただただマウスを動かして終了しようとしても、どうすることもできなくて、
結局はログオフにしてしまいました。

UWSCを好きなときに一時停止、もしくは強制終了をすることは可能でしょうか?
やり方を教えて下さい。もし、プログラムなどで終了させる方法がありましたら
初心者でも分かるように教えて頂ければ幸いです。

Aベストアンサー

ループしているマクロの中に以下の一文を書いてください
If GetKeyState(Vk_Esc) Then Break

Escキーを押すとループから抜けます。

QUWSC 非アクティブウィンドウへのキー入力

こんにちは。「MapleStory」というゲームで非アクティブ状態でもキー情報が入力されるようにしたいのですが・・・ネットでいろいろ調べたところここまでたどり着きました。

while true

if GETKEYSTATE(VK_ESC) then exit //ESCで終了

id = GETID("MapleStory","MapleStoryClass")
ifb (ID < 0)
MSGBOX("ウィンドウが見つかりません")
exitexit //見つからなければ終了
endif

hwnd = GETCTLHND(id, "MapleStoryClass")
MOUSEORG(hwnd, 2)
KBD(VK_A,DOWN,200)

wend

↑のように書けば非アクティブでもAが入力されると思ったのですが、アクティブ状態でしか入力してくれません。
どのようにしたら良いのでしょうか?どなたかご教授お願いします。ちなみに調べたところクラスはMapleStoryClassの1つだけのようでした。

Aベストアンサー

そのやり方には、重大な欠陥が二つあります。

1)
MOUSEORG関数は、座標原点を移動させるだけであって、アクティブウィンドウを切り替えたりイベントの送り先を切り替えたりする機能は持たない

2)
KBD関数が発生するキー操作イベントは必ず、アクティブウィンドウに対してのみ送信され、バックグラウンドのウィンドウにはどうやっても行かない。これはBTN関数も同様

キー入力の送り先を指定するときはKBD関数じゃなくて、SCKEY関数を使いましょう。これなら送り先のウィンドウIDを指定できます。とりあえずこんな感じ?

//hwnd = GETCTLHND(id, "MapleStoryClass")
//MOUSEORG(hwnd, 2)
SCKEY(id,VK_A)

QUWSCのIE操作でプルダウンを選択する方法

UWSCのIE操作でプルダウンを選択する方法がわからなく、
記録機能を使い試してみたのですがうまくいきませんでした。

どなたか教えていただけないでしょうか。
よろしくお願いします。


IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = true

IE.navigate("http://sportsnavi.yahoo.co.jp/")
waiting(IE)

IELINK(IE,"Jリーグ")
waiting(IE)

IELINK(IE,"日程&結果",2)
waiting(IE)


//ここがうまく行かないところです。記録で出てきたものをそのまま使用
CLKITEM(IE, "第22節", CLK_ACC)


//読み込み待ち
Procedure waiting(IE)
while IE.busy or IE.readyState<>4
Sleep(0.5)
wend
Fend

Aベストアンサー

 CLKITEM(IE, "第22節", CLK_ACC)

 IE.document.getElementsByName("select").item[2].value="index_2nd.html#j22"
 IE.document.getElementsByName("select").item[2].fireEvent("OnChange")
に変更すればいけると思います。

しかし、そもそも
 IE.navigate("http://sportsnavi.yahoo.co.jp/")

 IE.navigate("http://sportsnavi.yahoo.co.jp/soccer/jleague/2012/data/result/index_2nd.html#j22")
に変更すれば目的は達成されるような気がするのですが……
(来年度はたぶん2012が2013になるだけです。)

あと、IEの操作を記録したいのであれば、Pro版を購入してRecIEを使用したほうがいいと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング