AutoHotkey スレッド part25 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
参考演算子使えばやれないこともないが素直にif書くほうが楽だと思うわ 可変長引数を取るmax関数でも定義すればいいじゃない
Max(params*) {
t := params[1]
Loop % params.MaxIndex() - 1 {
b := params[A_Index + 1]
t := t > b ? t : b
}
Return t
}
a := 10
b := 20
c := 30
d := 40
MsgBox % Max(a, b, c, d)
Return >>403
これはすばらしい。 こんなこと出来たんだ integer限定でよければこういう方法も
Max_integer(params*) {
o := object()
Loop % params.MaxIndex() {
o[params[a_index]] := true
}
Return, o.MaxIndex()
} 質問です
対話形式プログラムの自動化ってできるんでしょうか?
コマンドプロンプトに対してControlSendで送ることは出来ても
返答メッセージの読み取り方が分かりません。 >>400
>>403
>>405
おー、すごい
できるようになりましたありがとうございました。
ahkを一年以上使ってるけどwiki読んだり検索して似たようなことやってる人のスクリプトを見てもわからなくてちょっと改変して移植もできない場合が多すぎて自分のポンコツぶりが悲しいw >>406
uwscは doscmd で出来るけど、ahkでは試そうとしたこと無いので出来るかどうか解らない >>406
大昔に無理やり実装してた人はいた、オリジナルANSI版の頃のだからたぶん今だと動かないと思うが
ここの プロセスを起動して標準出力を読み書き
http://lukewarm.s101.xrea.com/myscripts/
最近のだとこの辺とか?
AutoHotKey_Lで、標準出力を得る方法。
http://poimono.exblog.jp/22219786/
単純に出力見たいだけだったらファイルにリダイレクトしちゃうのが簡単だけど
(書き込み規制に引っかかるので全角化)
RunWait, cmd.exe /c es.exe 検索文字列>temp.tmp,,Hide /UseErrorLevel
FileRead,var,temp.tmp
msgbox,%var% >>406
例えば rmdir を使ってフォルダとその中にあるファイルを削除する場合
app := ComObjCreate("WScript.Shell").Exec(ComSpec)
app.StdIn.WriteLine("rmdir /s D:\DeleteMe") ; D:\DeleteMe と DeleteMe フォルダの中にあるファイルを削除するコマンド
While (1) { ; DeleteMe フォルダの中に一つでもファイルやフォルダがないと無限ループするから注意
msg .= app.StdOut.Read(1) ; ReadLine だとこちらの入力待ちの時にデッドロックする
If (InStr(msg, "よろしいですか (Y/N)?")) {
MsgBox % msg
app.StdIn.WriteLine("Y") ; 確認を求められたので y を入力して削除を実行
break
}
}
app.StdIn.WriteLine("exit")
Return
こちらの入力待ちになるまでの処理は色々なやり方があると思う いろんなご意見ありがとうございます!
>>408
対話型には向いてなさそうな…
>>409
url一つ目のやつは試してみたけどahk_lだと動きませんでした
url二つ目のやつはout of memoryとでて、こっちもダメでした😭
>>411
これです!
なるほどこうやってCOMオブジェクトを使うんですね
すごい勉強になりました
>>412
原理的には411とほぼ一緒みたいですね
WINAPIはいまだにさっぱりよくわかりません
高速でControlSendを使うと
キーボードからの入力がたまにロックされて使えなくなってしまうことがあったので
COMオブジェクトで直接読み書きできるならそれにこしたことないですね キーの長押しすり抜け病って修正されてるのかな?
未だなら早よ!
これがちゃんとできないとカーソル移動とか怖くてAHKは使えないんだよ
致命的な不具合だ! >>415
こんなポンコツよく使ってると感心する 信じられないw
もちろんこれがゆえにkeyhacに移行したわ! ここ数年で作ったものを見返してみたら全くホットキーと関係ないものばかり
なんで俺はAHKを使ってるんだろう…? ちょっとしたファイル操作とかでもahkでやろうとする癖は付いてしまってるな
本来ならbatやwshあたりでやればいいんだろうけど 本当にAHKは使いもんにならんのよ!
キーログを見るツールとかを立ち上げてAHKの動作を確認したんだが
スクリプトがまともに動かんのよ、ダメだろこれは!
ちゃんとフックできてないんよ、笑うわw AHKって宗教か?
本当に改善が必要な部分を指摘してるのにまともに考えられないの?
だよ >>423
お前こそ宗教なの?
気持ち悪いから早く消えろよ すり抜けとか押しっぱなしの指摘なんて散々されてると思ってたけど、そうでも無いの? /ヽ /ヽ
/ ヽ / ヽ
______ /U ヽ___/ ヽ
| ____ / U :::::::::::U:\
| | ハサミ が // ___ \ ::::::::::::::|
| | 使エネーヨ | | | U :::::::::::::|
| | ヽ(`Д´)ノ.|U | | ::::::U::::|
| | >>421 | ├―-┤ U.....:::::::::::::::::::/
| |____ ヽ .....:::::::::::::::::::::::<
└___/ ̄ ̄ :::::::::::::::::::::::::|
|\ | :::::::::::::::::::::::|
\ \ \___ :::::: いうても困らない範囲内でしか使ってないからなあ
そもキーリピート発生するキーをホットキー長押ししようとは思わんし
ahkは名前こそAutoHotkeyだがキーカスタマイズだけが目的なソフトじゃないしな
ウィンドウ制御とかいらんならahkである必要性は薄い
ソフトによって得手不得手あるんだし自分の目的に合ったもん使えばいいよ GUIについての挙動についてです
GUI,Add, GUI,Showなどで作ったウインドウ上でスペースキーを押したときの挙動
ってどこかに書いてあるでしょうか
このときに別の挙動をするように、
#IfWinActive
でこのGUIがアクティブになったときに
Space:Msgbox TEST
としても反応しないのです
で、このGUIウインドウ上でアクティブなボタンが実行されます
GUIがアクティブのときにSpaceキーで別の挙動をするようにする方法を
教えてください AHKでは長押しカーソル移動がまともにできませんよ
ソースコードをテキストエディタで開いてカーソル移動したら
意図しない文字が入力されてしまうなんて怖くて使えませんな テスト用のサンプルスクリプトを作りました
スペースキーが出来ません
Gui,Add,Button,GButton1 W242 H30,ボタン1
Gui,Add,Button,GButton2 W242 H30,ボタン2
Gui,Show, , テスト
return
Button1:
MsgBox ボタン1
return
Button2:
MsgBox ボタン2
return
#IfWinActive, テスト
Space::MsgBox SPACE
Up::MsgBox UP
#IfWinActive >>429
俺の環境でも再現できるかどうか実験したいから、そのスクリプトを書き込んでくれるとありがたい。 >>430
Spaceキーを押したらmsgboxに SPACE と表示されるよ >>429
だから使わなきゃいいだろ
思考力停止してんの? >>433
ごめんなさい。 いまやったら出来ました。おかしいな、さっきは何回やっても出来なかったのに
どうも私の環境のようです。 この質問は撤回します ネットワーク上にあるファイルをFileCreateShortcutでショートカット作りたいんですが、
処理が異常に遅いんですけど、10秒くらいかかるんですけど、何か対処法
知っていたらご教授お願いします。 >>437です。
自己解決したので報告します。
FileCreateShortcut, "%filePath%", %shortcutName%
といった具合に%filePath%にはダブルクオーテーションを付ける。
以上です。 >>431
自分は>>249じゃないが>>136試してみたら確かに"すり抜け"っつうのは発生した
例えばメモ帳でctrl押しながらhを押しっぱなしにして十数秒〜数十秒そのままにしてると
文字の「h」が入力されたり「置換」ダイアログが現われたりした
win7 32bit home ahk 1.1.26.01
自分はこんな操作しないから困らないな >>440
いやだから具体的に何故ダメなのか教えて >>442
俺が引っかかった事例としては関数呼び出しのときにエラー吐いたり、文字化け起こしたり、ファイルの保存形式によってはそのまま貼るとエラー吐いたりして二度手間になったり、コンパイルする時エラー吐いたりした GUIのボタンです
Gui,Add,Buttonで作ったボタンの色を変えることは出来ますか
Gui, Color, Red, Blue
とかやってみたのですが、ウインドウの背景は変わってもボタンの色が
変わりません
ボタンはひとつづつ個別に色を変えたいです
オプションのBackgroundもやってみたのですが、良くわかりません
Cnもボタンのテキストの色が変わりません 7-zip32.dll使いたくて↓を参考にDllcallのめぼしいところを Astrに直してみたんですがA32.exeでしか上手くいかないです
http://mimizun.com/log/2ch/software/1265518996/420-422
U32.exeはLPCSTRの型をAStrにすると戻ってこなくなっちゃう
Strのままだと文字化けしちゃう
VarSetCapacityのポインタ回りだと思うんですがどう直したらいいかわかる方いますでしょうか
ArcGetName(){
/*** int WINAPI SevenZipGetFileName(HARC _harc, LPCSTR _lpBuffer, int _nSize) ***/
global
;;;size:=VarSetCapacity(buf,256)
;;;DllCall(ArcLibPrefix . "GetFileName",UInt,hArc,Str,buf,Int,size,Int)
size:=VarSetCapacity(buf,256*2)
DllCall(ArcLibPrefix . "GetFileName",UInt,hArc,AStr,buf,Int,size,Int)
return buf
} 憶測だけど GetFileName が UTF16 じゃなくて CP932 で返すんでしょ。だから U32 を使ってそのまま使おうとすると文字化けする
DllCall した後に、StrGet(buf, "cp932") すればいいんでない >>444
基本的にできない
応用的には超めんどい(http://anago.5ch.net/test/read.cgi/software/1317156599/659,661)
Pictureで代用するのが早いと思う
ButtonではなくCheckbox, ComboBox, DropDownList, Edit, ListBox, Radio, Textのいずれかなら以下を使うとできる
[CLASS] CtlColors - color your controls (2017-10-30)
https://autohotkey.com/boards/viewtopic.php?f=6&t=2197 >>447
return buf
↓
return StrGet(&buf, "cp932")
でできました!
ついでに 7-zip64.dll 入れてライブラリ参照元書き換えたらU64.exeでも動きました
ありがとうございます! たとえば、
label1:
filename=test1
gosub routine
return
label2:
filename=test2
gosub routine
return
label3:
filename=test3
gosub routine
return
と、番号が違うだけでほかは同じスクリプトが20個くらいある場合、これって
ずらっと書かないとダメなのでしょうか。 それともAHKらしく、
loop,20
{
label%A_index%:
filename=test%A_index%
gosub routine
return
}
みたいな技って使えませんか。これではダメだと思いますが。スクリプト生成まではやってくれないのでしょうか >>452
それなら、filenameを引数にした関数で良いんじゃないかな そう言われると思いましたが、これは一例で関数は使えないときでお願いします
スクリプトの展開まではしてくれないのですか ラベルの省略はできないが処理はまとめられる
label1:
label2:
label3:
label4:
label5:
label20:
StringReplace filename, A_thisLabel,label,,ALL
gosub routine
return
ラベルごとループで作成したいなら一旦ファイルに書き出して .ahkスクリプトとして実行するしかないのでは
loop,20
{
FileAppend,label%A_index%:,temp.ahk
FileAppend,gosub routine,temp.ahk
FileAppend,return,temp.ahk
}
run,temp.ahk >>455
なるほど、A_thisLabelを使うというのは思いつきませんでした
ちょっとやってみましたが、これは使えそうです
それと、temp.ahkを出力するやり方ですが、これもインクルードファイルを自動生成させて
それを読み込ませるという方法が出来そうですね
ahkがインクルードファイルを読み込むタイミングを確認する必要がありそうですが
ちょっと期待できそうですw
インクルードファイルがなければ自動生成させてreloadで再実行し、ファイルが出来てれば
自動生成処理は飛ばすとか いろいろわかったつもりになってるだけのことが多そうな人だから
関数が使えないと言うのもきっと思い込みなんだろう ラベルは最初からないとエラーになってしまうのか
ならインクルードファイルではダメなのかな
でもthisLabelが使えるのは教えて頂いて助かりました インクルードファイルを使う方法も、ラベルだけを宣言しておいたファイルを作っておいて
その後自動生成させれば出来ました。ありがとうございます 呼び元を動的callにすればdummyラベル処理も省けると思われ
if IsLabel(label%no%){
gosub,label%no%
} そういえば俺の環境下だとすり抜け最近ないな
スクリプトの書き方でかなり変わるのかも ホットキーを押したら特定の変数をリストビューに追加する事って出来ますか?
リストビュー初期化時にLV_Addで追加する事は出来たのですが、リストが作られた後に追加する方法が分かりません。 自己解決しました。
LV_Addで変数を%で囲ったらダメでした。外したらいけました>< 現在のCoordModeを参照する方法ってありますか?
関数内でのみScreenにしたいのですが。 A_CoordModeToolTipみたいな感じなんですね
A_CoordModeだけで試してて「出ないじゃん」とか思ってました
ありがとうございます Visual Studioで AutoHotKeyを動かす方法はないでしょうか
Win10 + Visual Studio community 2017 では動きませんでした
Win7 + Visual Studio 2013(管理者権限で実行) もダメでした
Win7 + Visual Studio 2013(管理者権限でない) はAHKきちんと動いたのが謎ですが・・ すいません、
Win10 + Visual Studio community 2017 も
管理者権限だとAHKは動かなくて
管理者権限でないとAHKが動きました。
これは何なんだろう 確実にAHKがダメだから
この際、keyhacに乗り換えるのが賢明、時間が勿体無い いつまでこのスレに粘着してんだよ
早く消えればいいのに
ここに居る人はkeyhacじゃ出来ない事が腐るほどあるからahk使ってんだし KeyHacも試してみましたが、こちらもやはり
Visual Studioを管理者権限で実行するとキーリマップが効かないみたいですね・・ >>473
一応確認しとくけど、Visual Studioそのものを操作したいなら、管理者権限が必要かもしれないのはAHKの方だぞ
AHKの側に権限が無いなら、>>469-470 は正常動作 ウインドウのハンドルを取って来て、そのウインドウ上に絵を描くことって出来ますか?
Dll等を使っても構いません
あるウインドウがあって、特定の場所がはっきりわかるように色を上書きして塗りたいのです。
既存のウインドウにデコレーションするというか
AHK以外でも、もしそういうことが出来る方法をご存じなら教えてください >>474
ありがとう!解決しました!
おっしゃる通りAHKを管理者権限で実行したらVisualStudioでもきちんと動きました >>477
WinGetでハンドルが取れる
WinGetPosでウィンドウのサイズと位置が取れる
Guiでウィンドウにかぶさるようなウィンドウを作ったり画像を表示できる
WinSetでウィンドウの表示領域や透明度をいじれる
こんなとこ? >>480
とってもいいヒントを頂きました。ウインドウに直接描画するのではなく、別のウインドウを作って
それにお絵かきして上に載せるということですね。で、WinSetで表示領域を加工するとか
ちなみに、AHKのGUIで、ツールチップのようにタイトルとか枠とかのないほんとにプレーンなウインドウって
作れますか >>481
F1::
Gui, Color, 00AA00
Gui, -0x00C00000 +ToolWindow
Gui, Show, W300 H200
Return
みたいな感じかな
あとはマウスイベント透過するとかWindowの切り抜きとか透過率とかはWinsetで指定
さらにWindowの移動やサイズ変更に追従させるとか、非アクティブ時や最小化時にhideするとかの必要があればそれも考慮する必要あるかな >>482
すばらしい。ありがとうございました。これは参考になりました ああ、実際にこれ、動かして試してみましたよ。これをベースにいろいろと考えてみます tooltipの背景色を変えることは出来ますか。その方法を教えてください MGLのジェスチャ表示が色付きだけどあれはツールチップじゃなくてGUIをツールチップっぽくしてるだけなのかな?
MGLのソース見てみたら分かるかも 特定のコントロールにマウスオーバーしただけで、そのコントロールにフォーカスを移すことは出来ますか?
教えてエロいひと。 1.MouseGetPosでマウス下のコントロールを取得できる
2.SetTimerで常にマウス下のコントロールを監視
3.取得したコントロールにControlFocus(必要に応じてWinActivateも追加)でフォーカスを移す
でどうだろう。スマートではないが。 >>489
ありがとうございます。
本来の目的を達成する方法はあるのですが。。
マウスオーバーはトリガーに出来なさそうですね。。。 再生デバイスを変更して
ポップアップに変更した端末名
が出るようなスクリプトを
Windows10でやり方教えて
いただけないでしょうか? >>488
割りとかんたん。
タイマーでモニターしてマウスオーバーでウィンドクラスを取り続けて変数によけとく
変数内のウィンドクラスとマウスオーバーで取ったクラスが違ったらそのウィンドクラスをアクティベートする
以前作ったけどウィンドの順序が切り替わりまくってボツにした ホットキーをトリガーにするのが嫌ならセットタイマー判定とかWhile判定でええんよって話 Run, explorer `/select`,"%path%"
ってやるとQTTabBarで新しいウィンドウが開いてしまうから
ファイル名を指定して実行でやってるんです。下記のように。
string = explorer `/select`,"%path%"
MGU_ExecuteByFileName(string)
MGU_ExecuteByFileName(exeString){
Send, #r
WinWaitActive, ファイル名を指定して実行,, 5
MGU_PasteString(exeString)
Send, {Enter}
Return
}
MGU_PasteString(string, pasteKeys := "^v"){
Backup := ClipboardAll
Clipboard := string
Send,%pasteKeys%
Sleep, 200
Clipboard := Backup
}
っていう風にしてるんですけど、これだとたまーーに実行文字列がNullになったり
するんで、もっといい方法ないですか?
ご教授お願いします。 >>494
OHP 見た感じ COM が使えそうなんだけど、どうだろう
http://qttabbar-ja.wikidot.com/scripting
qt := ComObjCreate("QTTabBarLib.Scripting")
qt.Open(path) >>494
QTTabBarは使ったことないのでいい加減だけど、タブブラウザみたいに
新規ウインドウで開くか新規タブで開くかオプションで設定できないのかな? >>494です。
>>495
どうも、ファイルを選択してフォルダを開くメソッドが無いみたいなんですが、
どうでしょうか?
>>496
shellexecutehookを利用してキャプチャするにチェックをしても、別のプロセスで
フォルダーウィンドウを開くのチェックを外しても
Run, explorer `/select`,"%path%"
とすると、新規ウィンドウで開いてしまうみたいです。
あと報告です。
Clipboard := string
の後に
Sleep, 100
を入れたらNullになる症状が今のところ出ていません。 >>491
少し脱線するけど俺は「App=Device」というコマンドラインで再生デバイスを変更できるフリーソフトを使用してる
AHKとこれを組み合わせてポップアップを表示したりすればお望みのことが出来るんじゃないかな
環境によっては管理者権限で実行する必要がある >>495
qs := ComObjCreate("QTTabBarLib.Scripting")
qs.Open("C:\Users\UserName\Documents")
aw := qs.ActiveWindow
at := aw.ActiveTab
at.SelectedItems := "Book2.xlsx"
と記述したらできました!ありがとうございました! 解決したみたいだから蛇足だけど起動中のエクスプローラ(qttab)と
ahkrun、ファイル名runで管理者権限の有無が統一されてなかったとか?
ファイル名runでだけ別プロセスにならない理由がよく分からんね ■ このスレッドは過去ログ倉庫に格納されています