AutoHotkey スレッド part30 IDのみ

■ このスレッドは過去ログ倉庫に格納されています
2022/02/08(火) 18:38:19.33ID:UTRGyCNl0
元々がIDのみの表示で番号の始まっているスレを途中から別の表示で乗っ取るのは「背乗り」行為に当たるので、IDのみの表示で進行とします

■配布元
https://autohotkey.com/download/

■前スレ
AutoHotkey スレッド part29
https://egg.5ch.net/test/read.cgi/software/1620768466/

■日本語解説等
AutoHotkey Wiki
http://ahkwiki.net
AutoHotkeyを流行らせるページ(ミラー)
http://hdd.s300.xrea.com/ahk/
AutoHotkeyJp(過去ログdatあり)
https://sites.google.com/site/autohotkeyjp/
Autohotkey日本語ヘルプ(chmファイル)
https://www6.atwiki.jp/eamat/

■スクリプト投稿
Autohotkey専用うpろだ
https://ux.getuploader.com/autohotkeyl/
簡易スクリプト掲示板
https://pastebin.com/

■その他のテンプレ(5chのURL規制が厳しいのでpastebinに退避しました)
https://pastebin.com/raw/bWipuNmt
2023/09/17(日) 04:31:37.96ID:sHFSptxP0
もうひとつ質問がありまして

上記のスクリプトを改変し、コンパイルしたexeを呼び出した際にSpotifyに !+{B} を自動で送信
その後AHKのexe自体を終了させたいのです

何がしたいかと言うと、遠隔で該当exeを実行するコマンドを送る度に !+{B} をSpotifyに送りたいという事なのですが
可能でしょうか・・・ 宜しくお願い致します。
2023/09/17(日) 05:22:22.98ID:AK0a2owI0
Spotifyを使ってないので適当に書くけど、普通にアクティブにしてから
キー送信するのはダメなの?

getSpotifyHwnd() {
WinGet, spotifyHwnd, ID, ahk_exe spotify.exe
Return spotifyHwnd
}

spotifyKey(key) {
spotifyHwnd := getSpotifyHwnd()
WinActivate ahk_id %spotifyHwnd%
Send %key%
Return
}

spotifyKey("!+{B}")
ExitApp

あと、送信するキーはBじゃなくてbじゃないの?
2023/09/17(日) 05:30:12.82ID:sHFSptxP0
>>526
ありがとうございます!できました!

ええ、Bじゃなくてbですね・・・ ググって出てきたスクリプトを書き換えたダケなんで色々理解していません・・・
{ } で囲う意味も分かって無くて、動かなかったから囲ったら動いた ぐらいのスキルです汗
2023/09/17(日) 05:52:40.93ID:AK0a2owI0
一つ目の関数が冗長なので単純化した

spotifyKey(key) {
spotifyHwnd := WinExist("ahk_exe spotify.exe")
WinActivate ahk_id %spotifyHwnd%
Send %key%
Return
}

spotifyKey("!+{b}")
ExitApp

getSpotifyHwnd()は消していい
2023/09/17(日) 06:06:33.03ID:sHFSptxP0
ありがとうございますー 完璧ですわ・・・

あとコレ >>524 になんとか改良加えようとしてます
これだとフォアグラウンドでもバックグラウンドでも発動するんですが、spotifyを最小化してると無理なんですよね
毎回フォアグラウンドにアクティブ化されると邪魔なので最小化している時だけアクティブにしたいカンジですがなかなかムズく・・・

>>528は外にいる時に呼び出す用なのでこのままで使い勝手がいいです
2023/09/17(日) 06:38:43.23ID:AK0a2owI0
これで良いんじゃないの?

spotifyKey(key) {
spotifyHwnd := WinExist("ahk_exe spotify.exe")
WinGet winMM, MinMax, ahk_id %spotifyHwnd% ;ウィンドウの最大化最小化を調べる
if (winMM = -1) ;最小化しているなら
WinRestore ahk_id %spotifyHwnd% ;最小化を解除
ControlFocus, Chrome_RenderWidgetHostHWND1, ahk_id %spotifyHwnd%
ControlSend, , %key%, ahk_id %spotifyHwnd%
Return
}

spotifyKey("!+{b}")
ExitApp

WinRestoreで正しく送信されないなら、WinActivateに変更
2023/09/17(日) 07:35:15.03ID:sHFSptxP0
>>530
おはようございます。ありがとうございます!
でもすみません、>>528は一回実行したら終了する遠隔操作用で、>>524は常駐させるヤツなのでExitAppせずにPauseボタンに"!+{b}"を割り振っておきたいんですよね
ExitApp消したりpause組み込んで修正したんですがうまくいきませんでした 申し訳ないです!
2023/09/17(日) 07:42:33.32ID:sHFSptxP0
ああ、こうですね できました。
が、細かいことですがフォアグラウンドに来てる時だけはキー無効になってしまいますね なんでだろ

spotifyKey(key) {
spotifyHwnd := WinExist("ahk_exe spotify.exe")
WinGet winMM, MinMax, ahk_id %spotifyHwnd% ;ウィンドウの最大化最小化を調べる
if (winMM = -1) ;最小化しているなら
WinRestore ahk_id %spotifyHwnd% ;最小化を解除
ControlFocus, Chrome_RenderWidgetHostHWND1, ahk_id %spotifyHwnd%
ControlSend, , %key%, ahk_id %spotifyHwnd%
Return
}
Pause::
{
spotifyKey("!+{b}")
Return
}
2023/09/17(日) 07:57:47.81ID:AgjEWBqI0
タブの選択とか実行とかをマウスでしかできないソフトにショートカットキーを追加する
前は座標を測って押してたけど、画像認識に変更した
画像ファイルを引数に指定すると押してくれる関数化したのですっきり
押した後、元のマウスカーソルに戻すので、そのうちahkでやってることを忘れる
2023/09/17(日) 13:24:44.00ID:FD5+4qql0
>>518
いいなーv2はrunscript()なんてあるんだ
dllcallでattachしてとか地味に長い関数書いてた

Run, %exec_command% %arg%,, Hide, pid
WinWait, ahk_pid %pid%
DllCall("AttachConsole", "UInt", pid)
WshShell := ComObjCreate("Wscript.Shell")
exec := WshShell.Exec("%ComSpec% /u /c " . exec_command . " " . arg)
output := exec.StdOut.ReadAll()
DllCall("FreeConsole")
2023/09/17(日) 14:08:18.16ID:RotPmQmd0
Release v2.0.9 · AutoHotkey/AutoHotkey
https://github.com/AutoHotkey/AutoHotkey/releases/tag/v2.0.9

> Fixed stacking of hotstrings with the X option.
> Fixed debugger not listing local vars if the function is at the bottom of the stack.
> Fixed Gui threads to show on the debugger's call stack.
> Fixed some combinations of &/ByRef causing stack overflow in ExitApp.
2023/09/17(日) 14:14:03.80ID:MyPIJBxa0
当分fix祭り終わらなそうだな
2023/09/17(日) 14:21:57.49ID:AgjEWBqI0
さっさとpython化しようぜ
2023/09/17(日) 14:40:09.89ID:vOzAWoz00
>>537
pythonにする理由は何?

ahkでできないこと?
2023/09/17(日) 14:41:24.90ID:AgjEWBqI0
スクリプト再発明してオーバーフローしたー、とか困らなくていい
2023/09/17(日) 15:00:43.17ID:RotPmQmd0
>>534
いや、ないだろ。
2023/09/17(日) 15:05:55.08ID:vOzAWoz00
>>534
これで
何やるの?
2023/09/17(日) 15:09:11.40ID:AgjEWBqI0
ahkのコア部分だけpythonのモジュール化して、キーの置き換えとかいろんな処理はpythonで書く
世界中の人が寄ってたかって便利にすることができる
で、コアだけのどかと差し替えると、スクリプトそのままで安定性が向上する
2023/09/17(日) 15:16:12.59ID:vOzAWoz00
>>542
それを
AHKでやらない意味がよくわかんない…

具体的に
2023/09/17(日) 16:40:52.99ID:ejOMxxCZ0
宗教だから触らない
2023/09/17(日) 16:59:13.01ID:FD5+4qql0
>>540
ないんかいw
2023/09/17(日) 17:23:24.31ID:RotPmQmd0
あらへんねんw
Run/RunWait は普通にあるけど、んなもんあったっけ?と公式リファレンスで見たけどない。
多分、Unix系のスクリプト実行よろしく1行目を見て実際に走らせる shell なりを
変えられるものちゃうか?
2023/09/17(日) 18:11:00.58ID:vOzAWoz00
>>546
Runとやりたいことが違うの?
何が違うの?
2023/09/17(日) 18:55:52.94ID:RotPmQmd0
>>547
それをワシに聞かれても知らんがな。
2023/09/17(日) 21:20:13.01ID:6mVDQMFc0
v2はいつになったら押しっぱが解消されるんだろう…
2023/09/18(月) 00:44:41.37ID:MCvojQwt0
>>549
ちょっと前のレスでもkey upさせる手法出てたけど、処理に装飾キー含まれるときに全部のkeyをupする関数とか入れたら?

holdup_key() {
local keys = ["Ctrl", "Shift", "Alt", "LWin", "sc079", "sc07B"]
for key in keys {
SendInput, {key up}
}
}
2023/09/18(月) 02:13:47.11ID:jPhetF1l0
それローカルの宣言する意味あるの?
2023/09/18(月) 07:32:17.17ID:DiSScFBT0
sleep 1 を入れた方がいいっぽい
ループ処理がそれに代わってるかもしれないけど
2023/09/18(月) 07:39:40.16ID:G+And54K0
*XButton1::
{
while GetKeyState("XButton1", "P")
{
Send {Blind}{WheelDown}
Sleep 10
}
}

v1は正常に動く
v2だと稀にGetKeyStateの状態が更新されずに永久ループする
2023/09/18(月) 07:50:20.70ID:DiSScFBT0
確率の問題なんだろうな
アトムであって欲しい処理のスリットが、v1よりv2の方が広い
ダーティでなくなった分だけ脆弱になってしまうっていう

どこでフックの奪い合いが起きても本質的に問題ない
という作りになってないと、どうしても不安定になる
2023/09/18(月) 13:07:34.00ID:cSd5nxXI0
>>553
これはダメだな

治るのか?
2023/09/18(月) 22:46:50.69ID:oUaH/YqD0
>>553
俺の環境ではそんなこと起こったことないが、公式フォーラムのバグレポート(未解決)に似たような報告があるな
v2ではSendMode("Input")がデフォルトになったが、このモードがGetKeyStateに干渉しているのではないかと推測されている
とりあえずEventモードなら発現しないらしいので
Send("{Blind}{WheelDown}")の所をSendEventにするか、SendModeをEventにしてしばらく様子を見てみて
2023/09/21(木) 18:09:14.32ID:/qgZEuhq0
お世話になっております!また教えて頂けませんか?すみません・・・

NumLock::Run,calculator:

Numロックで電卓を起動したいんですが、「既に起動している場合は、そのプロセスをアクティブにする」にあったコレを追加した時の全体の記述がわからないです・・・
単純に追加しただけだと無限に開けてしまいます

Process,Exist,calculator: ;起動しているかどうかを調べる
If ErrorLevel <> 0 ;起動していた場合(ErrorLevel変数にプロセスIDが格納される)
WinActivate,ahk_pid %ErrorLevel% ;そのプロセスのウィンドウをアクティブにする
Else ;起動していなかった場合
calculator: ;起動する
2023/09/21(木) 18:13:06.53ID:/qgZEuhq0
>>532
あと先日のコレですが、フォアグラウンドに来てる時にはショートカットが効かない原因が全然わかりませんでした
難しいッス
2023/09/21(木) 20:04:42.79ID:3aqubDRm0
>>557
If WinExist("電卓")
WinActivate, 電卓
Else
Run, calc.exe
2023/09/21(木) 20:33:27.57ID:/qgZEuhq0
>>559
ありがとうございます 動きました
サンプルと全然違ったw
2023/09/22(金) 18:18:33.75ID:QYS2Gl5t0
>>558
ifとelseで出来ました!ありがとう!
2023/09/22(金) 18:25:41.20ID:QYS2Gl5t0
else入ってなかったわ
2023/09/22(金) 21:16:52.43ID:QYS2Gl5t0
やっぱりだめでした 他のアプリがアクティブだとそっちでショートカットが発動してしまいます
2023/09/22(金) 21:27:25.15ID:Z0XFNyal0
そうですか

自分が書いたものを貼らないなら
そうですか
としか返せませんよ
2023/09/22(金) 22:05:39.07ID:QYS2Gl5t0
spotifyKey(key) {
spotifyHwnd := WinExist("ahk_exe spotify.exe")
WinGet winMM, MinMax, ahk_id %spotifyHwnd% ;ウィンドウの最大化最小化を調べる
if (winMM = -1) ;最小化しているなら
WinRestore ahk_id %spotifyHwnd% ;最小化を解除
ControlFocus, Chrome_RenderWidgetHostHWND1, ahk_id %spotifyHwnd%
ControlSend, , %key%, ahk_id %spotifyHwnd%

if (winMM = 1)
ControlFocus, Chrome_RenderWidgetHostHWND1, ahk_id %spotifyHwnd%
Send %key%
Return
}

Pause::
{
spotifyKey("!+{b}")
Return
}
2023/09/22(金) 22:05:51.98ID:QYS2Gl5t0
>>564
すみません上書きで消してたみたいでゴミ箱探したりしましたが結局みつからず、たぶんこんなかんじでした
spotifyに直接sendしてないせいですね あと関数やら97%わかってないせいです・・・
5~7行目だけだとSpotifyが最前面にアクティブな時だけ!+{b}が送られない理由がまるでわからくて
if (winMM = 1)以降は意味分かってないのにこうやったら行けた程度のヤツで実際何も分かってないでやってます
2023/09/22(金) 22:08:40.20ID:QYS2Gl5t0
今は電卓のと足してコレで凌いでます Spotifyの上以外では動作するので問題はないです

NumLock::
If WinExist("電卓")
WinActivate, 電卓
Else
Run, calc.exe
return

spotifyKey(key) {
spotifyHwnd := WinExist("ahk_exe spotify.exe")
WinGet winMM, MinMax, ahk_id %spotifyHwnd% ;ウィンドウの最大化最小化を調べる
if (winMM = -1) ;最小化しているなら
WinRestore ahk_id %spotifyHwnd% ;最小化を解除
ControlFocus, Chrome_RenderWidgetHostHWND1, ahk_id %spotifyHwnd%
ControlSend, , %key%, ahk_id %spotifyHwnd%
Return
}
Pause::
{
spotifyKey("!+{b}")
Return
}
2023/09/22(金) 23:03:49.16ID:Z0XFNyal0
これでどうかな

if (winMM = -1) {
WinRestore ahk_id %spotifyHwnd%
}
if WinActive("ahk_id " spotifyHwnd) {
Send, %key%
} else {
ControlFocus, Chrome_RenderWidgetHostHWND1, ahk_id %spotifyHwnd%
ControlSend,, %key%
}
2023/09/22(金) 23:10:08.94ID:aFWrFMGJ0
アクティブになってなかったらアクティブにしてから普通に Send, %key% すればいいんでないの?
2023/09/22(金) 23:16:19.36ID:QYS2Gl5t0
>>568
完璧に動作しました 毎度毎度すみません ありがとうございます
すげー・・・ ビルゲイツかな
2023/09/22(金) 23:17:51.06ID:QYS2Gl5t0
>>569
初心者とかそういうレベルじゃなくて、小学生が大学の講義に来てるような状態なんで汗
そもそもひらがなしか分かってない、みたいな
2023/09/22(金) 23:20:27.07ID:GiZ06ZcB0
>>565-567
これ、なんとなーく動いているようだけど
Chrome_RenderWidgetHostHWND1ってWindow Classでしょ
本来はClassNN、テキスト、コントロールのHWNDのいずれかを指定しなければいけないはずなんだけど
Chrome_RenderWidgetHostHWND1とかIntermediate D3D Window1とか
2023/09/22(金) 23:20:58.65ID:lHAlZ4YK0
一人ウィザードおるよな
何で動くのかじっくり解析しないと判らない
2023/09/22(金) 23:27:39.72ID:GiZ06ZcB0
あっちゃんとClassNNだったか、すまん俺の勘違いだった
忘れてくれ
2023/09/24(日) 14:22:42.43ID:3uyZatfe0
Release v2.0.10 · AutoHotkey/AutoHotkey
https://github.com/AutoHotkey/AutoHotkey/releases/tag/v2.0.10

Fixed crashing when a named function hotkey is used after #HotIf.
Fixed numeric literals ending with a dot to not cause line continuation.
Fixed pre-increment/decrement to work with chained array indexing.
Fixed OnNotify/OnCommand applying styles only applicable to OnEvent.
Fixed FileExist/DirExist leaking handles when emptydir\* is used.
Fixed DirExist leaking handles when only files match.
2023/09/24(日) 14:28:51.71ID:rEh5+F890
なんでそんなに不安定なの
2023/09/24(日) 14:29:05.38ID:tlr4nZzK0
ユーザーの移行が本格的に始まったのか
フィードバックが増えたんだろうな
2023/09/25(月) 00:41:40.07ID:Vz/pMkdm0
あるソフト(実行ファイル名をfoo.exeとします)のショートカットを殺しつつ、日本語文字入力中のショートカットは殺したくないのですが、なにか上手くやる方法はあるでしょうか?

例えば、foo.exeのショートカットキーCtrl+Uを無効にしつつ、
foo.exe内のテキストボックスで日本語入力をしているときにはIMEのCtrl+Uの機能を有効のままにしたい、
という感じです
2023/09/25(月) 00:44:10.82ID:Vz/pMkdm0
>>578
間違えて途中で送信しちゃいました

foo.exeのCtrl+Uを無効にしようとして.ahkファイルに
#IfWinActive,ahk_exe foo.exe
^u::
とすると日本語入力中のCtrl+Uまで無効にされてしまい困っているという状態です
2023/09/25(月) 01:22:43.19ID:H0BPCsvf0
Open InterpreterにAHK組み合わせたら本当の意味でのAutoHotKeyが実現できて笑ってる
2023/09/25(月) 08:25:29.27ID:+xBY+Yqs0
>>578

if (!A_CaretX) ;テキスト入力カーソルがオフの場合
処理A

は試しました?
2023/09/26(火) 04:45:18.81ID:8jjFqO/J0
>>581
これ知らなかったので試してみましたがダメでした
多分カーソルがあるときに適用される、という感じですよね?
結局どっちも無効になってしまいます
2023/09/26(火) 09:02:12.31ID:UqTVMUhE0
(´・ω・`).。oO(「foo.exe」とかアプリ名を何で伏せるんだろう…)

・foo.exe側でCtrl+Uの割り当てを無効に変える(別のキーに割り当てる)
・日本語入力中のCtrl+Uの代わりにF6を押下する
・ahkでCtrl+U押下したらF6送出するようにする(foo.exe側のF6に何も割り当てがないこと)

この内のどれかで対処する(自分が思いついたのはこれだけだった)
2023/09/26(火) 10:16:47.57ID:/VFCsiDa0
エロい奴だから
585名無しさん@お腹いっぱい。
垢版 |
2023/09/26(火) 12:10:25.33ID:BqRz5POi0
エロいやつをホットキー入れてまで起動してるやつおらんやろ
2023/09/26(火) 12:12:30.33ID:/VFCsiDa0
全てのテクノロジーはエロを原動力に発展している
2023/09/26(火) 13:03:53.20ID:Y07m41ei0
chromeとかelectron系はキャレットが独自実装だから取得できないよ
昔ACCライブラリで検出しようとして上手く行かなかったわ
X=%Caret_Location.x% Y=%Caret_Location.y%
2023/09/27(水) 22:43:18.37ID:5u5WHwU70
>>583
伏せないほうがいいdすかね?Win版LINEです
2023/09/28(木) 20:08:11.30ID:SIZ6DkpS0
tooltipにemoji表示する方法ありますか?
2023/09/28(木) 21:09:38.26ID:Nf8VDUte0
モノクロやけど普通に出るやろ
ToolTip "🍦", 100, 150
2023/09/30(土) 03:56:22.34ID:EHs419dZ0
IfInString, a, m
hensuu:=1

aという変数の中にmという文字があると変数を変えるっていうだけの話なんですけど

IfInString, a, 1
hensuu:=1

IfInString, a, 2
hensuu:=1

IfInString, a, 3
hensuu:=1
と検出する文字列が複数になったときにやってられないんでループで回そうとしているんですが

list=[1,2,3・・・・]

Loop,% list.Length()
{
IfInString, a, list[A_Index]
hensuu:=1
break

としているんですが、”へんすう”が0のままでbreakされているようです
原因は何でしょうか?
2023/09/30(土) 07:13:52.00ID:aunpj35J0
原因はv1を使ってることです
2023/09/30(土) 07:49:51.39ID:FJNgzxOZ0
>>591
ifの後をブロックで囲ってないからifに関係なくbreakされる

あと
>list=[1,2,3・・・・]
ここと
>, list[A_Index]
ここも直さないと期待通りには動かない
2023/09/30(土) 07:58:11.28ID:nXp5JoSn0
>>591
その例だとこうだろ

hensuu:=0
a:="bred"
list:=["red","green","blue"]

Loop,% list.Length()
{
If InStr(a, list[A_Index]) {
hensuu:=1
break
}
}
msgbox % hensuu

IfInStringは廃止(予定)だから使うべきじゃない
関数のInStrを使う
あと、listの後にコロンが入ってない
文字列なのにダブルクォーテーションでくくってない
2023/09/30(土) 08:11:22.14ID:8kGAhi8Z0
ちゃんとlistの長さ分だけループ周ってるの?
とか
list[A_Index]がちゃんと複数文字列としてループ内で展開されてるの?
とかもあるけど
そもそもの話としてIfInStringじゃなくてcontains、RegExMatch()あたりを使うべき処理かと
2023/09/30(土) 08:16:16.25ID:nXp5JoSn0
普通は検索要素がそう多くなければ正規表現でちょちょってやるような処理よ
フラグを立てるだけならfalseとtrueを使った方が後でソースを見返すときに
分かりやすくていいぞ

hensuu:=false
a:="bred"
if RegExMatch(a,"red|green|blue") {
hensuu:=true
}
msgbox % hensuu
2023/09/30(土) 22:12:19.26ID:WWZtyfbn0
AutoHotkey初心者です。
質問があります。↓のようなスクリプトを書いて実行させました(verは1.1です)。

;「無変換」が単独で押されたら、「Backspace」が押されたことにする。
vk1D::Send,{Blind}{Backspace}
;「変換」が単独で押されたら、「Enter」が押されたことにする。
vk1C::Send,{Blind}{Enter}

通常の「Backspaceキー」と「Enterキー」ですと、キーを押し続けると削除や改行をし続けますが、
このスクリプトだと「無変換キー」と「変換キー」を押し続けても何も反応はなく、
押し上げてやっと1回だけ削除や改行をします。
これを通常の「Backspaceキー」と「Enterキー」と同じように、
キーを押し続けると削除や改行をし続けるようにするにはどのようなスクリプトを書けばいいのでしょうか?
2023/09/30(土) 22:25:35.84ID:FJNgzxOZ0
↑いつもの荒らしです
触らないように
599597
垢版 |
2023/09/30(土) 22:30:58.14ID:WWZtyfbn0
>>598
いいえ、私は荒らしではありません。
本当に分からないことがあったので、質問させていただきました。
600名無しさん@お腹いっぱい。
垢版 |
2023/09/30(土) 22:31:34.90ID:lxiWU+kb0
Blindは大抵変なことになるな
2023/09/30(土) 23:10:22.54ID:g6QA9piE0
>>597
これなんかおかしいよ
Blindで修飾キーの押下の可能性をを示唆しているのに
無変換の単独キーって、よくわからん

例えば、Shift + BS とか Ctrl + BS は普通にエディタ使っていると
人によっては、まあまあ使うんだけど
Shift + 無変換で Shift + BS になってほしいのか、ほしくないのか?
どっち?
602597
垢版 |
2023/09/30(土) 23:37:47.61ID:WWZtyfbn0
>>601
私はAutoHotkey初心者なので、「Blind」の意味もよく分かっていません。
参考にしたスクリプトに「Blind」が入っていたので、自分の方でも入れているだけです。

「Shift+無変換」で「Shift+Backspace」にはなって欲しくないです(必要と感じていないため)。

しかし、「Shift+変換」で「Shift+Enter」にはなって欲しいので、
>>597には省略して書きませんでしたが、実際のスクリプトは↓のようになっています。

;「変換」が単独で押されたら、「Enter」が押されたことにする。
vk1C::Send,{Blind}{Enter}
;「Shift+変換」が押されたら、「Shift+Enter」が押されたことにする。
+vk1C::Send,+{Enter}

省略した理由は、「Shift+変換」は押し続けて反応して欲しいわけではなかったからですが、
今、試してみたところ、↑のスクリプトだと、「変換」単独だと押し続けて反応はしませんが、
「Shift+変換」は押し続けて反応しますね。

私の希望は以下の3点です。
@「無変換」を押し続けると「Backspace」を押し続けたように動作して欲しい。
A「変換」を押し続けると「Enter」を押し続けたように動作して欲しい。
B「Shift+変換」を押したら「Shift+Enter」を押したように動作して欲しい。
2023/09/30(土) 23:42:14.27ID:KnLHxxU/0
>>597
単独で押されたら って書いているということは別の行に
無変換+何かのキーとかのスクリプトを書いているんじゃないの?
2023/09/30(土) 23:47:22.86ID:KnLHxxU/0
>602
{Blind}付けるなら +vk1c:: の行は要らないのでは?
2023/10/01(日) 00:07:27.97ID:aO5V046V0
>>602
無変換だけサンプルで
変換の方はわかると思う

vk1D::BS
+vk1D::Del ;Shift + 無変換でdel
;*^vk1D:: ;Ctrl + 無変換は受け付ける
;他の修飾キーと無変換の組み合わせを無効化
*!vk1D::
*#vk1D::
return

当然だけど、無変換 + a など無変換を修飾キーとしたホットキーを混ぜると正しく動作しない
そういうのも使いたいなあとなると、押下時間などを考慮した多少面倒なコードを書く必要がある
そうすると誤爆したりする可能性があるのでお勧めしない
606597
垢版 |
2023/10/01(日) 00:24:47.36ID:5y0E7yg10
>>603
そうです。別の行に↓のようなスクリプトを書いています。

;「無変換+Q」が押されたら、「Alt+←」が押されたことにする(戻る)。
vk1D & q::Send,!{Left}
;「無変換+W」が押されたら、「Alt+→」が押されたことにする(進む)。
vk1D & w::Send,!{Right}


>>604
今、試してみましたが「+vk1c:: の行」を消すと、
「Shift+変換」を押したら、「Shift+Enter」を押したように動作しなくなります。


>>605
スクリプト、どうもありがとうございます。

別の行に「無変換+何かのキー」のスクリプトを書くと、
「無変換」を単独で押し続けた時に「Backspace」を押し続けたように動作しなくなるということですか?
そうならば、無変換キーを修飾キーとしたホットキーは使い続けたいので、
「無変換」を単独で押し続けた時に「Backspace」を押し続けたように動作して欲しいという希望は諦めることにします。
2023/10/01(日) 00:44:40.72ID:aO5V046V0
>>606
無変換の単独押しでリピートしなくなる
他はいける
組み込んで試してみなよ
608597
垢版 |
2023/10/01(日) 08:03:39.09ID:5y0E7yg10
>>607
おっしゃっていることがよく分かりません。

私は「無変換」を「修飾キー」として使った上で、
「無変換」単独押しをした時は(Backspaceキーとして)「キーリピート」をして削除し続けて欲しいのですが、
それはできないということでしょうか?
2023/10/01(日) 08:09:26.00ID:vJZ6he//0
>>608
無変換+q をやりたい時にまず無変換キーを押すと思うんだけど、
そこから1秒程度経過してしまったら自動的に削除リピートが始まって欲しいと?
2023/10/01(日) 09:14:16.51ID:jCSy+5iI0
キートップの文字を書き換えたかのように、そのキーを完全に置き換える
どんな組み合わせで押しても置き換わって動作する

という挙動をahkで書くのはなかなか大変だけど、
yamyでは1行だったんだよな
2023/10/01(日) 09:37:27.76ID:1MOKFxYN0
>>608
修飾キーっていうのは単独押しでは作用しないから修飾キーなわけでしょ
例外はWinキーで、これは単独だと離したときにスタートメニューが発動するから成立している
これを無変換に当てはめるとすると、離したときにBSが発動してたらキーリピートになりようがない
だから前のレスで書いたように、押下時間でリピートになったり、修飾キーになったりみたいな
仕組みにする必要がある
ただBSなんかは瞬時に発動してくれないとイラつくだけだと思うんだよね
修飾キーのつもりで押したのに文字が消えたとか誤爆もあるし
612597
垢版 |
2023/10/01(日) 10:23:09.43ID:IXVZWApm0
>>609
その通りです。

>>611
分かりやすい例えをありがとうございます。

私の希望は複雑なコードを書けば実現できそうではあるけれども、実現できたところで誤爆の可能性が高くなるのでお勧めしないということですね。
分かりました。実現できたところで不便そうなので、現在のスクリプトのまま使い続けようと思います。
613名無しさん@お腹いっぱい。
垢版 |
2023/10/01(日) 18:48:40.48ID:MIF/cMMY0
クリップボードに画像ファイルがコピーされた時に、それを開いて画像データをクリップボードに持つようにしたいのですが、どう書くのがいいでしょう?
powertoyでもできたりしますか?
2023/10/02(月) 07:50:12.52ID:Y0OCwQiz0
>>613
正:それを開いて画像データをメモリに持つ
誤:それを開いて画像データをクリップボードに持つ
ということ?

Win10/11 以降の Snip & Sketch/Snipping Tool なら特に何もせんでも
頭36yte分の Clipborad の header/Signature? を読み飛ばしゃ PNG の
画像データがそのまま入ってる。

それ以前の場合はちょっと面倒で、歴史的経緯?でちょっと古い形式での
Windows BMPデータが入っているっぽいので色々と変換せんと、今どきの
BMPデータにならない。
615名無しさん@お腹いっぱい。
垢版 |
2023/10/02(月) 19:37:50.10ID:tI65VkKa0
AHK v2 の fat arrow function は

() => expr

というフォーマットで、式だから 1行しか書けない

() => 123

{} が来る場合は JavaScript のように複数行書けたらいいのにな

```
() => {
a := 123
b := 456
return a + b
}
```

のように

比較的簡単に実装できそうだけど、実装すれば breaking change になってしまう
現状だと () => {} はオブジェクトを返すという意味なので。
JavaScript の場合は、{} が来たら例外的に関数本体として扱われるようになっていて便利だ
2023/10/02(月) 19:38:02.65ID:4IbfaSx20
ahk v1.1です。
エクスプローラーで使用しています。
IME.ahk を使用しています。

文字入力中(名前の変更や検索欄入力)だった場合は、 a
そうでない場合は、+^a のスクリプトにしたいのですが
下記の方法だと文字入力中の判定がうまく出来ないので
教えていただきたいです。

a::
If IME_GetConverting() = 0 {
Send, +^a
}else{
Send, a
}
Return
2023/10/02(月) 19:38:16.12ID:4IbfaSx20
ahk v1.1です。
エクスプローラーで使用しています。
IME.ahk を使用しています。

文字入力中(名前の変更や検索欄入力)だった場合は、 a
そうでない場合は、+^a のスクリプトにしたいのですが
下記の方法だと文字入力中の判定がうまく出来ないので
教えていただきたいです。

a::
If IME_GetConverting() = 0 {
Send, +^a
}else{
Send, a
}
Return
2023/10/02(月) 19:38:30.91ID:4IbfaSx20
ahk v1.1です。
エクスプローラーで使用しています。
IME.ahk を使用しています。

文字入力中(名前の変更や検索欄入力)だった場合は、 a
そうでない場合は、+^a のスクリプトにしたいのですが
下記の方法だと文字入力中の判定がうまく出来ないので
教えていただきたいです。

a::
If IME_GetConverting() = 0 {
Send, +^a
}else{
Send, a
}
Return
2023/10/02(月) 22:31:01.66ID:JWMVaWUA0
>>615
関数の形式で書かせてほしいよね
今でも一応は,で並べて書けるけどループを書こうとすると再帰呼出しになるし
まだ末尾呼び出し最適化がないから、ちょっと気にしながらになるのもなんかな
2023/10/03(火) 17:39:12.06ID:2DNPH3ID0
>>618
あなたがやりたいことは>>581の方法で実装できます
ただし、検索欄等のキャレットは取得できないかもしれないので
その場合は ControlGetFocus でコントロール名を照合するなどの別のアプローチが必要になるかもしれません

蛇足ですが IME_GetConverting() は変換候補ウィンドウが表示されているかどうかを判別しているだけなので
直接入力時や変換未確定(文字列に下線が付いてるだけの状態)時は文字入力中と判断されません
また、IMEの仕様上の問題で別のプロセスから入力コンテキスト(変換中の情報)を取得することはできないので
外部アプリの文字入力中かどうかの判定にはそのアプリに適した様々な方法を試す必要があります
2023/10/03(火) 19:30:40.48ID:759jFrqH0
IME.ahkを有志が一部v2対応してた
https://github.com/kdr-s/ime.ahk-v2/blob/master/IME.ahk

GETとSETのみ
2023/10/04(水) 18:56:24.73ID:tIruFCPa0
重い腰を上げてようやくv2に移行したがv2最高だわ
普通の文法のプログラムが書けるというすばらしさ
v1のサポートさっさと打ち切ってネット上の醜いv1のコード駆逐してほしい
2023/10/04(水) 22:35:25.70ID:kSzEGkao0
>>621
完全版
https://github.com/k-ayaki/IMEv2.ahk/blob/master/IMEv2.ahk
624名無しさん@お腹いっぱい。
垢版 |
2023/10/05(木) 06:02:55.84ID:bWuMkV3d0
>>615 です
関数本体を宣言できる機能が1ヶ月前に v2.1-alpha で追加されたみたいです

書き方は、
() => {}
ではなく、
() {}
こうするらしい
(たしかにこれだと breaking change にならない)

```
SetTimer(() {
MsgBox "5 second timer expired."
}, -5000)
```

使い捨ての関数を宣言したいことはよくあるので便利そう

https://www.autohotkey.com/docs/alpha/Functions.htm#funcexpr

alpha で追加されたことに気づかずに forum で feature request して、
更に実装日を1ヶ月勘違いして数日前に実装されたのかと勘違いして返事してしまった
■ このスレッドは過去ログ倉庫に格納されています
16歳の水野カイトが封印の刀を見つけ、時間が裂けて黒い風と亡霊の侍が現れ、霊の時雨と契約して呪われた刀の継承者となる場面

ニューススポーツなんでも実況