AutoHotkey スレッド part24 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1名無しさん@お腹いっぱい。 転載ダメ©2ch.net (ワッチョイ 997d-+Qhn)
垢版 |
2017/02/15(水) 18:04:32.01ID:kshCKhXn0
!extend:checked:vvvvv:1000:512と次スレを立てる際は1行目に記入してください

■配布元
http://ahkscript.org/download/

■前スレ
AutoHotkey スレッド part23
http://potato.2ch.net/test/read.cgi/software/1470936221/

■日本語解説等
AutoHotkey Wik
http://ahkwiki.net
AutoHotkeyを流行らせるページ(ミラー)
http://ahk.xrea.jp/ (不調時は http://hdd.s300.xrea.com/ahk/ )
AutoHotkeyJp(過去ログdatあり)
http://sites.google.com/site/autohotkeyjp/
Autohotkey日本語ヘルプ(chmファイル)
http://www6.atwiki.jp/eamat/
Autohotkey専用うpろだ
http://ux.getuploader.com/autohotkeyl/
簡易スクリプト掲示板
http://pastebin.com/

■派生版
IronAhk (.NET製、クロスプラットフォーム)
https://github.com/polyethene/IronAHK
AutoHotkey.dll (真のマルチスレッド対応など, AHKLの派生)
http://www.autohotkey.com/board/topic/39588-autohotkeydll/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀
Rock54: Caution(BBR-MD5:669e095291445c5e5f700f06dfd84fd2)
2017/04/07(金) 14:17:02.23ID:U10Py5ktM
複雑に考えすぎ

Ifwinexist,google keep
winactive,google keep
else
run, google keep
2017/04/08(土) 06:19:53.50ID:lPOi3z/r0
>>268

あ・・・こんなにシンプルでいいんですね・・
試してみますー
2017/04/10(月) 04:54:18.79ID:65Jr/DKV0
お尋ねします。
ok 2が動作しないのは何故でしょうか?。
出来れば複数のファイルを指定したいので、2の方法で動作させたいです。
宜しくお願いします。

;HAGE.ahk

IfExist, %A_WorkingDir%\HAGE.ahk
msgbox, ok 1

If FileExist("%A_WorkingDir%\HAGE.ahk")
msgbox, ok 2
2017/04/10(月) 05:39:51.17ID:n286rxrH0
特定のウィンドウにひたすら右クリックを押下し続けるという単純なscriptについて質問させて下さい
AHK Version 1.1.24.04 / 32bit

以下コード
+F12::
DetectHiddenWindows,On
ControlClick,,ahk_class ANY WINDOW,,R,1,D NA
Return

windowは一意のものとして指定すれば確かに押しっぱなしになり動作はします
しかしウィンドウ内から起動した場合、非アクティブになると止まってしまいます
非アクティブから起動すると動作していて、アクティブにしてから非アクティブにするとやはり止まってしまいます

この状態を回避して、ウィンドウのアクティブ状態に関わらずひたすら動作させ続けることは可能ですか?
2017/04/10(月) 07:17:13.48ID:2r5ZTOwf0
>>271
関数など()の中は式
式で文字列として扱う場合は”で囲う

式では変数が展開される
変数を展開する場合は%で囲う
式で%で囲うと二重展開になる(中身の中身)

× ("%A_WorkingDir%\HAGE.ahk") → %A_WorkingDir%\HAGE.ahk
○ (A_WorkingDir "\HAGE.ahk") → 変数の中身\HAGE.ahk

>>272
> しかしウィンドウ内から起動した場合、非アクティブになると止まってしまいます
> 非アクティブから起動すると動作していて、アクティブにしてから非アクティブにするとやはり止まってしまいます

対象がなんだか分からないが非アクティブでは操作できないと言いたいのかな?
非アクティブでは操作を受け付けないアプリがあるので
キーが送れるほかのコマンドでも駄目なら諦めてください

ControlSend, ahk_parentの有無
PostMessage
2017/04/10(月) 11:07:01.39ID:n286rxrH0
>>273
そうではなくてアクティブ→非アクティブとフォーカスを移動した際に停止してしまうということです
アクティブで動作→OK
非アクティブで動作→OK
非アクティブからアクティブでの動作→OK
アクティブから非アクティブでの動作→NG
ということです
OKの状態は"右クリックが押下され続けている"です

対象は別になんでも良いです例えばahk_exe chrome.exeとでもして下さい
2017/04/10(月) 11:28:14.17ID:RegwrnVO0
判定がデリケートなのか知らないけどウィンドウ切り替えやアプリによってはうまく機能しない事はあるよ
ウィンドウ切替時にディレイを挟んでControlを再習得してフォーカス合わせればいいんじゃないかな
2017/04/10(月) 12:27:03.22ID:65Jr/DKV0
>>273
有難うございます!出来ました。
If FileExist(A_WorkingDir "\HAGE.ahk")
msgbox, ok 2
2017/04/10(月) 12:28:56.32ID:ZYn2qmjn0
>272みる限りじゃコントロールもPOSも指定してないし
アクティブ切替えに伴いControlFocusも切り替わってるんじゃないの?
それかNA外したらどうなる?

きちんとコントロールかPOS指定
できれば対象Controlのハンドル取得して ahk_id %controlHWND% すると成功率は上がるかも
http://ahkwiki.net/Window#Control.E7.B3.BB.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89.E3.81.A7.E3.81.AE.E3.82.A6.E3.82.A3.E3.83.B3.E3.83.89.E3.82.A6.E3.83.8F.E3.83.B3.E3.83.89.E3.83.AB.E3.81.AE.E7.9B.B4.E6.8E.A5.E6.8C.87.E5.AE.9A
2017/04/13(木) 03:32:18.71ID:Q5j/vPyKa
IfinString,var,4

これを”4を含む”、ではなく”4に完全一致”にしたいのですがやり方がわかりません。
どうしたら完全一致にできますか?
2017/04/13(木) 04:10:15.79ID:18RHOudN0
>>278
これではダメなのかい?

var := "4"

If (var = "4") {
msgbox, 変数の中身は 4
} else {
msgbox, 4 じゃない
}
280名無しさん@お腹いっぱい。 (アウアウエーT Sae3-qdxO)
垢版 |
2017/04/13(木) 05:00:34.98ID:Q5j/vPyKa
>>279
おお、それでいけますた。
ありがとうございます!
2017/04/13(木) 06:18:30.87ID:o5nrbqsD0
>>280
もう解決してるし、希望の動作をすればどんな書き方でもいいんだけど
↓一応こんなコマンドもある。列挙できるので完全一致の候補が複数あるときはこれを使うといい
http://ahkwiki.net/Ifin

完全一致
If var in 4
部分一致
If var contains 4
282名無しさん@お腹いっぱい。 (アウアウエーT Sae3-qdxO)
垢版 |
2017/04/13(木) 07:17:28.04ID:Q5j/vPyKa
>>281
列挙で使えるのはいいですね。
勉強になります。
2017/04/13(木) 10:31:28.83ID:o6na/omi0
v1.1.25.00でhotkeyコマンドが実行中でも変更したり無効にできるようになってたのか
2017/04/15(土) 08:19:36.47ID:QH+TqQ4Q0
object:=object()
object["hoge","髭"]:="hige"
object["hoge","禿"]:="hage"
object.Remove(["hoge","禿"])

こういう配列のキーを削除したいのですが失敗してしまいます
どういう書き方をすればいいんでしょうか?
2017/04/15(土) 09:22:22.47ID:H9uISqAv0
>>284
禿げしく分かりにくい例えだなw

; --- 単純配列 ---
arr := ["a", "b"]
arr.RemoveAt(1)
MsgBox % arr.1 arr.2 ; b

; --- 連想配列 ---
arr := {a: "a", b: "b"}
arr.Remove("a")
MsgBox % arr.a arr.b ; b
return
2017/04/15(土) 09:52:46.72ID:H9uISqAv0
arr := {"A1": {"B2": "hige"
        , "C2": "hage"}} ; 試すなら全角スペース消してね
arr["A1"].Remove("C2")
MsgBox % arr["A1"]["C2"]
2017/04/15(土) 10:09:40.47ID:QH+TqQ4Q0
わかりにくくてすいません!
arr["A1"].Remove("C2")
object["hoge"].Remove("禿")
でできました! ありがとうございました!
2017/04/17(月) 00:06:22.68ID:7SRx3NSj0
ずーっと何時間もループ作業させてると、そんなに負荷の掛かる処理でもないのに処理落ちしてることがあるな
2017/04/17(月) 13:54:24.03ID:m7tnAiWt0
AHKにF5を押した時の様なコマンドはありますか?
今は該当ウィンドウにF5をControlSendしてリフレッシュしていますが、F5と同等のWinコマンドがあれば使ってみたいです。
2017/04/17(月) 17:10:53.64ID:w3gDyj0g0
>>289
うーんエスパーするとブラウザなどにF5をControlSendで更新してるって意味かな?
「F5と同等のWinコマンド」と言っても更新は各ソフトごとで割り当てられてるものだからWinコマンドなんて無い

全然違うこと言ってるならこれ以上はエスパースレにでも行くかもう少し人に伝わる書き方してくれ
2017/04/17(月) 18:29:56.84ID:m7tnAiWt0
>>290
ああ、確かにF5が更新に割り当てられているとは限らないですね。
これは馬鹿な質問でした。
2017/04/18(火) 00:10:08.60ID:Z1GczGkp0
お尋ねさせてください。
ahkファイルに以下のように記述してスペースキー+アルファベットにカーソルキーを割り当てているのですが、専用うpろだのClipboardHistory.ahkの履歴メニュー上ではなぜかカーソル移動できません。

SetTitleMatchMode, 2
#include %A_ScriptDir%\IME.ahk
Space & i::send {Blind}{Up}
Space & k::send {Blind}{Down}
Space & j::send {Blind}{Left}
Space & l::send {Blind}{Right}


キーボードのカーソルキーを直接入力するとカーソル移動できるのですが、なぜAutoHotkeyからだとうまくいかないのかが分かりかねます。
どなたかお分かりになる方がおられましたら教えていただけないでしょうか。

以下は環境です。
OS: Windows7 HomePremium 64-bit
AutoHotkey: Ver.1.1.25.01 (Unicode 64-bit)
ClipboardHistory.ahk: Ver.1.3.2
2017/04/18(火) 00:27:07.75ID:tLB4uyFd0
>>292
自分もやり方があるなら知りたいです
Sendplayだと動くけど他で不具合出るから
できればsendで動く方法が知りたいです
2017/04/18(火) 00:31:45.29ID:DnrWvvF80
>>292
最低限のコードと必要なリックぐらい貼ったら?
2017/04/18(火) 00:32:03.78ID:DnrWvvF80
リンク
2017/04/18(火) 00:33:18.23ID:Z1GczGkp0
今メモ帳を開いていて気付いたのですが、スペースキー+アルファベットによるカーソル移動ですとClipboardHistory.ahkの履歴メニューにフォーカスが行かないようです。
ClipboardHistory.ahkの履歴メニューが表示されたまま、その背後の文面上をカーソルが上下左右に移動しています。
また、この状態でキーボードのカーソルキーを押すと、文面上のカーソルとは別にClipboardHistory.ahkの履歴メニュー上を上下にカーソル移動するようになります。

スペースキー+アルファベットによるカーソル移動がうまくいかないのはフォーカスの問題のようです。
どうすればClipboardHistory.ahkの履歴メニューにフォーカスを送ることが可能になるのでしょうか?
2017/04/18(火) 00:35:43.06ID:Z1GczGkp0
>>294
失礼しました。
ClipboardHistory.ahkのうpろだのリンクです。
ttp://ux.getuploader.com/autohotkeyl/download/121/ClipboardHistory.ahk 👀
Rock54: Caution(BBR-MD5:669e095291445c5e5f700f06dfd84fd2)
2017/04/18(火) 00:47:11.07ID:DnrWvvF80
そもそも履歴メニューというものがどれのことを言っているのかわからない
タスクトレイの右クリックメニューのことを言っているのか
ClipboardHistoryウィンドウなのか
そのウィンドウ右クリックメニューなのやら
2017/04/18(火) 01:41:15.44ID:peglwBmD0
>>297
ちょっと見てみたけど、ClipboardHistory.ahk のホットキーを定義してる部分が AHK からの Send に反応してないみたい
なので

#InputLevel 1
Space & i::send {Blind}{Up}
Space & k::send {Blind}{Down}
Space & j::send {Blind}{Left}
Space & l::send {Blind}{Right}
#InputLevel 0

とすればいけたよ
2017/04/19(水) 00:07:22.37ID:K9MJisAG0
>>298
分かりにくくて申し訳ございません。
Ctrlキーのダブルプッシュで表示されるメニューのつもりでした。

>>299
教えていただいた方法でAHKからカーソル移動できるようになりました。
#InputLevelという機能については全く存じ上げておりませんでしたのでとても勉強になりました。
どうもありがとうございました。
301名無しさん@お腹いっぱい。 (ワッチョイ 0b01-93S+)
垢版 |
2017/04/19(水) 03:13:48.12ID:NqPXmlz00
なぜBlockInputが聞かないのか原因がわかりません。

blockinput,on
sleep,3000
blockinput,off

たった3行のスクリプトですが何が原因でしょうか?
302名無しさん@お腹いっぱい。 (ワッチョイ 0b01-93S+)
垢版 |
2017/04/19(水) 03:28:23.38ID:NqPXmlz00
もしやと思い管理者権限で走らせたら動作しました。
http://ahkwiki.net/BlockInput
このページには書いてないけどAHK使いには常識なんでしょうか?
ちなみに環境はWin10です。
2017/04/19(水) 12:27:49.33ID:eKndVJ3d0
AHKに限らず、管理者権限を要求しないけど管理者権限起動しないと不具合のあるアプリは結構あるようですよ。
304名無しさん@お腹いっぱい。 (ワッチョイ 0b01-93S+)
垢版 |
2017/04/19(水) 16:32:59.64ID:NqPXmlz00
>>303
あまり深く考えず付き合うことにします。動いたからよしと。
2017/04/19(水) 18:32:35.56ID:FSuwMycm0
公式のドキュメントにはちゃんと記載があるよ。日本語のドキュメントは全然メンテされてないから、
出来れば公式の方を見た方がいい
306名無しさん@お腹いっぱい。 (ワッチョイ 0b01-93S+)
垢版 |
2017/04/19(水) 22:51:48.59ID:NqPXmlz00
英語で探せば解決すること多いですよね。情報量が断然。
今回は安易にここで聞いてしまいました。今後がんばります
2017/04/20(木) 09:19:43.12ID:HeaoQ4hM0
英語読めないので
ほぼROMですが
ここでの情報は助かりますし、ヒントになります
ありがとうございます
2017/04/21(金) 09:19:01.64ID:YRNVrPJF0
新規環境にインストールしたときはとりあえず>>8の対策パッチを入れてるな
2017/04/21(金) 10:31:38.58ID:DiD/cJtZ0
UI Accessはインストーラのオプションから任意で追加するようになったからテンプレの>>8は修正しないといかんね
2017/04/21(金) 19:48:32.93ID:bzf8ojMU0
そう言えばRS1までのWindows10だと、レジストリからUACを無効にするとストア系のアプリが起動出来なかったけど、RS2からは起動出来るように修正されたね。
311名無しさん@お腹いっぱい。 (ワッチョイ 4377-mkSu)
垢版 |
2017/04/23(日) 12:18:00.71ID:hj5/SbKN0
Firefoxのブックマークウィンドウに表示されている項目を編集したいのですが、
Sendでキーを送っても期待通りに受け取って処理してくれずに、
未編集の項目が残ってしまうことがしばしばあります。

具体的には、「名前(N)」のテキストボックスにフォーカスがある状態で
  Send +{Tab} ; テキストボックスのすぐ上のグリッドにフォーカス
  Send {Down} ; 次の項目へ
  Send !l^a^c ; 「URL(L)」のテキストボックスにフォーカスして内容をコピー
といったコードを書いてループで回しているのですが、特にメモリ負荷・CPU負荷が高いと、
Sendした通りの順序で動いてくれないことがよくあります。
たとえば、{Down} を2つ続けて受け取ってしまって1行飛ばしたり、
^a^c でテキストボックスではなくその上のグリッドを全選択・コピーしたり
(で、その状態で ^v を受け取って、グリッドの中身が丸々二重になったり)、
+{Tab} を2つ続けて受け取ってウィンドウ左側のツリー部分にフォーカスが行ったりします。

現在は勘に頼ってSleepを随所に入れているのですが、こういう操作をわざわざ
AHKで書いてループで回すのには当然理由がある(=対象の項目数が多い)わけで、
あまりに時間がかかるのも困りものです。

で、キー操作ではなく、ウィンドウ上のコントロールに対して直接メッセージを送りたいと思って
Window Spyで調べてみても、Windows以外のOSの版と共通のソースで書かれているせいか、
マウスカーソルをウインドウ上のどこに置いても、「Control Under Mouse Position:」の枠に
それらしきものが何も出てくれません。

…何かいいアイデアはないでしょうか?
訳あって、ブックマークをjsonファイルに書き出して外部のツールで編集する方法は使えません。
2017/04/25(火) 20:48:21.48ID:xtXfnML00
日本語OSで
capslockキーのリリースの検知(またはUp状態であることの確認)ってやる方法ない?
2017/04/25(火) 21:00:09.87ID:0atPQyx50
>>312
レジストリでF13〜F24のいずれかを割り当ててそれに対してAHKで検知すれば?
2017/04/25(火) 21:11:30.38ID:xtXfnML00
>>313
>>312
すいません。ポータブルで実現したいので
レジストリ編集・管理者権限使用はなしでお願いします。
2017/04/25(火) 21:16:03.72ID:0atPQyx50
じゃあ諦めるしかないね
日本語環境だとLock系キーの動作は不定
という仕様なので
2017/04/25(火) 21:40:50.36ID:nrhzhqeR0
Windows To GoでOSごと持ち歩く
非日本語OSで環境構築しとけばそのままでいけるで
317名無しさん@お腹いっぱい。 (ワッチョイ cf01-+vjJ)
垢版 |
2017/04/26(水) 14:09:56.27ID:oxhcbNh/0
traytipでポップアップが出なくなった。
数日前からこの現象発生。
windows10 creators updateは未適用。
考えられる原因は何か有りますか?
2017/04/26(水) 17:03:06.90ID:D3wTeHJK0
>>317
その前に環境を書こうね
319名無しさん@お腹いっぱい。 (ワッチョイ 0b01-KYNw)
垢版 |
2017/04/27(木) 10:41:41.12ID:S2URduR/0
>>318
windows10 home 64bit
ahk v1.1.24.01 unicode 64bit
ですがこれでヒントになりますか?
320名無しさん@お腹いっぱい。 (ワッチョイ 0b01-KYNw)
垢版 |
2017/04/27(木) 10:43:16.98ID:S2URduR/0
trayTip,,てすと
sleep,3000

これが動作しないのです。
2017/04/27(木) 14:05:14.32ID:F2IX/dyC0
>>317
数日前に何があったか、思い当たることを羅列してみて
2017/04/27(木) 15:59:00.68ID:uiEh8WS70
>>319
> ですがこれでヒントになりますか?
書かないより百倍マシ、AHK古いぞ

通知領域アイコンの設定で非表示
レジストリがOFF

バルーンメッセージ バルーンヒント 非表示
でググレ
323名無しさん@お腹いっぱい。 (ワッチョイ 0b01-KYNw)
垢版 |
2017/04/27(木) 20:58:59.60ID:S2URduR/0
>>321 >>322
自分で何か思い当たる事がまったくないのです。
Windowsの設定をいじったとか、AHK関係に手を加えたとか。

通知領域の設定を見ましたがそもそもAHKはwin10の設定項目の中には見当たりませんでした。
当然AHKアイコンは常に表示にしています。

致命的な問題では無いので我慢することにします。
ありがとう。
324名無しさん@お腹いっぱい。 (ワッチョイ 0b01-KYNw)
垢版 |
2017/04/27(木) 21:01:52.86ID:S2URduR/0
>>322
現行は1.1.25なので自分のはほぼ最新版だと思いますが・・・・・・

あるいは AHK V2 のことですか?
たぶんスクリプトの書き直し大量に発生しそうで躊躇してます。まだアルファ版だし。
2017/04/27(木) 21:12:52.72ID:S2URduR/0
>>322
念のためv1.1.25.01にしましたが変わりませんでした。
2017/04/27(木) 22:16:31.04ID:3kQGMVYf0
win10 Rs2アップデート済みでv1.1.24.01 ansi 32bitだけど、うちも出ないよ
2017/04/27(木) 22:25:43.18ID:3kQGMVYf0
あ、ごめん、Winaero Tweakerでバルーンチップ有効にしたら出た
2017/04/28(金) 23:59:22.00ID:wu6/oOe4r
すみません今まで出来てたと思っていた単純な計算が出来ない事に気づきました
Setformat, Float, 0.6
a := 36.0450850
b := 36.0450800
c := 0.000005
if((a-b) != c)
MsgBox, % (a-b) " is not equal 0.000005 ?",
ifEqual, c, % (a-b), MsgBox, こっちは合ってる,
if(abs(36.0450850-36.0450800) <> 0.000005)
MsgBox, ng1
if((0.000110-0.000105) != 0.000005)
MsgBox, ng2
if((0.110-0.105) <> 0.005000)
MsgBox, だめ
if((0.000010-0.000005) = 0.000005)
MsgBox, ok
=/==/!=/<>を試したが駄目でした
なんでこうなるんでしょうか
v1.1.25.01 32bit U32版A32版とも同じです
2017/04/29(土) 07:02:23.20ID:z1NB2zPu0
一見同じに見えるけど、浮動小数点の演算には誤差があるからだよ

Setformat, Float, 0.20
こんな風にして、演算の結果実際に格納されてる値を確認すれば分かるはず
2017/04/29(土) 09:31:27.54ID:aGGSeSqnr
>>329
レス有り難うございます
setformat, float, 0.0e
MsgBox, % (0.110 - 0.105) > 5e-003
MsgBox, % (1e-001 - 1e-001) = 5e-003 ;え〜(;´д`)
MsgBox, % (0.110-0.105) > 0.005
;だめだ分からない...Setformatは見た目の桁数を揃えるだけで内部的には元の数字で計算してるってことなんでしょうか
MsgBox, % round(36.0450850-36.0450800, 6) = 0.000005
setformat, float, 0.6
MsgBox, % RegExMatch(36.0450850-36.0450800, "^0\.000005")
まだ納得できてませんが取り敢えずRoundするか文字列として比較することで解決しそうです
2017/04/29(土) 09:35:13.23ID:N+z0dulg0
d := (a - b)
MsgBox, % (d != c) ? "true" : "false"
2017/04/29(土) 13:26:39.25ID:z1NB2zPu0NIKU
>>330
https://autohotkey.com/docs/commands/SetFormat.htm#Float

Float(Fast じゃない)方は、変数へ格納された時点で DecimalPlaces に丸められる
なんで >>331 は真になるけど、
((a - b) != c) これは偽になる
2017/04/29(土) 13:35:30.70ID:z1NB2zPu0NIKU
あ、>>331 は非等値だから逆か。(d = c)が真になるって意味ね
2017/04/29(土) 13:39:38.79ID:z1NB2zPu0NIKU
×((a - b) != c) これは偽になる
〇((a - b) = c) これは偽になる
2017/04/29(土) 18:21:37.68ID:aGGSeSqnrNIKU
>>331-334 どうもありがとうございます
> floatは変数に格納した時点でDecimalPlaces桁数に
これは知らなかった(小数値が+-*/された時点で、と思ってました)
なるほど...納得できたような出来てないような
Setformat, float, 0.6
a := 36.0450850
b := 36.0450800
c := 0.000005
d := (a-b)
MsgBox, % ((a-b) != c) "`n" (d != c) ;計算結果を変数に代入した方はちゃんとfalseになりますね
Setformat, float, 0.8
a := 36.04508500
b := 1 ;試しに整数でやってみたところ
c := 35.045085
d := (a-b)
MsgBox, % b-1 ;整数は桁揃えされないから「0」
MsgBox, % b-1.0 ; 0.00000000
MsgBox, % (a-b) ;35.04508500 ;aの桁数は変わってないが、どちらか片方が小数値なら桁揃えされる?
MsgBox, % ((a-b) != c) ”`n” (d != c) ;こっちは桁揃ってないのにちゃんとfalseになるんですよ
2017/04/29(土) 21:59:24.43ID:r6kgVtY20NIKU
Windows10 pro 64-bit
AutoHotkey Unicode 64-bit ファイルバージョン1.1.25.1

メモ帳を開いたら、タイマーを起動、ツールチップにタイマー作動!と表示し続け、 60秒毎にメモ帳にABCと入力を繰り返す。
メモ帳を閉じたら、タイマーを終了し、ツールチップを消し、 メッセージボックスでタイマー停止!と表示する。

WinWait, ahk_class Notepad
{ SetTimer, InputTimer, 60000
ToolTip, タイマー作動! }
Return

InputTimer:
IfWinExist, ahk_class Notepad
{ ToolTip, タイマー作動!
Send, ABC }
Else
{
WinWaitClose, ahk_class Notepad
{ ToolTip,
MsgBox, タイマー停止!
SetTimer, InputTimer, Off }
}
Return

上記で、目的の動作は概ね実現されるのですが、一つだけ気に入らないところがあります。
メモ帳を閉じた直後に、タイマー停止!のメッセージボックスが表示されないのです。
どうやら、メモ帳を閉じた後も、作動中のタイマーは直ぐには停止せず、 セットした60秒間が経過したタイミングでタイマーが終了し、メッセージボックスが表示されるようです。
メモ帳を閉じるタイミング、タイマーが終了するタイミングにかかわらず、 メモ帳を閉じた直後に、タイマー停止!のメッセージボックスを表示させる方法があればご教示ください。 よろしくお願いいたします。
2017/04/29(土) 23:23:53.88ID:zp4a0efb0NIKU
コピペで動かないので動作検証はしないけど

・60秒ごとの入力監視タイマー と メモ帳終了監視タイマー を分ける
・終了監視はWinWait使うならタイマーは回さないで1タイムのみにする
・それか0.5〜1秒間隔タイマーでifWInNotExistですぐ抜けるを繰り返すものにする
2017/04/29(土) 23:59:37.57ID:z1NB2zPu0NIKU
>>335
そもそも float や double の比較に、等値や不等値演算子を使うこと自体が NG なんよ
AHK に限った話じゃないから適当に検索してみてくれ
2017/04/30(日) 08:17:25.06ID:608QOK9p0
>>337
アドバイスありがとうございます。
別に終了監視タイマーを、IfWinNotExistで設定してみましたが、
やはり入力監視タイマーが終了しなければ作動しないようです。
引き続きよろしくお願いいたします。
2017/04/30(日) 08:45:23.32ID:VC0AsQZa0
プログラミング詳しくないのでわからないんですけど
0.5秒や1秒短い間隔のタイマーって負荷すごかったりしないんですか? 処理による?
2017/04/30(日) 09:07:53.16ID:b1zEeBw50
>>340
タイマー自体の負荷は気にしないでいい、問題は処理の中身
1000個のタイマーを1msで同時に回してもCPU使用率は0%
シングルスレッドだから当然といえば当然だが

Loop 1000
SetTimer, TEST%A_index%, 1
Return

TEST1:
TEST2:
〜中略〜
TEST1000:
Return
2017/04/30(日) 09:11:02.27ID:VC0AsQZa0
そうなんですね ありがとうございます
なんとなく忌避しちゃってたけど心置きなくタイマー作ってみようと思います
2017/04/30(日) 10:08:45.09ID:90OcEDAQ0
>>339
うちでは動いてるのでやり方には問題ないはず

>337でも書いたが>336はSyntaxErrorで動かない
そういうソース貼って質問した後に
やったけどダメでしたって書き換えたソース貼らずに言われても
こちらとしてはソース見直せとしかアドバイスできないよ


あと質問とは直接関係ないので触れなかったけど
60秒毎タイマーというのは誤差が60秒あるという意味なので
1秒タイマー内で60カウント数えてからSendするほうが動作としては望ましい
(まあそうするとタイマーを分ける必要もなくなるんだけどね)
2017/04/30(日) 10:57:21.94ID:608QOK9p0
>>343レスありがとうございます。336をそのままコピペすると動きませんね!申し訳ありませんでした。
2chの掲示板に投稿するときに、『改行が多すぎます!』と何度も警告されて全く受け付けてくれなかったたため、不要な部分をそぎ落としたのが悪かったみたいですね。IfWinNotExistで書き換えたスクリプトをそのままコピペします。ご添削のほどよろしくお願いいたします。
#InstallKeybdHook
#UseHook
#InstallMouseHook
#Persistent
WinWait, ahk_class Notepad
{
SetTimer, InputTimer, 60000
ToolTip, タイマー作動!
}
Return
InputTimer:
IfWinExist, ahk_class Notepad
{
ToolTip, タイマー作動!
Send, ABC
}
Else
{
SetTimer, ExitTimer, -1
SetTimer, InputTimer, Off
}
Return
ExitTimer:
IfWinNotExist, ahk_class Notepad
{
ToolTip,
MsgBox, タイマー停止!
}
Return
>>1秒タイマー内で60カウント数えてからSendするほうが動作としては望ましい ⇒具体的にはどのように記述するのでしょうか?
2017/04/30(日) 11:54:38.51ID:608QOK9p0
344
補足です。
ExitTimerを1秒間隔で設定したところ、
InputTimerのサブルーチンが終了するまでの間、
メッセージボックスを残秒数分吐き続けてしまったため、
負の値にしてワンタイムのみにしてあります。
2017/04/30(日) 12:03:45.49ID:90OcEDAQ0
>>344
・ExitTimer はメモ帳の起動待ち直後 SetTimer,InputTimerの次行あたりで起動させる
(InputTimer内で起動したのではタイマーを分けた意味がない)

・ExitTimerの間隔指定がおかしい、-1(1タイムのみ) で ifWInNotExistだと初回 else終了でそれっきりになる
   方法1 間隔は500〜1000msで繰り返し確認、タイマ内では待たずにifWInNotExistですぐ抜ける
   方法2 -1で1回のみ起動にするならWinWaitCloseでタイマ内で終了待ちする
  どっちでもいいけどどっちかに決める、混ぜたらどちらもまともに動作しない

・WinWaitの後に{ }はいらない、ifや関数で使う括りなので。

・あとInputTimer内で IfWinExistでSendしてるけど、これだとメモ帳がバックグラウンドのときに誤爆する
 IfWinActiveの判定入れるか強制的にWinActivateするか(動くなら)ControlSendにした方がいい


> 1秒タイマー内で60カウント数えてからSend
・InputTimerを1秒間隔で起動、count=60
・InputTimer内でcount-- して 0(以下)になった時にSend
・ToolTip, タイマー作動! %count% とかやっとくと残り時間も分かってデバッグにも便利
2017/04/30(日) 13:28:00.93ID:90OcEDAQ0
>>345
ExitTimerは終了後にするべき作業を全て任せるためのものだよ
InputTimer と ExitTimer の停止も当然ExitTimer内でやる
でなきゃ60秒誤差を回避できないでしょ
2017/04/30(日) 23:10:29.99ID:608QOK9p0
345 アドバイスをもとに再度スクリプトを書き換えました。メモ帳を初めて起動したときは問題なく目的の動作をしているようですが、
いったんメモ帳を閉じてメッセージボックスのタイマー停止!を表示させた後に、再度メモ帳を起動させると、全く動作しません。
AHKスクリプトをリロードしてからメモ帳を開くと、また初回のみ動作します。まだどこかおかしいのでしょうか?

WinWait, ahk_class Notepad
SetTimer, InputTimer, 1000
Count=60
SetTimer, ExitTimer, 1000
ToolTip, タイマー作動!
Return
InputTimer:
IfWinActive, ahk_class Notepad
{
ToolTip, タイマー作動!%count% 秒後に入力
Count--
If Count=0
{
Send, ABC
Count=60
}
}
Return
ExitTimer:
IfWinNotExist, ahk_class Notepad
{
SetTimer, ExitTimer, Off
SetTimer, InputTimer, Off
ToolTip,
MsgBox, タイマー停止!
}
Return
2017/04/30(日) 23:17:22.73ID:608QOK9p0
348
試しにメモ帳再起動監視タイマー(RestartTimer)を増設してみたところ上手くいっているように思いますが、
なぜこれが必要なのでしょうか?

ExitTimer:
IfWinNotExist, ahk_class Notepad
{
SetTimer, ExitTimer, Off
SetTimer, InputTimer, Off
ToolTip,
MsgBox, タイマー停止!
SetTimer, RestartTimer, 1000
}
Return

RestartTimer:
WinWait, ahk_class Notepad
SetTimer, RestartTimer, Off
SetTimer, InputTimer, 1000
Count=60
SetTimer, ExitTimer, 1000
ToolTip, タイマー作動!
Return
2017/04/30(日) 23:37:01.95ID:90OcEDAQ0
なぜと言われてもNotePad起動待ちのWinWaitを冒頭1回でしかやってないでしょ
基本的な部分なのでちゃんとwiki読んできたほうがいい
あと何度も言うけどTimer内でWinWaitで待つならワンタイム起動にしなさい
2017/05/01(月) 00:32:05.61ID:0V0GtOjk0
>>350 何度もすみません。
メモ帳初回起動時にしか動作しない理由はわかりました。
348+349の記述に書き換えても、正常に動作していないということですか?
ExitTimerの部分を -1(ワンタイム)に訂正すれば問題なしでしょうか?
また、タイマ内ではIfWInExist(Active)やIfWInNotExistは使用してはいけないということですが、
タイマ外に記述しても全く反応しないのですが・・・
>>タイマ内では待たずにIfWInNotExistですぐ抜ける という意味がよくわかりません。
wikiも読み直してみますので、引き続きよろしくお願いします。
2017/05/01(月) 01:45:38.34ID:+5nnd5240
>>351
先ずはトライアンドエラーで動くまで納得の行くまで色々試せ

とりあえずこんな感じでも動くことは動くはず
>>348の上半分は同じで、ExitTimer:部分は↓
ExitTimer:
IfWinNotExist, ahk_class Notepad
{
Count=60
ToolTip, タイマー停止!
}
Return
2017/05/01(月) 02:14:42.84ID:KYVCJ0Be0
>>345
上三行それでいい
下四行全然ちがう
タイマー内で使用してはいけないともタイマ外に書けとも言ってないよ
何か全然通じてないみたいだがもしやwinwaitとifwinexistの違いが分かってない?
winwaitは対象ウィンドウが存在するまで待つ
ifwinexistは今現在対象ウィンドウが存在してるか調べる

1秒ごとにタイマー動かすならタイマールーチン内の処理は1秒未満で終わる内容にしないと
「1秒間隔で繰り返し実行」できないでしょ
→winwaitのような「待ち」の処理はNG
 ifwinexistで存在チェックしelseなら即returnする
 待たない=ルーチンからすぐ抜ける

ワンタイムタイマーの場合はその逆
一度しか実行されないのでreturnで抜けたらそれきりになってしまう
→ifwinexistで即抜けしたらそれ以降の確認ができない
 なのでwinwaitで対象ウィンドウが存在するまで「待ってやる」
2017/05/01(月) 03:25:19.73ID:LZHpjIsmM
タイマーで長時間監視させてるとOSの処理とかcpu負荷によって実際の時間とはズレが生じてくる
2017/05/01(月) 15:47:16.28ID:zUK3JZ+qd

【女神】Slot
💰💣👻
🍒🍒🎴
😜🍜🍜
Win!! 7 pts.(LA: 1.71, 1.69, 1.71)
2017/05/02(火) 00:33:03.47ID:C+V/zU+9d
 .彡⌒ミ
(´・ω・`)
2017/05/02(火) 07:21:37.29ID:jZspGgXG0
351 これでどうでしょうか?全く問題なく動作しています。ご意見ください。

WinWaitActive, ahk_class Notepad
SetTimer, InputTimer, 1000
Count=60
ToolTip, タイマー作動!
SetTimer, ExitTimer, -1
Return
InputTimer:
ToolTip, タイマー作動!%count% 秒後に入力
Count--
If Count=0
{
Send, ABC
Count=60
}
Return
ExitTimer:
WinWaitClose, ahk_class Notepad
SetTimer, InputTimer, Off
ToolTip,
MsgBox, タイマー停止!
SetTimer, RestartTimer, -1
Return
RestartTimer:
WinWaitActive, ahk_class Notepad
SetTimer, InputTimer, 1000
Count=60
ToolTip, タイマー作動!
SetTimer, ExitTimer, -1
Return
2017/05/02(火) 09:40:25.10ID:Z3jAVDE20
思考停止してるなあ
動くかどうかにしか興味ないならもうそれでいいよ
2017/05/02(火) 13:03:30.64ID:/3o9eW+p0
>>358
ご多用にもかかわらず、合い間を縫って掲示板をご確認くださりありがとうございます。
思考が停止していますか・・・
問題なく動いているので満足してしまえばよいのかもしれませんが、
せっかくですからもう少しAHK追求してみたいと思いますので、貴殿の優秀な頭脳をお貸しください。
余裕がおありであれば、もう少し具体的にダメだしをいただけるとうれしいのですが・・・
数日前からAHKを知った新参者が、貴殿のように理解を深めるためには、
wiki以外にどんな書物を読めばよいのかもご教示いただけると助かります。
引き続きよろしくお願いいたします。
2017/05/02(火) 14:42:10.23ID:sIGtYt8F0
すみません。前にも書かせていただいたんですが、
ホットストリングが一回で起動しません。一回目無反応で2回目にスクリプトが発動がされます。
どうやれば一回目から起動してくれるのでしょうか?

ホットストリングの部分のみを抜き出してそれのみのAutohotkey.ahkだと失敗しないように思うんですが、
#IfWinActiveでいっぱい仕切られたいつものAutohotkey.ahkのなかにおいたホットストリングだと
一回目失敗します。どうしてでしょうか?教えてください
2017/05/02(火) 15:09:31.72ID:z6v/KZl40
>>360
>>2
■質問に際して
>操作したいソフト・やりたい処理などは具体的に書いた方がレスが付きやすい傾向にある。
2017/05/02(火) 15:53:46.56ID:gYhDstJX0
>>359
横からだけどあまり畏まると却って嫌らしくみえるよ。長文だと尚更
Wikiで十分理解できる範囲だし難しく考え過ぎ
2017/05/02(火) 16:33:10.81ID:rrJHUz/00
>>362
嫌みを言ってるだけだろw
2017/05/02(火) 16:40:37.44ID:NmO727YQ0
どうみてもストレートな嫌味での皮肉だなw
2017/05/02(火) 16:51:22.50ID:Z3jAVDE20
コードそのものよりシーケンスの考え方を伝えたかったんだけど
>353総スルーで、完璧に動いてるのでこれでいいですか? て言われてしまうとね
まあ結局こっちの説明が下手すぎて伝わらなかったということなんだろう

コードの添削はしません
本人がよくわかってないまま修正するとまたバグが出てぐちゃぐちゃになるし
自分でどこを最適化したらよいか分かるようになってから自力でして下さい
2017/05/02(火) 18:53:40.69ID:/3o9eW+p0
359
>>365
353を総スルーしているつもりも、嫌みのつもりもないのですが・・・
『完璧に動いてるのでこれでいいですか?』というくだりも、
何らかの陰性感情を抱かせてしまったようですね。
手抜きをしているように映ってしまったということでしょうかね?

いずれにしても357の記述が不適切であるということは伝わってきました。
貴殿の気持ちがわかるまで、wikiを熟読して出直してきます。
ここまでお付き合いくださり、ありがとうございました。
2017/05/02(火) 19:12:14.89ID:v127Vr0k0
慇懃無礼というやつだな
2017/05/03(水) 17:41:53.64ID:mGMZlHNu0
誰にもメリットないし NG しときゃ良いんだよ
■ このスレッドは過去ログ倉庫に格納されています
16歳の水野カイトが封印の刀を見つけ、時間が裂けて黒い風と亡霊の侍が現れ、霊の時雨と契約して呪われた刀の継承者となる場面