AutoHotkey スレッド part28
■ このスレッドは過去ログ倉庫に格納されています
!extend:on:vvvvv:1000:512 !extend:on:vvvvv:1000:512 !extend:on:vvvvv:1000:512 ■配布元 http://ahkscript.org/download/ ■前スレ AutoHotkey スレッド part27 http://egg.5ch.net/test/read.cgi/software/1555770773/ ■日本語解説等 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: default:vvvvv:1000:512:: EXT was configured Include先も含め、AutoHotkey.ahkに関係するホットキー全体で 変数を共有するためには、その都度IniReadするしかないですか? グローバル変数的な何かはないのかなと。 可能なら、AutoHotkey.ahkからのInclude先AHKファイルで定義した変数を共有したいのですが。 下のような構成で、bを押したときにaaAAaaと表示させたい [AutoHotkey.ahk] #Include a.ahk #Include b.ahk Return [a.ahk] AAA := "aaAAaa" a1::Return a2::Return [b.ahk] b::MsgBox, % AAA その状態でAutoHotkey.ahkを動かす分にはいける [AutoHotkey.ahk] AAA := "aaAAaa" a1::Return a2::Return b::MsgBox, % AAA Return includeは全てAutoHotkey.ahkとして展開されるので↑と同義になるから ただしaとbのincludeを逆にしたらautoexrcuteが働かない includeの位置は要注意 [AutoHotkey.ahk] b::MsgBox, % AAA AAA := "aaAAaa" a1::Return a2::Return Return あと当然だが a.ahk / b.ahk を単体起動した時はAutoHotkey.ahkから起動した時のようには動作しない >>5 わかりました、ありがとうございます。 Includeは内容を展開しているだけだったのですね。 まずInclude元でAutoexecuteが開始し、Includeがあればその先のReturnまでAutoexecuteされ、 またInclude元に戻って、そのInclude元のReturnまではAutoexecuteされるものだと思っておりました。 自分のスクリプト郡は、Include先でReturnがあったためにそこでAutoexecuteが終わってしまっていた訳ですね。 ところで以下ような感じに、ファイルごとに役割を分け、 またそれぞれのファイル内でしか使わない変数はそのファイル内に収めておきたいのですが、 その方法はありますでしょうか?(下の構成ではInputA.ahkの2行目でAutoexecuteが終わってしまいますよね。) あまり美しくないですが、AutoHotkey.ahkの先頭にVariables.ahkのようなものをIncludeして、そこで変数リストを作るとかしかないですかね? [AutoHotkey.ahk] #Include InputA.ahk #Include InputB.ahk [InputA.ahk] textA := "A" a::MsgBox, % textA d::MsgBox, % (textA . "D") [InputB.ahk] textB := "B" b::MsgBox, % textB c::MsgBox, % (textB . "C") イニシャライズを各AHK内で完結させたいならsubかfunctionにしてcall ただし全体のグローバル変数であるという事実は変わらんが エラった時のpastbin AHKのハイライトもあるのね https://pastebin.com/dkUfkDTj ただこれだと一時的に#includeをコメントアウトで外したいときにautoexecuteの 手直しも必要になるので islabel() isfunc() を入れたほうがいいかも >>10 なるほど確かにこれなら実現できますね! ありがとうございました、とても勉強になりました ところで下のようにしてみたのですが、#Include では変数が使えないみたいですね。 何かいい案はないでしょうか? というのも、実際は10以上のファイルがあるので、ダラダラ書くよりLoopで回したいものでして・・・ https://pastebin.com/g2Gc1cDU 無理だが いっそ関数ライブラリ化して全部 %A_ScriptDir%/Lib に押し込むという手もある したらincludeそのものが不要になる >>11 Includeするahk内で更にInclude出来るはずだぞ(その内容は「#Include 〜.ahk」だけでも良い) だからメインahk(AutoHotkey.ahk)内でのInclude用ahkの名前は固定しといて メインahkでそのahkファイルを書き換えすれば手直しは要らなくなると思う 例として、メインahkにIncludeするファイル名を「Include_ahk.ahk」とし Include_ahk.ahk内は ----------------------------------- #Include InputA.ahk #Include InputB.ahk ----------------------------------- ↑の2行はメインahkのautoexecute内で検索→名前取得→書き込み処理を実行して この処理の後に「#Include Include_ahk.ahk」を記述する 拙い説明 & 出来なかったらスマヌ もしアレだったらMGLのスクリプトが参考になると思う >>13 >もしアレだったらMGLのスクリプトが参考になると思う ごめん真っ新なMGLでは参考にはならないかもしれないのでこの件は忘れて https://www.autohotkey.com/docs/commands/_Include.htm マニュアル読み直してたらv1.1.28以降はErrorlevelとコマンドライン文字列以外のすべての組み込み変数が有効とあるね Loop,Filesのローカル組み込み変数はどうなんだろ もし使えるなら↓みたいにできるのかも(出先からのなので試してはいない) #include %A_SprictDir% Loop, Files, %A_SprictDir%\*.ahk, F If (A_LoopFileFullPath != A_SprictFullPath) #include %A_LoopFileName% ↓以下テンプレ(微修正) ---------------------------- !extend:on:vvvvv:1000:512 !extend:on:vvvvv:1000:512 !extend:on:vvvvv:1000:512 ↑スレ立てする時は3行にして下さい ■配布元 https://autohotkey.com/download/ ■前スレ AutoHotkey スレッド part27 https://egg.5ch.net/test/read.cgi/software/1555770773/ ■日本語解説等 AutoHotkey Wik 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/ ■重要事項 オリジナルである、旧 "AutoHotKey" の開発は2009年9月で終了している。 現在は、そこからフォークした "AutoHotkey_L" が主流となり、2014年1月からは後のLが取れ 正式にAutohotkeyとして扱われるようになりました。 よって古いスクリプト(主にDllCall)は最新Verで動作しないものがあり、その場合はスクリプトの修正が必用です。 旧版のAHK1.0との変更点多数。新しい仕様や互換性についてはドキュメントを良く読むこと。 https://www.autohotkey.com/docs/AHKL_Features.htm http://ahkwiki.net/Addition_L ※新規利用者には最新版を推奨しますが、AHK1.0(2009年9月までのVer)の利用者はAHK1.1への移行に際して 少なからず改修が必要となります。特に、旧流行らせるページの配布物(MouseGesture等)の多くは そのままでは動作しません。安定利用できている環境を崩して移行するかどうかは各人の判断による。 MouseGestureについては有志の方が最新AHK対応版(MouseGestureL.ahk)を配布しているのでそれを利用するのもありです。 https://hp.vector.co.jp/authors/VA018351/mglahk.html ※ACC.ahk(旧版用)とCOM.ahkはフォーラムのリンク先にファイルが存在しませんので下記から入手してください。 https://ux.getuploader.com/autohotkeyl/download/24/ACC%2BCOM.zip ※Unicode版のACC.ahkは下記(AccInfoViewer.ahk付き)またはフォーラムから入手してください。 https://ux.getuploader.com/autohotkeyl/download/76/ACC_Unicode_and_AccInfoViewer_kai.zip ■質問に際して OSの種類(7/8/10)や32/64ビット版の違い、利用するAutoHotkeyのバージョンを明記すること。 また、操作したいソフト・やりたい処理などは具体的に書いた方がレスが付きやすい傾向にある。 5chの仕様の関係で、このスレではインデントに全角スペースを使ってコードを貼り付ける事があるので、 レスをコピペして利用する場合は行頭の全角スペースをタブ等に置換してから利用すること。 以下FAQ等 ■実行環境 Q1:スクリプトに書いた日本語が文字化けしちゃうんだけど... A1:スクリプトファイルを「UTF-8」の「BOM」付きで保存する。(AHK1.1) Q2:初めて使うけどどれを使えばいいの? A2:AHK1.1のユニコード版を推奨。 旧流行らせるページの配布物をそのまま使う場合はAHK1.0を利用する事。 64ビットOSでAHK1.1、32ビット版の使用は制約が多いので64ビット版を強く推奨。 ■リマップ・ホットキー割り当て Q1:[CapsLock(英数)][ひらがな][全角/半角]キーの割り当てがうまくいかないよ A1:OSのローカライズ段階で発生してる問題なので日本語環境だとLock系キーの動作は不定。 OS側がキーUp/Down情報を正しく返してこないのでAHKのみで対処は無理です。 レジストリ変更等で別キーへ再配置を行い、AHKで割り当てを行うという二段構えが必要。 例) ChangeKeyを使って[ひらがな]を[F13]にする AutoHotkeyで任意のキーをF13にリマップする(例えばF12をF13にリマップし、スクリプトを実行)。 F12::F13 Changekeyを起動する。( https://forest.watch.impress.co.jp/library/software/changekey/ ) 「調査」→「どのキーなのか?またはスキャンコードでキーを変更します」を選択。 F12を押すとスキャンコード(0x0064はF13)が表示されるので覚えておき「終了」をクリック。 「ひらがな」キーをクリックすると「【ひらがな】キーをどのキーに変更しますか?」という ウィンドウが表示されるので右上の「Scan code」をクリック。 覚えておいたスキャンコード(0064)を入力し、「OK」ボタンをクリック。 「登録」をクリックし、Windowsを再起動する。 Q2:「^1::Esc」とリマップ定義したけど [Ctrl]+[1] を押したらスタートメニューが出ちゃうけどどうすればいいの? A2:リマップは修飾キー(Ctrl,Shift,Alt,Win)の押下状態を引き継いでキー発行するので、[Ctrl]+[Esc] がキー送信されるため。 これを避けるには、「Send」コマンドを利用して明示的に修飾キーなしのキーを発行をすればよい。 ^1::Send, {Esc} Q3:[Shift], [Ctrl], [Alt], [Win]以外を修飾キーとしてキー割り当てしたいよ A3:コンビネーションキーの機能で実現ができる。 例) 無変換 + IKJLキーをそれぞれ「↑↓←→」に割り当てたい場合は以下のように記述する。 sc07B & I::Send, {Blind}{Up} sc07B & K::Send, {Blind}{Down} sc07B & J::Send, {Blind}{Left} sc07B & L::Send, {Blind}{Right} Q4:「XX hotkeys have been received in the last XXXXms.」って怒られるんだけど、、、(XXは環境による) A4:多分自分自身のキーを送って無限ループになっている。 例) 「a::Send, a 」 先頭に $ を付ければ回避できる(NT系のみ)。 例) 「$a::Send, a」 #UseHookで全部にキーボードフックを適応する方法でも可。 Q5:キーリマップを使うとキー押下中に連打するけど、マウスボタンの場合は連打しない… A5:マウスはキーリピートしないので、Loopなどを使って自前でリピートさせてください。 Q6:ジョイスティックのリマップがうまくいきません!!助けて A6:ジョイスティックではリマップできない。「Send」コマンドでキー発行する必要がある。 × Joy1::Esc ○ Joy1::Send, {Esc} Q7:ジョイスティックの上下左右に割り当てたいけど、JoyLeft,JoyUpってホットキーは無いの? A7:無い。AHKのジョイスティックサポートはかなり貧弱なのでプログラマブルにやる必要がある。 Q8:ジョイスティックのボタン1とボタン2の入れ替えなどはどうやってやるの? A8:AutoHotkeyではできない。 Q9:[Ctrl][Shift][Alt]が押されっぱなしになる時がある。これってAHKのせい? A9:AHKが原因の場合とそうでないときがある ○AHKが原因の場合 AHKには、以下のような修飾キー付きのホットキーで修飾キー無しでキーを発効する場合、 一時的に修飾キー押下を解除して、発効後に押下状態を再度設定する機構がある。 しかしこのように発効するキーストロークが多い場合は、Sendコマンドが完了する前に 物理キーが押下解除されてしまっている場合がある。この齟齬が押しっぱなしの原因となる。 例) ^W::Send, {w 30} これを回避するためには、以下の方法をとればよい: ・キー押下状態を常に監視するキーボードフックを導入する(#InstallKeybdHook) ・キー発効のコマンドを SendInput, SendPlay にする(SendModeで一括指定でもよい) ・上記二つが出来ない場合は、SetKeyDelay, 0 等としてキー発効をなるべく早く行うか、 #HotkeyModifierTimeout で修飾キー押下のタイムアウト値を長めに設定をする。 なお、他のキー発効を行うツール(クリップボードユーティリティやマウスジェスチャツールなど)が、 発効する修飾キーが原因となる場合もあるが、フックの導入でほぼ解決出来ると思われる。 ○AHK以外が原因の場合 環境により異なるので何とも言えないが、以下のような環境の場合発生する事が報告されている。 ・Logicool(Logitec)のマウスユーティリティSetPoint(verによっては問題ない事もあるとか)など他多数 ・VirtualPC, WMWare, 窓使いの憂鬱 等のキーボードフィルタドライバを用いるアプリケーションを使っている 皆さんありがとうございます。 >>12 今回は、関数に落とし込まない方針で行きます。 >>13 つまり、↑のPastebinで貼ったコードにあるincludeFilesはInclude_ahk.ahkの記述内容から取得して、各ahkの初期化セクションへGoSub その後Include_ahk.ahk自体を読み込むということですか? 記述内容から読み出す方法がわからないので勉強してきます。 それから、MGLのスクリプトは現状読めない+あまり複雑にはしたくないので、もしかしたら現状のままメインahkで2箇所を修正する方針でいくかもしれません。 >>15 読みました。 Include指令ではLoop系の組み込み変数は使用できないのではないですか? 工夫して、%A_LoopFileName%の部分を書き換えられれば良いと思うのですが、いかがでしょうか。これは難しいですか? ジョイスティックの傾きを GetKeyState, X, JoyX, P で取得しようとしても、「49.999237」の値しか取得できない。 だけど、autohotkeyのメニュー画面がアクティブの状態だと正常に取得できる。 他のウィンドウでも正常に取得できるようにするにはどうすればいいでしょうか >>23 試したけど他のウィンドウでも普通に取得できるんだが? >>24 そうすると自身のpc環境特有の問題っぽいですね。 再インストとかいろいろ試してみます >>25 ちなみに中央値は49.999237で合ってる スティック左に倒したときは0.001526、右に倒した時は100.000000 環境というよりも何か根本的な勘違いじゃね AHKの画面アクティブだけ動くってとこからして ↓以下テンプレ ※規制が厳しくなったせいで貼るときに浪人がないとBBQに規制されるので注意!! https://pastebin.com/aYGhWqyJ おかげで手持ちの回線全部焼かれた (#^ω^)ビキビキ F13+WASDなどでカーソルを動かせるようにしてみたけど、それ以外のキーを押すと 普通に文字が入力されてしまう。 たとえばEを押しても入力されないように無視することはできない? F13 & e:: Return 誤爆しそうなWASD周りを一通り入れときゃ良いんじゃね >>29 LowLevelKeyboardProcを使って入力を破棄する方法 大量のホットキーを登録しないで済む https://pastebin.com/rcNGBzVV ホットキーやタイマーでラベル名の代わりに関数指定できるけど ここで指定した関数ってLibに置いといても自動で#Includeされないのね OneNote2016でSend, {Up}とSend, {Down}が動作しない問題が あっさり解決したから一応共有しとく OS: Windows 10 AHK Version: 1.1.32.00 #If, WinActive("ahk_exe ONENOTE.EXE") vk1D & i::ControlSend, OneNote::DocumentCanvas1, {Up} vk1D & k::ControlSend, OneNote::DocumentCanvas1, {Down} #If >>35 AHK_L1.1.08.01では #IfWinActive ahk_class Framework::CFrame ^E::SendInput {blind}{UP} ^X::SendInput {blind}{DOWN} #If で動作してるが、もしかして非互換性の問題とか? >>36 こっちの環境では動作しないみたい ネットにはいろいろ情報転がってたけど、おま環だらけだったし、 >>35 に書いたやつも俺環かもしれない ついでに >>35 補足: Blindつけ忘れた ahk外部の話になっちゃうんだけど タイトルバーに .py が含まれていたら Python辞書を指定して定型文ツールを起動みたいなことやりたいんだけど 辞書指定して起動できる定型文貼り付けツールみたいのないかな その部分までahkで真面目に実装すると大作になりそうなんでちょっとめんどい 素直に言語補完やスニペット機能のあるエディタ使うのがいいとおもうが タイトルバー .py ってことはこういうとこに貼る断片コードじゃなくて ちゃんとファイルとしての作成されてるpythonスプリクトなんだろうし winキー押下のときスクロール量を増加、 ctrl+winキーでさらにスクロール量増加、という処理をしたいです。 winキーをF13にしているんですが、ctrlがたまに抜けてwebブラウザ見てるときとかに ズームになってしまいます。。。宜しくお願いいたします。 ; スクロール量増加 F13 & WheelUp:: If GetKeyState("Ctrl", "P") ;ctrlが押されているか?の確認 { Send, {WheelUp 20} ;ctrl含めた3つ同時押しの処理 } Else { MouseClick,WheelUp,,,5 ;2つ同時押しの処理 } Return F13 & WheelDown:: If GetKeyState("Ctrl", "P") ;ctrlが押されているか?の確認 { Send, {WheelDown 20} ;ctrl含めた3つ同時押しの処理 } Else { MouseClick,WheelDown,,,5 ;2つ同時押しの処理 } Return >>40 その書き方だと1回目は#WheelUpだけど2回目からは^#WheelUpになってるんじゃないかな? と思っていろいろ試したけど、うまくいかなかった。 下のコードも試したけど、WheelDownはGetKeyStateが効かないらしく失敗。 (KeyHistory見たら10〜30ms押下状態維持してる感じだったし、このWhileでいけるんじゃないかと思った) もしかしたら、SetTimerの10ms刻みくらいでいけるかも? https://pastebin.com/wmnY8P5R なんならChromeのズーム周りの挙動は不審なのか? #WheelUp::Send, {WheelUp 5} でもたまにズームするし、なんだろね 結局よくわからなかったので、他の有識者に任せます ごめんなさい GetKeyStateは押下情報見てるだけで横取りしてるわけじゃなかったような ctrl+wheelの挙動にしたくないならブラウザがCtrl押下を検知しないよう Hotkeyかなんかで殺しとかなきゃいかんのでは ウィンドウの位置を配置するWINキー+↑↓←→をWINキー+IKJLにしたくていろいろやったんですけど、どうしても安定して同じように動かないです。 同じようなことやってる人がいたらサンプル見せてもらえませんか? >>43 何がどう安定しないのかの原因追及ならまだしもクレクレは却下 自分のスクリプトをまず貼るのが礼儀 >>43 とりあえず、Win+Lで別のことをやりたいなら、 Winキーをレジストリ系のキーチェンジャーでF13とかにしておかないとダメだろうね。 >>45 キーチェンジャーで探してみます。ありがとうございます。 >>47 今もできるのか確認してないけど試してみたら?他のWinキー使ったショートカットもなくなってもいいなら ttps://sites.google.com/site/autohotkeyjp/reference/misc/Override >Win+L および Win+U を除き、ウィンドウズのホットキーはレジストリを以下のように書き換えることで無効化出来る。 >>48 >Win+L および Win+U を除き とある時点で論外だろ なんでこう無意味なレスするんだか >>45 のやり方は一応Win+Lも無効化出来るが標準のWinキーショートカット全て使えなくなるから 使いたいコマンドは全てF13で登録し直さなくてはならない >>43 そもそもWinキーを修飾キーにしなきゃいけない必要あるのか? IKJLと組み合わせるならAppsKeyや変換キーなどを修飾代わりに使えばそういう煩わしさも無く簡単に出来る 登録し直しに関しては、 f13::LWin で良いのでは? CapsLockをF13にレジストリで書き換えて似たようなことしてるけどかなり快適 ポータビリティ重視してる身としてはレジストリ書き換えは論外だから、 その前提で工夫するだろうな XPの時代はポータブルでできたけど、今はAHKを管理者権限で起動しないと完全な動作ができないんで無理 チェンジキーアプリで、Winキー を 0x0064 にリマップし F13 & i::Send {Lwin down}{Up} F13 & k::Send {Lwin down}{Down} F13 & l::Send {Lwin down}{Right} F13 & j::Send {Lwin down}{Left} で画面の移動できるんだけど、WINキーが押しっぱなし状態になって解除されない。。 >>54 そこは普通 Send, #{Up} でいいだろ どうしても # がダメな理由があるなら {Lwin Up} も付けろよ >>56 両方やってみたけどウィンドウを移動中に効かなくなっちゃいます 手元にPCないから試してないけど F13 up:: Send {Lwin up} は? >>57 移動中とか意味不明 Win10なら最大化最小化などのショートカットだろそれ で、何がダメなのか知らんが、F13を離したときに Send, {Lwin Up} するようにすりゃ良いんじゃねえの 色々と説明不足だしもう少し頭使え windows8.1でキーボードやマウスからの入力を一時的に無効にしようと ^b:: blockinput,on sleep, 5000 blockinput, off return のように書いても普通にキー入力を受け付けています。 この命令は効果がないのでしょうか? >>60 Win10だけどうちでは管理者権限で実行すれば正常に動くぞ 普通の権限だと効果無し ただしそのスクリプトだとCtrlを離す操作もブロックされてCtrl押されっぱなしになるから 5秒経過後blockinput, offにしたあと挙動おかしくなるからKeyWaitなどで離したあとBlockInput,onにした方が良いだろうな >>61 管理者権限で実行したところ上手くいきました、ありがとう。 >>40 昔からあるホットキーすり抜け問題 完全な回避は無理だがBlockInputやSendPlay(いろいろ制限あり)を使えば 高負荷時以外であれば回避できる ホットキーすり抜け対策(要管理者権限) https://pastebin.com/en1JqVym ホットキーすり抜けってなんぞや?という人はこちら すり抜け条件 ・修飾キーを入力(ホットキー、Send) ・高速で過剰な入力(ホイール回転など) ・PC負荷が掛かっている状態 ホットキーすり抜け再現スクリプト(要管理者権限) https://pastebin.com/yHS3MAtF +WheelDown::SendInput d ; Shift + ホイール下回転 KeyHistory h=Hook Hotkey i=Ignored because it was generated by an AHK script d=Down u=Up ■正常(入力d) d 0.03 LShift ← キー入力 d 0.03 LShift ← キーリピート d 0.03 LShift ← キーリピート h d 0.02 WheelDown ← キー入力(ホットキー開始) i u 0.02 LShift ← 修飾キー解除 i d 0.00 d ← SendInput i u 0.00 d ← SendInput i d 0.00 LShift ← 修飾キー復元(ホットキー終了) ■すり抜け(入力D) d 0.03 LShift d 0.03 LShift d 0.03 LShift h d 0.02 WheelDown i u 0.02 LShift d 0.00 LShift ← すり抜け i d 0.00 d i u 0.00 d i d 0.00 LShift %A_MyDocuments%\AutoHotkey\Lib\mylib.ahk というファイルを作ると #include <mylib> で参照できるようになるというのはわかったんですが 環境変数などを設定して上記フォルダ以外の任意の検索パス(c:\src\ahk\libなど)を指定する方法はないですか? >>66 変数は使えないけど #include c:\src\ahk\lib #include mylib.ahk #include mylib2.ahk という書き方ならできるね http://ahkwiki.net/-Include Ctrl + Vを押した時に 短押しの場合 Ctrl + V 長押しの場合 wiindowsボタン + Ctrl + V という機能をつけようとしたんだけどうまくいかなかった 修飾キーの扱いがわるいのか、keywaitのところがおかしいのか https://i.imgur.com/hZ6dEB9.jpg #UseHook ;ホットキーラベルの定義で、常にフックを使用するようにする Ctrl & v:: KeyWait,Control KeyWait,v,T0.3 ;0.3秒対象キーが押されたかどうか If(ErrorLevel) { send, <^v ;ここに任意のコマンド 長押し KeyWait,Control KeyWait,v Return } KeyWait,Control KeyWait,v,D T0.2 ;0.2秒対象キーが押されるのを待つ If(ErrorLevel) { send, ^#v ;ここに任意のコマンド 1度押し KeyWait,Control KeyWait,v Return } >>68 wikiのサンプルコードを見るのは良いけど一行ずつの意味を正しく理解して無駄を省けよ 長押しor短押し判定のみなら KeyWait,v,D T0.2 の部分は要らねえだろ あと #(Winキー) 付け加える位置も間違ってるし ^v:: KeyWait,v,T 0.3 ;0.3秒対象キーが押されたかどうか If(ErrorLevel) { msgbox, Ctrl+Vを長押ししました ;ここに任意のコマンド 長押し KeyWait,Ctrl Return } msgbox, Ctrl+Vを短く押しました ;ここに任意のコマンド 1度押し KeyWait,Ctrl Return それ質問者は短押し0.3 長押し0.5 で判定のつもりで書いてると思うぞ 300msで長押しとみなすのは操作的にきついじゃろ >>70 どこから0.5なんて数字が出て来たんだ? 別に0.3秒判定でも操作的には全然きつく無いんだが 普通の短押しってせいぜい100ms〜150msくらいだしな 事実>>69 のスクリプトでも普通に押し分けられる 仮に0.5秒以上にしたいなら KeyWait,v,T 0.5 にすりゃいいだけだ >>69 本当は 短押しの場合 Ctrl + C 二回押しの場合 wiindowsボタン + Ctrl + V 長押しの場合 Ctrl + V としようと思ったんだけど(マウスのボタンに登録して1つのボタンで済ませるため) Ctrl + Cまで混ぜると使い勝手悪くなりそうだから書くのをちょっと迷ってたんだ ともあれ書いてくれたものを参考にしたら動きました、ありがとうございます >>72 とにかく参考にするにしても一行ずつどういう意味があるのか理解して使うことが大事 そうすりゃ元サンプルの通り2回押しの場合も入れようが省こうが自由に出来る 自作関数ってこの呼び出し方できないの? mb(mes) { msgbox % mes } mb,"hello" mb % "hello" >>74 よく読んだ方が良いと思う 関数 - AutoHotkey Wiki http://ahkwiki.net/Function 言語仕様酷すぎ SquirrelとかLuaとかまともなスクリプトエンジン使ったのがあるけど I/O周りの処理のノウハウに一日の長があるからこっち使うしかないんだよなあ。 自分で作ってみてもALT+F1が拾えないゲームが出て放棄した。 PythonとかJavaScriptからトランスパイル出来たら最高 たびたびお世話になってます。 LShift短押し(0.5秒以内とか)でSend,a LShift長押しで本来の機能を持たせたく悪戦苦闘しています。 KeyWaitを軸に、GetKeyState,SetTimer、Loopなどを組み合わせtて試行錯誤しましたが歯が立ちませんでした。 特にKeyWaitが曲者?で、長押し中は定義から解放されず、本来のLShiftに回復してくれないのです。 詳しい方々、どうかよろしくお願いします。 >>78 少し上の>>69 に長押しと短押しのサンプルコードがあるだろ まずはそれを参考に自分で書いてみろ それで上手く行かなかったらその書いたスクリプト貼りな 78です。 これなんかどうでしょう? 初めの数秒間は希望通りの動きをすることもあるのですが、 ほとんどの場合が、LShiftが押しっぱなしのような状態になります。 PCを再起動しないと、押しっぱなし状態が解除されなくなってしまうのです。 希望通りの動きをすることが数秒間あるのは、どういうことなんでしょうか? LShift:: KeyWait, LShift, T0.5 If (ErrorLevel) { Send, {LShift Down} KeyWait, LShift Return } Else { Send, a KeyWait, LShift Return } >>81 {LShift Down}があったら、必ずキーを離した時に{LShift Up}も入れないと Shift押しっぱなしになるぞ 78=81です。 82さんのアドバイスに従い、下のように追記したところ上手く機能するようになりました。 ありがとうございました。 しかし、新たな問題が発覚しました。 LShiftを押してから0.5秒以内にマウスクリックやマウスホイール操作をすると、 押しっぱなしにもかかわらず、今度はLShiftが解除されてしまうのです。 LShiftから指を離し、再び押して0.5秒以上を待ってマウス操作を入れると問題ないのですが、 押し直したり厳密に0.5秒が経過するのを待つのはストレスなので、なんとかならないものでしょうか? キーボード操作の場合は、0.5秒以内であってもLShiftが解除されることはないようです。 よろしくお願いします。 LShift:: KeyWait, LShift, T0.5 If (ErrorLevel) { Send, {LShift Down} KeyWait, LShift Send, {LShift Up} ←追加 Return } Else { Send, i KeyWait, LShift Return } >>83 ”0.5秒以上押したかどうか”で条件分岐してんだからそうなるの当たり前だろ 0.5秒以内は解除されるんじゃなくてまだShiftがSendされてないだけ 文句があるなら「押した長さ」で分岐するの止めろとしか言いようがない 根本的な使い方から見直しな 78=81=83です。 キーボード操作の場合は、0.5秒以内であってもLShiftが解除されることはなく、 直ぐにキーボードでキーを送り直すだけですみます。 マウス操作でもキーを送るように設定しているので、マウス操作をやり直すだけで済ませられないかと考えています。 根本的な動作要件としてモデファイアキーをチョン押しで何かアクションさせるのは辛いと思うんだ 例えば ~Lshift:: にしてshift 2回押し(ダブルクリック的な挙動)でトリガとかのほうが キーオペレーションとしてはスムーズに行きそうな気がする >>85 >キーボード操作の場合は、0.5秒以内であってもLShiftが解除されることはなく、 もはやお前の言ってる「解除」って言葉自体が意味不明 キーボードだろうが何だろうが>>83 のスクリプトだと0.5秒以内はShiftは押されない 解除も糞も無い とにかく根本的な操作方法から見直せって 78=81=83=85です。 >>86 shift 2回押し(ダブルクリック的な挙動)を試してみました。 なかなか良い感じです。 ありがとうございました。 >>87 私の言う「解除」とは、おてつきの後、LShiftを押し直さなけけばならない状況になることです。 おてつきの後、LShiftを離して押し直さなくても、時間が経過したらマウス操作をやり直せばキー送信できるようにしたいのです。 何度も言いますが、キーボード送信ではそれが可能なんです。 よろしくお願いします。 >>88 全く意味不明 マウスクリックも一度0.5秒以内にクリックした後そのままshift押しっぱなしで0.5秒経過後にもう一度クリックすれば Shift+クリックになる >マウス操作をやり直せばキー送信できるようにしたい とか突然言われても寝耳に水だしだったらそのスクリプトも書けよ 人に伝えるの下手糞過ぎ 78=81=83=85=88です。 >>89 スクリプトは83で干した通りです。 その口ぶりから推測すると、83のスクリプトを貴殿のPCで検証したうえで、 私の言う「解除」の現象が確認できなかったということですね? 可能であれば、マウスホイールアップにアルファベットキーをバインドさせ、 「一度0.5秒以内にホイールアップした後そのままshift押しっぱなしで0.5秒経過後にもう一度ホイールアップ」 を試し、shift+アルファベットが送信されるか否かを検証してもらえないでしょうか? お怒りのところ申し訳ありませんが、もう少々お付き合いくださいませ。 >>90 >マウスホイールアップにアルファベットキーをバインドさせ だからこの部分のスクリプトも貼れよ 一度言った事何度も言わすな >お怒りのところ申し訳ありませんが 舐めた口聞いてんなよ池沼 78=81=83=85=88=90です。 >>91 これでしょうか? +WheelUp:: Send,+i Return >>92 普通に動作したぞ Shift押した直後0.5秒以内にWheelUpしても反応しないが そのままShift押しっぱなしで0.5秒経過後はホイール廻せばは I が入力される 何が解除だか意味不明 アプリケーションを起動させて、そのアプリケーションの中のClassNN AAAの表示を待ってからWinMoveを 実行したいのですが、ClassNN AAAの表示を待つ方法がわかりません。 どうすればいいでしょうか? Run, %Run%, %Run_Dir%, , Run_PID WinWait, ahk_pid %Run_PID% 78=81=83=85=88=90=92です。 >>93 そうですか・・・キーボード操作と同じ反応ですか・・・ ご検証ありがとうございました大先生。 私も別の環境(別PC、別マウスなど)で試してみます。 AltTabでAltキーを離したら 選択したアプリの、画面中央にカーソルが移動する スクリプトが上手く動きません、、 なにがおかしいのか教えていただきたいです、、 LAlt & Tab::AltTab KeyWait, Alt WinGetActiveStats, Title, Width, Height, X, Y { MouseMove, Width*.5, Height*.5 } Return よろしくお願い致します >>99 まず、 LAlt & Tab::AltTab このコマンドはこの一行だけで完結してる なのでそれ以降の行は一切実行されてないのが動作しない原因 そもそもAlt+Tabキーはそのまま使えるのでわざわざAHKで乗っ取らずに ~!tab:: を使いその後の「AltTab」の記述は削除してOK KeyWait, Alt の後に一応Sleepを100〜200msくらい入れといた方がいい 最小化したウィンドウなどは復元時に若干遅延があるので(OS設定にもよるけど) WinGetActiveStats の後の { } は全く要らない なぜMouseMoveを { } で囲ってるのか意味不明なので削除 以上、これで俺の環境では正常に動作確認済み 余談だがCoordModeの設定も忘れずに ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる