1 :
名無しさん@お腹いっぱい。 :
2009/05/23(土) 00:23:38 ID:78PWRd9v0
Q1:CapsLock(英数)キーの割り当てがうまくいかないよ
A1:日本語環境だとLock系キーの動作は不定。
OS側がキーUp/Down情報が正しく返してこないので対処のしようがない。
OSのローカライズ段階で発生してる問題なので、窓使いの憂鬱やChange Keyのように
ドライバレベルで弄らないとダメだが英語圏では問題ないらしいので今後のサポートもあまり期待できない。
対処としては前述のソフトで、CapsLock(英数)キーを別のキー(F13〜F24など)に割り当ててから
AHKで利用すべし。
Q2:「〜AチЯ`荏柿義形港餐汁秦疏蛋伝覗描冒輿倭兪啻嫣彖拜杼歔」を含む文字列がうまく扱えないよ
A2:これらの文字の2バイト目が、AHKのエスケープ文字である0x60[`]なため。
対処としてはこれらの文字の"直後"に「`」を記述する(例:「線形`代数」)か、
#EscapeCharでエスケープ文字を別のものに変えるべし。
Q3:Shift, Ctrl, Alt, Winキー以外のキーを修飾キーとしてキー割り当てしたいよ
(例:無変換 + IKJLキーをそれぞれ「↑↓←→」に割り当てたいよ)など
A3:Remap機能は記述が簡単になる反面、細かい指定がしにくい。
流行らせるページのHotkeys, キーリスト, リファレンス→Send, #IfWinActive, GetKeyState()なども参照すること。
なお、例の場合は以下のように記述する。
sc07B & I::Send, {Blind}{Up}
sc07B & K::Send, {Blind}{Down}
sc07B & J::Send, {Blind}{Left}
sc07B & L::Send, {Blind}{Right}
Q4:エディタの定義はどうするの?
A4:「{AutoHotkeyのフォルダ}\Extras\Editor」に各種エディタの定義ファイル及びキーワード一覧あり
Q5:GUI作るのめんどくせ〜〜
A5:公式(
ttp://www.autohotkey.com/download/ )から SmartGUI Creator をDLして使え
Q6:ファイルパスに駄目文字があるんだが、、、
A6:駄目文字微対策版(
ttp://yak.myhome.cx/junks/#ahk.cp932 )を使え。
Q7:「XX hotkeys have been received in the last XXXXms.」って怒られるんだけど、、、(XXは環境による) A7:多分自分自身のキーを送って無限ループになっている。 例) 「a::Send, a 」 先頭に $ を付ければ回避できる(NT系のみ)。 例) 「$a::Send, a」 Q8:AHKってマルチスレッドじゃないの? タイマーやMsgBox, WinWait, KeyWaitを使ってるけど思った通りに動かない。 A8:「擬似マルチスレッド」です。最後に割り込んだスレッドが終わるまで元スレッドは動きません。 > 要は処理系統が複数同時に走らないってこと。図にするとこんな感じ。 > → 実行中、 …:割り込み終了待ち > 元スレッド →→→→→→→→→→→……………………………………→→→→ > ★割込 ↑再開 > 割り込みスレ →→→→…………→→→→→→END > ◆割込 ↑再開 > 更に割り込み →→→END Q9:完璧なスクリプトなのに、なぜerrorが出るの? A9:このスレではインデントに全角スペースを使ってコードを貼り付ける事があるので、 全角スペースをタブや半角スペースに変換してみよう。 Q10:作りたいんですけど?どうすればいいのでしょうか?ご教示頂きたいです。よろしくお願いします。 A10:簡単ですから(メモ帳等を使い)自分で書いてください。 まず、自分で少しでも書いて晒してみよう。そうしたらレスが付くかも… イントロダクション、使用例、使用方法、Hotkeys、キーリストに目を通した方が話が早いぞ。 Q11:具体的に何が出来ますか?どこにありますか? A11:マウスジェスチャ、ThumbRemap、TTBaseプラグインの数種、仮想デスクトップ等 1:「AutoHotkeyを流行らせるページ」の「My Scripts」や「BBS」の投稿スレ 2:公式のWiki「Compilations」
Q12:「a=abc」と「a:="abc"」って違いがある? / 「If a=1」と「If (a=1)」って違いがある?
A12:意味としては違いは無いけど、コマンド形式(共に前者)の方が「式」形式(後者)のほうが少し速い。
だけど、ループで大量(数万回転↑)に回さないと実感出来ないし、複数条件を使うなら「式」を使った方が速い。
Q13:ウィンドウ毎のキーマップは簡単だけど、キーを押して切り替えたりしたい。
Q13:派生版の「AutoHoekey_L(
http://www.autohotkey.net/~Lexikos/AutoHotkey_L/ )」を使うと便利。
; 変数KeyMapが1の時だけ、IKJLでカーソル移動
#If (KeyMap=1)
I::Up
K::Down
J::Left
L::Right
#If
※ 上記以外にもユーザ定義関数などを利用して様々条件でキー・マウス設定が出来る。
Q14:配列変数やハッシュ(仮想配列)は使ええないの?
A14:「式」を使うと配列やハッシュのように変数を参照できる
以下のようにした場合、A%Index%を展開してできあがった文字列の示す変数内容が x に格納される。
x := A%Index%
代入しないで参照するする事も可能、
WinGet, list, list
Loop, %list%
{
WinGetClass, class, % "ahk_id " list%A_Index%
:
}
新スレおめ ∧_∧ オツカレチャ━━━━━━(´∀` )━━━━━━ソ!!!!! / ヽ / 人 \\ 彡 ⊂´_/ ) ヽ__`⊃ / 人 ( (_ノ (_)
乙です! > A12:意味としては違いは無いけど、コマンド形式(共に前者)の方が「式」形式(後者)のほうが少し速い。 どっちが速いの?
>>3 の↓は
>Q:「〜AチЯ`荏柿義形港餐汁秦疏蛋伝覗描冒輿倭兪啻嫣彖拜杼歔」を含む文字列がうまく扱えないよ
別ファイルに書いといて直接変数に読み込む手もあるね
(ahkスクリプト)
------------------
SetWorkingDir, %A_ScriptDir%
FileReadLine, OutputVar, test.txt,1
FileReadLine, HelloWorld, test.txt,2
MsgBox, %OutputVar%
MsgBox, %HelloWorld%
------------------
test.txt
------------------
〜AチЯ`荏柿義形港餐汁秦疏蛋伝覗描冒輿倭兪啻嫣彖拜杼歔
ハロ〜ワールド
前スレ
>>977 Gui, Add, Hotkey はWindowsキーを修飾キーとして利用出来ず、
いずれはそれっぽいものを個人的に作ろうと思ってたので
前スレ
>>978 氏のリンクを参考に書いてみた。
#SingleInstance, force
#Installkeybdhook
gosub, SetHotkeys
InputBox, OutputVar, , キーを押してください, , 180, 120
return
SetHotkeys:
Hotkey, IfWinActive, %A_ScriptName% ahk_class #32770
;リンク先のサンプルは vk?? なので入力欄ではどのキーを押したのか判別し難いので
;A-Z,0-9,F1-F12 で表示されるようにしてみただけ。他(記号やテンキー等)が必要なら要追加
keys=A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
,0,1,2,3,4,5,6,7,8,9,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12
loop, parse, keys, `,
{
Hotkey, *~%A_loopField%, AnyKey_down
Hotkey, *~%A_loopField% up, AnyKey_up
}
return
;<続き> AnyKey_down: B_ThisHotkey:=RegExReplace(A_ThisHotkey, "\*~(.*)", "$1") if GetKeyState("LWin", "P") || GetKeyState("RWin", "P") B_ThisHotkey=`#%B_ThisHotkey% if GetKeyState("Alt", "P") B_ThisHotkey=`!%B_ThisHotkey% if GetKeyState("Ctrl", "P") B_ThisHotkey=`^%B_ThisHotkey% if GetKeyState("Shift", "P") B_ThisHotkey=`+%B_ThisHotkey% return AnyKey_up: B_KeyDelay=%A_KeyDelay% SetKeyDelay, -1 Send, {home} Send, +{end} Sendraw, %B_ThisHotkey% SetKeyDelay, %B_KeyDelay% return
初歩的な事ですみませんが SplashTextを中央以外に表示させる事ってできますか? スクリーンの中央に表示するって書いてあるので、中央以外は無理なのかな?
SplashImageを使えばいいんでないの?
>>13 イメージを表示させる事ができなかったけど、やりたい事はできました。ありがとうございます
インストールフォルダに画像「splash.JPG」を置いて
SplashImage , splash.JPG, B X100 Y100, 123
sleep, 1000
SplashImage, Off
で画像が出ませんでした。文字は出せたのでいいといえばいいのですが、なぜ画像が出ないのでしょうか?
977です。最終的にはこんなスクリプトになりました。 #SingleInstance force currentlyRecording := 0 send_mode = Event holddown := 10 between := 10 ; register all 255 virtual keys SetFormat,Integer,Hex Loop, 255 { key := substr("0" . substr(A_Index + 0, 3), -2) ; convert to hex, remove "0x", pad to two digits Hotkey, *~vk%key%, AnyKey_down Hotkey, *~vk%key% up, AnyKey_up } SetFormat,Integer,Decimal AnyKey_down: if (currentlyRecording) playback := playback . "{" . substr(A_ThisHotkey,3). " Down}" return AnyKey_up: if (currentlyRecording) playback := playback . "{" . substr(A_ThisHotkey,3). "}" return
続き ToolTipOff: SetTimer,ToolTipOff,Off ToolTip return ~LWin:: tapcount=1 loop, { KeyWait,LWin KeyWait,LWin,t0.15 d if ErrorLevel=0 tapcount+=1 else break } ;---------------------ここから希望動作を入れる if tapcount=1 { SetKeyDelay, between, holddown Send,%playback% return }
>>14 ahkがあるフォルダが作業ディレクトリになるから。
msgbox, %A_WorkingDir%
続き else if tapcount=2 { if (currentlyRecording) { ToolTip,Stopped recording. currentlyRecording := 0 playback := RegExReplace(playback, "(\{[^}]+ Down\})+$", "") ; remove the "^F5" from the end } else { ToolTip,Started recording. currentlyRecording := 1 playback := "" } SetTimer,ToolTipOff,1000 return } 最初のとは結構変わってるけど、やりたいことができました!ありがとう! ただ、たまに暴発するのがたまにキズw
>>17 ahkも同じインストールしたフォルダにあります。
C:\Program Files\AutoHotkey\splash.JPGでもダメでした
スクリプトをどこに置いて、どうやって実行してるか、でカレントフォルダは変わるよ
新スレ立ってたのか
>>17 >>20 ごめんなさい、画像ファイルの名前ミスでした・・・
初歩の初歩のミスでレス重ねてすみませんでした
>>22 ぇぃ!
∧,,∧
(´・ω・) ∧_∧
⊂( ⊆ ̄つ☆))Д`)
\ /⊂ ⊂~ノ
と丿⊂ と_ノ
SQLiteModule.ahkの1.1の関数のSQLite_GetSelect(db, sql, text, ByRef row, ByRef col)で データベースの列の最後の値がNULLだと次のレコードを変数に格納してくれない気がする よく検証してないから分からないけど最後の列の値になにか入れたら次の行は一応格納してくれた
25 :
24 :2009/05/24(日) 20:40:28 ID:UimWf5FR0
いや、やっぱり8列目までしか対応してないだけっぽいかも SQLはじめてやるもんで朝から苦戦しっぱなし 基本情報取るときに少しやっただけだが辛い
autohotkey で sqlite を使う用途がいまいち思い浮かばない 何に使うんだろう
同一キー連打でキーマップ切り替え。AutoHotkey_L専用。 コンビネーションキーよりいい感じ。 #If *vk1Dsc07B:: KeyMap:=(A_ThisHotkey==A_PriorHotkey && A_TimeSincePriorHotkey<300)+1 KeyWait, vk1Dsc07B KeyMap:=0 return #If (KeyMap==1) h::Left j::Down k::Up l::Right #If (KeyMap==2) h::Home j::PgDn k::PgUp l::End
Guiの手始めにじゃんけんゲーム作ってみたところ 勝敗引分けの統計がほぼ平均的にバラけてて ランダムといってもあまり偏ったりしないもんなんですかね
>>26 使ったことないけど配列とかリストの代わりになるのかな?
なるよ。普通の言語の配列みたな気軽さを求めると痛い目に遭うと思うけど。
>>30 そうかそういう手があったのか
非表示のリストビューで無理矢理リスト作ってたわ俺w
>>24 作者だけど忙しい+結構立ってるので理解が・・・
自分用にコメントつけておけばよかった
>>26 自分用TV表が欲しかった
お気に入り機能でデータ保存には何が良いだろう→SQLが一番
と考えて
INTEGER、FLOAT、TEXTしか判断してないっぽい 514〜521を if($result == 3) { if(!SQLite_Column_Text($query, $nowCount, $get)) { $errMsg = SQLite_GetSelect->%$errMsg% return False } } else { $get = "" } で対処可能なはず blob型ってのがよく分かってないのでとりあえず空文字で
RButton::return で右クリックを殺してるはずなのに、ゲーム中で右クリックすると無効になってません どうしてでしょう? ゲームのプロテクトとかそんなんですかね?
そんなところだろうね。たぶんDirectInput
>>38 DirectInputはキー切ったり、送ったりはできないのですか?
公式のFAQにあるけど、DirectInputでも一部は動くこともある ・SendPlayを使う ・SetKeyDelayを増やしてみる SetKeyDelay, 0, 50 SetKeyDelay, 0, 50, Play ・ControlSendを使う GameguardやNPro使ってるんだったら、ドライバレスでマクロができるゲーマー用のマウス買った方が楽かと
If A > %A_Index% Count ++ Hoge%Count% = hogehoge みたいに配列的に変数を使ってその数が不定の場合、これらのメモリを一括で開放する方法はなにかありますでしょうか。 Loop,%Count% { Hoge%A_Index%= } Loopで回せばいいのはわかりますが、Countの値を保持してなければならずあまりスマートな感じがしないので、「配列のメモリを解放」みたいなコマンドがあればと思って。
42 :
24 :2009/05/26(火) 18:39:35 ID:qcaMCxpC0
>>36 うお、よくわかんないけど直りました
ありがとうございます
>>26 ちょっとした記憶用ソフト作りたくて頑張ってました
すでにCSVで問題、答え、苦手度、最後に解いた日、間違ったフラグ(次正解すれば解除)とか記録してて
そのCSVを読み込んで出題するAHKはほとんど完成系で作ってあるんだけど
いろんな条件で抽出するときやっぱりCSVよりSQLのWHERE文があればと思ったのがきっかけ
前スレでVista+Word2007でダイアモンドカーソルを実現しようと思った者です。 返信すごく遅くなって申し訳ありません。 今日試してみたらなぜか普通に動くようになってました。 1日潰してあんなに動かそうとしても全然動かなかったのに…。 前スレでレス下さった皆様ありがとうございました。 お騒がせしました。
先輩方 初めてのAutoHokeyで書いてみたのですが おかしなところを突っ込んで頂けると嬉しいです。 #Persistent SetTimer, Note, 3000 Note: Process, Exist, notepad.exe NewPID = %ErrorLevel% if NewPID = 0 { Run, notepad.exe, c:\, /UseErrorLevel } 3秒ごとにメモ帳が動いてるか確認 動いてなければ メモ帳を起動する notepad.exeなんか存在しませんのときにエラーウインドウが立ち上がらないように処理 作業ディレクトリがc:\は良く意味がわかっていないorz メモ帳が動いてた時の処理はループするだけだから問題ないのかな(´・ω・`)
>>45 SetTimerの後と、最後の行にreturn入れてる?
>>45 うごくから、いいんじゃないのかな。
>>46 のツッコミはもっともだが、起動時に1回処理を噛ますと言う意味では処理としては良いと思う。
(SetTimerの後にreturnをわざと置いていないのだとしたら)
第2引数は作業フォルダ。ショートカットを右クリックし見たてプロパティ画面のと同じ。
メモ帳なら空でもいい。
プロセスが無くなるまで待つ方法もある。
Process, WaitClose, %pid%
>>46 >>47 ありがとうございます。
settimerの後はreturn入れると挙動がおかしかったので入れてません。
最後の行に入れてないのは入れたら終わってしまうと思っていれてないです^^;
作業フォルダのご説明大変わかりやすいです^^
この場合は特になくても大丈夫そうですね。
作業フォルダがいつか消滅したときのことを考えてエラーを吐かれると嫌だったので
絶対存在し続けるc:\にしてみました。
returnを入れてもう一度ためしてみます。
#Persistent SetTimer, Note, 3000 return Note: Process, Exist, notepad.exe NewPID = %ErrorLevel% if NewPID = 0 { Run, notepad.exe, c:\, /UseErrorLevel } return 言われた通りにretrun二つ突っ込んで見ましたがちゃんと動きますね return入れてないと処理がきちんと修了しないからだんだん重くなっていったりしますかね? 違いが全くわかりません^^;
Return GosubやHotkeyのサブルーチン処理から戻る Remarks GoSubでジャンプしていないときにReturnを実行すると、 Exitを実行したときと同様にスレッドを終了する。 サブルーチン処理をしていない場合はなくてもよいのかなと思い込んでみる。。
これだけでいい気がする Loop RunWait, NotePad.exe
SetTimerって待機スレッド(プロセス?)がどんどん溜まって 重くなったりしないかと不安であまり使ってない…。実際のところどうなんでしょ?
Autohotkeyの中で疑似スレッド的に動いてるだけで、OSから見たら常に単一プロセス単一スレッドだから CPUやメモリリソースへの負荷はあまり考える必要が無いと思うけど。 疑似スレッドの制御は本物のプロセス/スレッドのように複雑じゃないので、 実質上の負荷は、実際にタイマースレッドで動作するAHKコードの量で判断してもかまわないと思う。 それにスクリプト実行中はSetBatchLinesで指定した間隔で10msのスリープも入って、 OS全体の負荷を高めないような作りにもなってるし。
AutoHotKey、さっきはじめて知りました。 スクリプトとか全然わかりませんし、わかるのはBASICぐらいですw でもなんとかマニュアルを参考にして10分ぐらいいろいろやってるのですが。。。 たとえば、Winキー+y で、iTunesがアクティブなときだけ最小化したいんですが、 スクリプトは、これでOKでしょうか? 一応動いているのですが、なにか問題があるでしょうか? >>>>>>>>>>>>( iTunesがアクティブなら最小化 )<<<<<<<<<<<<< #y:: IfWinActive iTunes WinMinimize,iTunes IfWinActive return レベルが低い質問でごめんなさい...orz そもそも、なにがやりたくてAutoHotKeyを知ったのかといいますと、 任意のホットキーを押したとき、 (1)任意のアプリが起動していなければ起動する。 (2)任意のアプリが起動していて、かつ、最小化状態またはバックグラウンド状態なら、アクティブに(最前面に持ってくる)。 (3)任意のアプリが起動していて、かつ、最前面(アクティブ)ならば、最小化する。 こういうのをやりたかったんです。
そもそもなぜそんなことをやりたいのかといいますと、、、 最近、プログラマブルキーボードを買ったのですが、 1つのキーだけで、任意のアプリのアクティブ化と最小化をトグルしたい。 あるキーを押したら指定したアプリのウィンドウが最前面に来て、 そのアプリが最前面にあるときに、そのキーをもう一度押したら そのアプリのウィンドウが最小化する、みたいな感じです。 でもそんな簡単なことすらプログラマブルキーボード付属のユーティリティーではできず。。。 で、いろいろ考えて、その任意のアプリにWindows標準のホットキーを割り当て、 プログラマブルキーボード側の任意のキーにそのホットキーをアサインすれば、 上記の(1)と(2)だけは実現できるんですが、(3)がどうしても実現できないんですよね。 んで、国内外のフリーウェアをかなりいろいろ試したんですが、(1)(2)と同時に(3)ができるものが 数時間探しても見つけられず、また、こういうのって、 検索ワードがホットキーとか最小化とか一般すぎる言葉になっちゃって 自分の求めているソフトを検索エンジンで探しにくいんですよね。。。。 てなわけで、長くなってしまいましたが、AutoHotKeyにこれからハマってみる予定です GUIまで作れちゃったりするみたいで、恐ろしいほど高性能でびっくりですよ、ほんと。
コメントアウトは >>>>>>>>>>>> で大丈夫でしょうか?
まだ初心者の俺が、試しもせずにしゃしゃり出てみる #y:: IfWinActive, iTunes { WinMinimize,iTunes }else{ Process,Exist,notepad.exe If ErrorLevel<>0 WinActivate,ahk_pid %ErrorLevel% else Run,notepad.exe } return
>>57 早速、ありがとうございます!
notepad.exeになってしまってますが、
iTunes.exeに変えると動きますね!
>>55 ,56を書き込んだあとに、自分で考えたものは以下でした。
以下でも一応ちゃんと動くみたいです。
でも、
>>57 さんのように、ちゃんとahk_pid %ErrorLevel%みたいに
指定したほうが確実ですよね?
#y::
IfWinActive,iTunes
{
WinMinimize,iTunes
}
else
{
WinActivate,iTunes
Process,Exist,iTunes.exe
If ErrorLevel=0
{
Run,iTunes.exe
}
}
;;;IfWinNotExist iTunes
;;; Run,iTunes.exe
return
ただ、iTunesって名前が付いたフォルダとかアプリが開いていると
そっちのほうが最小化しちゃったりしますけど、それも本当は、キッチリPIDを調べてやれば、誤動作もなくなるんですよね?
数時間いじったらかなりわかってきました!ありがとうございます!!
本当に面白くて可能性を感じるソフトですよね!
ありゃりゃ、 ;;;IfWinNotExist iTunes ;;; Run,iTunes.exe の部分はコメントアウトでした..orz
ちなみに
>>57 のやつはAutoHotkeyを流行らせるページに載ってたヤツのコピペです。
暇なときにでものんびり読んでみるといいよ。
>>36 これはいいね。使わせてもらうよ
ところでライセンスは何?
マウス周囲のを指定した大きさの正方形でデスクトップまで穴をあける。再度呼び出すと元に戻す。 ~RCtrl::ClipWindow() ClipWindow(size=200, ignoreClassPattern="Shell_TrayWnd|BaseBar") { static clipped If (!clipped) { DetectHiddenWindows, Off CoordMode, Mouse, Screen MouseGetPos, mx, my WinGet, list, List Loop, % (list-1) { IfWinNotExist, % "ahk_id " list%A_Index% continue WinGetClass, class If ignoreClassPattern && RegExMatch(class, ignoreClassPattern) continue WinGetPos, x, y, w, h mx1:=mx-x-size//2, my1:=my-y-size//2, mx2:=mx-x+size//2, my2:=my-y+size//2 If (mx1>w || my1>h || mx2<0 || my2<0) continue WinSet, Region, 0-0 %w%-0 %w%-%h% 0-%h% %mx1%-%my1% %mx2%-%my1% %mx2%-%my2% %mx1%-%my2% %mx1%-%my1% 0-%h% clipped := list%A_Index% . (clipped ? "|" : "") . clipped } } else { DetectHiddenWindows, On Loop, PARSE, clipped, | WinSet, Region,, ahk_id %A_LoopField% clipped= } }
>>63 これいいね
ちょっと感動した
使わせてもらいます。
Vistaじゃ動かないな
>>63 面白いな
穴あいてるときにSetTimerでマウス追従するとさらに便利
堪能するためにわざわざ壁紙張ってしまったw
もちろんエロい壁紙だよな
s = %A_thishotkey% s1 = %s%% msgbox,%s1% return s の変数の値の末尾に % を付け加えて それを s1 に保存したいのですが (A_thishotkey が a だとすれば "a%") こうかくとエラーになります。 どうすればこれを実現できますか。
敷居が高いのもあるからどんどん流行ってくれ
>>68 s1 = %s%`%
最後の % をエスケープする(デフォならShift + @)
>>68 エスケープ
s1 = %s%`%
MsgBox, %s1%
式を使う方法もあり
s2 := s1 . "%"
MsgBox, % s2
少しお聞きします。 無変換とシフトと任意のキーというホットキーの定義の仕方はありませんでしょうか? vk1Dsc07B & +g:: SplashTextOn,,, Test... Sleep, 600 SplashTextOff return などとやっても、無変換+シフト+Gを拾ってくれないのです・・・ +vk1Dsc07B & gだと読み込み時にエラーがでるし…。
>>73 コンビネーションキー
「&」を使うことで、2つの任意のキー(ジョイスティック以外)の組み合わせをホットキーに指定することが可能。
3つ以上のキーを指定したり、+^!#で修飾キーを追加したりは出来ない。
If GetKeyState("Shift","P")
最初に vk1Dsc07B & g:: If !GetKeyState("Shift","P") return を追加すれば大丈夫か
76 :
1/2 :2009/05/29(金) 13:22:46 ID:u1yo0xzx0
>>63 のマウス追従Ver 作ってみた。 タイマ未使用、Shiftで固定、ESCで終了
#1:: ClipWindow_MouseFollows()
ClipWindow_MouseFollows(size=200, Pause="Shift",endKey="ESC", ignoreClassPattern="Shell_TrayWnd|BaseBar") {
static list
IfNotEqual,list,, return ;semaphore
DetectHiddenWindows, Off
CoordMode, Mouse, Screen
WinGet, list, List
Loop, %list%
l := list%A_Index% . (l ? "|" : "|0x0") . l
While !GetKeyState(endKey) && Instr(l,WinActive("A")) {
if GetKeyState(pause) {
KeyWait,%pause%
pmode := (pmode!=1 ? 1 : 0)
}
IfEqual,pmode,1, continue
MouseGetPos, mx, my
if ((mxs-10 < mx) && (mx < mxs+10) && (mys-10 < my) && (my < mys+10))
continue
mxs:=mx, mys=my
77 :
2/2 :2009/05/29(金) 13:24:56 ID:u1yo0xzx0
Loop, % (list-1) {
IfWinNotExist, % "ahk_id " list%A_Index%
continue
WinGetClass, class
If ignoreClassPattern && RegExMatch(class, ignoreClassPattern)
continue
WinGetPos, x, y, w, h
mx1:=mx-x-size//2, my1:=my-y-size//2, mx2:=mx-x+size//2, my2:=my-y+size//2
If (mx1>w || my1>h || mx2<0 || my2<0)
continue
WinSet, Region, 0-0 %w%-0 %w%-%h% 0-%h% %mx1%-%my1% %mx2%-%my1% %mx2%-%my2% %mx1%-%my2% %mx1%-%my1% 0-%h%
if !Instr(clipped,list%A_Index%)
clipped := list%A_Index% . (clipped ? "|" : "") . clipped
}
Sleep,50
}
DetectHiddenWindows, On
Loop, PARSE, clipped, |
WinSet, Region,, ahk_id %A_LoopField%
list=
}
>>67 プリインスコのメーカーロゴ、エロいの持ってねぇ(´・ω・`)
最小化したときにタスクトレイにアイコン化するアプリを タスクトレイに入った状態からアクティブ化するのは無理でしょうか? その手のアプリ、みんなWinActiveが効きません...orz
DetectHiddenWindows, On
>>79 そんなコマンドがあったとは!
即レス本当にありがとうございます!
ほんと、ahkってなんでもできるんですねー
昨晩のやつの改造版。アクティブウィンドウ以外に黒いシェードを掛ける。2K/XP用。ビデオ鑑賞にでもどぞ Gui, +LastFound -Border +ToolWindow +AlwaysOnTop -Caption +0x02000000 -0x0CC00000 +E0x00080020 Gui, Color, 000000 ; ここで色をかえてもおk WinSet, Transparent, 200 ; 透明度(1-255) Gui, Show, NA x0 y0 w%A_ScreenWidth% h%A_ScreenHeight% SetTimer, Timer1, On Timer1: SetWinDelay,-1 WinGetPos,x,y,w,h,A x1:=x, y1:=y, x2:=x1+w, y2:=y1+h If (lx1==x1 && ly1==y1 && lx2==x2 && ly2==y2) return Gui, +LastFound Gui, +AlwaysOnTop WinGetPos,,,ww,hh WinSet, Region, 0-0 %ww%-0 %ww%-%hh% 0-%hh% %x1%-%y1% %x2%-%y1% %x2%-%y2% %x1%-%y2% %x1%-%y1% 0-%hh% lx1:=x1, ly1:=y1, lx2:=x2, ly2:=y2 Return
おもしろいな 解除はどうやるんすか?
タスクトレイw
>>74-75 2つ以上ダメなんですね。以外に不便…。というかホットキー扱いじゃないのかな
ありがとうさんです。試してみまする
>>36 のSQLite_GetSelect関数ってフィールドの数が10個以上あると変数重複するよね?
例えばLV111の場合11行目の1列目、1行目の11列目で重複みたいに
俺が頭悪いだけ?
それが仕様だと思うよ。 > %接頭辞%%行番号%%列番号% := 値 って風に代入してるし > %接頭辞%_%行番号%_%列番号% とかにすれば平気なんだろうけど
なるほど。 ライブラリいじらないとだめか。
>>36 関連でわからないことがあったので便乗して質問します
SELECT * FROM test WHERE 〜
というところで、 ' が含まれる項目をうまく探し出してくれません
autohotkey 特有のエスケープ処理か何かのせいか?と思ったのですが
いまいちよくわかりません
' が含まれる項目を処理するときに同じような症状に出会った人はいますか?
引数の基準フォルダと対象ファイルパスを元に相対パスを返す関数ってありますか?
Path_RelativePathTo(From,atrFrom,To,atrTo) ; 相対パスを作成 ; From : ベースパス ; To : 相対にするパス ; atr : ファイル属性を指定 ; ディレクトリ 0x10 (FILE_ATTRIBUTE_DIRECTORY) ; ファイル 0x20 (FILE_ATTRIBUTE_ARCHIVE) { VarSetCapacity(t,260,0) DllCall("SHLWAPI.DLL\PathRelativePathToA", Str,t , str,From, Uint,atrFrom, str,To, Uint,atrTo) return t } Path_CommonPrefix(p1, p2) ; 2つのパス名の先頭から共通するディレクトリ名を取得する { VarSetCapacity(t,260,0) DllCall("SHLWAPI.DLL\PathCommonPrefixA", Str,p1, Str,p2, str,t) Return t }
AutoHotkey v1.0.48.03.L30
変数%aaa%の中に変数%bbb%を組み込みたいです。 %aa%bbb%%では駄目でした。 どうすれば出来ますか?
「%aaa%」と書いた場合、 ・コマンド内は、変数に格納された値 ・式や関数の中では、%〜%を展開した文字列が名前となる変数 となるけど、 「組み込みたい」の意味が分からないから具体例で。
よくわからんが多分 Transform,Deref, String あたりではないかとエスパーしてみる
流行るページを参考にしたのですが、わからない箇所があるので教えてください Ctrl-x,Ctrl-sで保存(Ctrl-S)の実行、Ctrl-sで検索(Ctrl-f)の実行をしたいと思っています ところが下記のスクリプトでCtrl-x,Ctrl-sを実行すると、Ctrl-fが送られてしまいます このように置き換え対象のキーも別のキーに置き換えてしまっている場合、どのように対処すれば意図した動きになるのでしょうか? ^x:: Transform,CtrlS,Chr,19 Input,InputChar,C I M L1 T1,{ESC} If InputChar=%CtrlS% Send,^s Return ^s:: Send,^f Return
いろいろやり方はあるけど、^s:: のところでA_PriorHotkeyで分岐すりゃいいんじゃないの ^x::Return $^s:: If A_PriorHotkey = ^x Send, ^s Else Send, ^F Return
>>97 試してみたところ意図した動きになりました。感謝です!
^x::Returnでキーの動きを無効化しても組み込み変数に値は入るんですね
勉強になりました。ありがとうございました><
2ストロークで設定しているキーバインドが多く、書き換えが面倒なので、
勉強もかねて関数をつくってやってみたいと思います
対象窓で、文字入力中or変換中なら1を、変換候補窓が出ているなら2を、それ以外なら 0を返す。 ATOK2007とMS-IME8.1で確認。クラス名がバージョンの数値違いだけなら別verでも通用するかも。 IME_IsConverting(winTitle="A") { hwnd:=WinExist(winTitle) WinGet, pid, PID, ahk_id %hwnd% tmm:=A_TitleMatchMode SetTitleMatchMode, RegEx ret := WinExist("ahk_class ATOK\d+Cand|imejpstCandList\d+ ahk_pid " pid) ? 2 : WinExist("ahk_class ATOK\d+CompStr|imejpstcnv\d+ ahk_pid " pid) ? 1 : 0 SetTitleMatchMode, %tmm% return ret }
>>99 昔から何度も質問に出てましたよね。IMEで変換中かどうかを知る方法。
ついに実現できる人がいたとは。
さっそく試してみます。
>>99 おおーありがとう
これがあったら無変換にIMEOFF、変換にONにする関数割り当てられる
けっこう既出な気がするけど 他のIMEでもウィンドウクラス一覧表示するスクリプト書けば怪しいクラス名が分かる 注意する点はWinActiveで判断するんじゃなくExistで判断するところ
BOOLを返さないのに Is〜 とは変な名前だったorz。好きに替えてくらはい。 自分が使ってるIMEしか調査してないから、 SKK、VJE、WXG、松茸、その他IMEへの対応は出来ないので自分で追加してくれ。 あああ ← 入力窓の上で MouseGetPos,,,hwnd して hwndからクラス名をとって正規表現に追加  ̄ ̄ ̄ 愛 |愛 | ← 候補窓の上で MouseGetPos,,,hwnd して hwndからクラス名をとって正規表現に追加 |亜依 | |あい .| |藍 | | : .|  ̄ ̄ ̄
>>102 おっしゃるとおりで
#IfWinNotExist, ahk_class 入力窓|変換窓
vk1Csc079::IME_Set(!IME_Get())
とかのほうが楽ではある
MS-IME2000までなら WinExist("ahk_class msime") でいけそう
autohotkey以外の任意のウィンドウをタスクバーから消す方法ってありませんか toolwindow作ってSetParentすればいいのかなと思ったけど同じプロセスじゃないとできないみたいで
実行中のスクリプトのファイル名を取得する方法を教えてください。 実行中と同じスクリプト名のiniファイル読み込みにしようしたいです。
組み込み変数 A_Script○○○
任意のアプリケーションのメニューバーを非表示にする方法ってあります? AU3_Spy.exe で調べてもメニューバーの Class_NN なんかが判らなくて…。
クラスが取れないのは昔ながらのメニュー(メモ帳、電卓など、Ahkもそう)、非クライアント領域と言われているところ。
^F12::
hwnd := WinExist("A")
hMenu := DllCall("GetMenu", "UInt", hwnd, "UInt")
If (hMenu) {
DllCall("SetMenu", "UInt", hwnd, "UInt", 0)
Sleep, 2000
DllCall("SetMenu", "UInt", hwnd, "Uint", hMenu)
} else {
MsgBox, Menu not found
}
return
ttp://msdn.microsoft.com/ja-jp/library/cc364679.aspx ttp://msdn.microsoft.com/ja-jp/library/cc411047.aspx
処理が終わるまでの間を進歩状況を表示させたいんだけど Gui,Add,Progress見つけたけどできそうなのか使い方がさっぱりわからなかった
>>112 おおお、ありがとうございます!助かりました
>>113 ttp://www.autohotkey.com/docs/commands/GuiControls.htm#Progress Progress, R0-200 W400 H70 Hide
Progress, Show
Loop, 200
Progress, %A_Index%, Number:%A_Index%, Counting..., Title
Progress, Off
Gui, Add, Progress, W300 h10 cBlue vMyProgress
Gui, Add, Button, Default, Start
Gui, Show
return
ButtonStart:
Loop, 300
GuiControl,, MyProgress, %A_Index%
return
マウスの下のWindowTitleを取得する方法を教えてください。
>>117 助かりました。ありがとうございました。
>>115 処理完了までの時間がどのくらいなのか取得したいんで
Loop,200だか300なんて固定じゃしょうがない
>>119 すまなない
何が分からないか分からない
完了時間の予測なら、全体量と1回の処理時間から自分で毎回計算するしかないと思う
なるほど そういうことならしょうがないですね ありがとう
具体的な秒数を事前に出すのはAHKに限らずむづかしいと思うけど。 ダミー進捗が嫌なら、メクラループやめて具体的気に処理が終わるたびに更新すればいいだけっしょ やらなきゃいけない処理の数(分母)と、そのうち何個目が終わった(分子)か、で 進捗グラフ更新してくのがProgressなんだから
>>99 Firefox3.0.10上だと文字入力中をうまく検出できないんだけどどうしてだろう
0が返ってくる
>>99-101 窓使いの憂鬱でIMEのON/OFFでキー割り当て変えられることに気づいた・・・
もしかしたらAPI一発で取得できたりして・・・
窓使いのソース見たらよいかも
127 :
99 :2009/06/04(木) 22:10:50 ID:duXuCFzc0
メールの内容を読み込んで、そこにあるフレーズで次の処理をするっていうのを作りたいのですが 何かいい方法ないでしょうか?どうにかしてメールをtxtファイルにしてFileReadで変数に読み込む ぐらいしか思いつかないんですが
ごりむちゅうで何がなにやら。 次の処理が何かわからんのに、答えるのは難しい。
>>129 情報不足過ぎですみません
家で常時動いているPCにメール送って、PCを遠隔操作したいんです。
具体的には本文にAいう単語があったら、そのあとの文をファイルとして保存するとか
Bという単語があったらaというソフトを起動するとかです。
>>126 IME.ahkでは Office 系の IME の On / OFF を
正しく取得出来なかったと思う
改善された?
ウチでは IME.ahkで Office 系「で」 IME の On / OFF を正しく取得出来る
>>130 常時起動ならリモートデスクトップでいいんでないの?
それとも携帯からかな?
メールでやるなら、面倒くさそうだね。
>>128 >どうにかしてメールをtxtファイルに
あるかどうかわからないけど、ログをテキストで保存してるメーラーを使えばいいんじゃないか。
今見てるメールに対して処理をしたいだけなら、スマートではにけどCtrl+A & Ctrl+Cで本文を内容読めばいい
POPなりIMAPのプロトコルが分かるなら英語のフォーラムにあるWinSockのライブラリ使えば
メールをファイルに落とさなくても直接接続して処理できるけど、エラーハンドリングなどかなり面倒。
次点は、コマンドラインレベルのクライアントを探して連携するとか。
POPならこういうやつとか>
ttp://www.codeode.com/popclient/index.html 普通のWindowsのMUAでも、大抵は開けば普通にtextで読めるからそれでもいいかも。
メール毎に個別にファイルに保存するやつの方が楽だとは思うけど。
スレどころか板違いだが、sshで入れるようにすると楽なんじゃないかな。
携帯用のクライアントアプリもあるみたいだし
ttp://mutil.jp/ 。
鯖にするのはリ便利さと管理コストのトレードオフだけど。
ahkでやるならメーラによると思うけど、メールデータをテキストそのままで
保存してるメーラも結構あるんでファイル監視でいくのもアリ。
現段階でメールのヘッダと本文の解析の仕方を知らないなら、敢えてメールチェッカ入れて
新着通知の窓が出るのを監視してその本文を取得ってのもありかも。
あとはBASP21あたりで自前でPOP3鯖見に行くとか。。。
出先からメールで自宅のPCを操作できるソフトて結構あるような気がするんだが
TaskTrayIcon.ahkを眺めてたんだが、 クリックされたトレイアイコンの番号は取得できないのかな?
出先から指定ラベル実行できたらちょっと面白いな
>>133 ,134,135,136,137
レス遅れてすみません。携帯は焼かれているもので
いろいろな手段を教えてくださってありがとうございます。
じっくりググって作りたい物を作ってみます。また行き詰ったら質問に来るかもしれません
そのときはよろしくお願いします
z::yのようにリマップし、alt+zとやると、 余計なCtrlが入力されます。なぜでしょうか。 Key history 74 03F u 0.08 F5 A4 038 d 2.25 Alt 5A 02C h d 0.05 Z 59 015 i d 0.00 Y A4 038 u 0.16 Alt A2 01D i d 0.00 Ctrl A2 01D i u 0.00 Ctrl 5A 02C h u 0.03 Z 59 015 i u 0.00 Y 74 03F d 0.53 F5
Guiでボタンを押すとListBoxが更新されるようにしたいのですが、 Gui, Add, ListBox, vList, Gui, Add, Button, gTest1, Button1 Gui, Add, Button, gTest2, Button2 Gui, Show, Return Test1: GuiControl,, List, test||.. Return Test2: GuiControl,, List, hoge|..|| Return これだとリストの末尾に追加される形になってしまいます。 リストを入れ替えるようにするにはどうしたら良いでしょうか。
先頭にデリミタ。 GuiControlの頁を要再読。
>>143 即レスありがとうございます。
見落としてました...orz
しつもーん。 指定アプリ上でzを押した時、aの動作→bの動作→cの動作→aの動作→bのry と言った事をやりたいんですが、どう記述したらいいですか。。。 #IfWinActiveを使うって事と、個別の動作(sendでいくつかキーを送るだけ)は分かってできたんだけど、 それを同じキーで繰り返したいです。 ご教授願います。。。
>>145 質問がいまいちわかりにくいけど、こういうこと?
#IfWinActive 指定アプリ
z::
Loop,n ;nは繰り返したい回数
{
aの動作
bの動作
cの動作
}
Return
#IfWinActive
同じキーで 1回目押したら aの動作 2回目押したら bの動作 3回目押したら cの動作 って意味じゃなかろうか
z:: count++ if(count=1){ tooltip, aの動作 }else if(count=2){ tooltip, bの動作 }else if(count=3){ tooltip, cの動作 count=0 } keywait, z Return
149 :
145 :2009/06/07(日) 16:40:24 ID:6gUtZr/R0
>>146 質問がわかりにくくてすいませんしたっ_| ̄|○
>>147 そうです。その意味です。。。
>>148 希望通りの動きが出来ましたっ!
ありがとうありがとう(つД`)
リファレンス読んで処理内容を解読できるようにがんばってみます(´・ω・)、
AutoHotkey.ahkの書き換え、再起読み込み を自動化した。 Aキーを押したらA用途のAutoHotkey.ahkを Bキーを押したらB用途のAutoHotkey.ahkを 読み込んでそれ用の設定になるので、便利。 perl使って書き換えしてるだけだが。
何故ahkでやらない
流行らせるページの中の人、ネトラン関係者になってたのか
書き換えって、毎回 マイドキュにある AutoHotkey.ahkを削除だのリネームだのしてるのか? スクリプトは別に「AutoHotkey.ahk」の名前じゃなきゃ動かないわけじゃないし 多重起動もできるんだが。
>>153 AutoHotkey.ahkの指定箇所A〜B部分をキー一発で交換します。
マウスのM、X1,X2ボタンやテンキー機能は衝突するしな。
複数キーバインドで使い分けってめんどいし。なんかのキー押しながらマウスのX1ボタン押すっても・・
何によって用途が違うのか知らないけど、 ホットキーラベル内に条件分岐作ればいいだけの話じゃ
----- ScriptA.ahk ------ #include common.ahk ; 以下A用キー定義 ----- ScriptB.ahk ------ #include common.ahk ; 以下B用キー定義 ----- common.ahk ------ A::Switch("ScriptA.ahk") B::Switch("ScriptB.ahk") Switch(script){ Run,"%A_AhkPath%" "%A_ScriptDir%\%script%" ExitApp } ; 以下共通用キー定義
AutoHotkey_L 使えば楽
ahkで起動するのとexeに変換して起動するのではどっちが高速ですか?
exeの場合は、起動時に解凍する処理が入る その後はどっちも同じ
すいません教えてください。 Loop, Read, exclude.txt ; 削除したい行を改行区切りで列挙したファイル { match := A_LoopReadLine Loop, Read, %1%, *temp.txt { if (A_LoopReadLine != match) FileAppend, %A_LoopReadLine%`n } FileMove, temp.txt, %1%, 1 } こんな感じでマッチした行を削除したいのですが、元の場所に改行が残ってしまいます。 削除した行だけ改行を詰めるにはどうやったら良いでしょうか。 FileReadして Loop, Parse, var, `n, `r, でも同じでした。
>>160 ループの入れ子が想定と逆だったから分かりづらかった。
それと、ファイルI/O多すぎじゃない?
どっちのファイルも巨大(100M〜)ならしょうがないけど、
どっちかをメモリに積んだ方がいいと思う。
俺ならこうする。
FileRead, ExcludeLines, *t exclude.txt
ExcludeLines = `n%ExcludeLines%`n
Loop, READ, src.txt, output.txt
If InStr(ExcludeLines, "`n" . A_LoopReadLine . "`n")==0
FileAppend, %A_LoopReadLine%`n
>>162 ありがとうございます。
うーm、しかし他の場所の改行も削除されてしまうYO
FileRead, ExcludeLines, *t exclude.txt
ExcludeLines = `n%ExcludeLines% ;改行残る
Loop, READ, src.txt
{
if InStr(ExcludeLines, "`n" . A_LoopReadLine . "`n")==0
var = %var%`n%A_LoopReadLine%
else
count = %A_Index%`,%count%
}
StringTrimLeft, var, var, 1
StringTrimRight, count, count, 1
Loop, Parse, var, `n, `r
{
if A_Index not in %count%
FileAppend, %A_LoopField%`n, output.txt
}
;FileMove, output.txt, src.txt, 1
return
こんなんしか思いつきません><;
Hayateというフリーソフトでキーのリピート速度やリピート開始時間を変えても
AutoHotKeyのホットキーラベルを介すとデフォルトのリピート速度になってしまいます
ex) Down:: Send, {Down}
Hayate側のキーリピート速度でホットキーラベルを実行する方法はないでしょうか
ちなみにHayateというフリーソフトは検索してもなかなか出てこないですが
http://frozenlib.net/app.htmlにあるものです
SetKeyDelay SendやControlSendコマンドでの1キーごとに挿入される間隔を変更
SetKeyDelayを小さく設定することは試したのですがキーリピートが開始されるまでの時間が変化無しです
SendPlay
試しに以下のように設定してみましたが改善されませんでした SetKeyDelay,-1,-1 SendPlay, {Down} SendPlay以外も一応試しましたがうまくいきませんでした あきらめるしかないですかね
その何とかってのは知らないけど、仕組み的に両立は無理なんじゃないのかね
そうですか。残念 ありがとうございました
>>162 ごめんなさい163です。すんごい初歩的な所で勘違いしてました。
>>162 のでバッチリです。本当にごめんなさい
>>160 perl使えばいいよ。2GBのテキストでもperlなら処理できる。
キーの取りこぼしが生じるときには どのパラメーター設定をいじればいいのでしょうか 現在この5つを設定しています SetWinDelay, 0 SetControlDelay, 0 SetKeyDelay, 0 SetBatchLines, -1 SendMode Input
キー入力イベントの取りこぼしだとしたらどうしようもない(原理的には無いはず) GetKeyState などでの状態取得で取りこぼしがあるのだとしたらスクリプトが悪い もしくは AutoHotkey_L の #If でものすごく重い関数呼んでいるとか
ホットキーラベルを実行した後そのホットキーの修飾キーが押され続ける現象がよくあります 根本的に起こらなくすることは出来ないのでしょうか もしくは発生しやすいホットキーの設定の仕方とかあったりするのでしょうか 過去ログにあった押され続けていることをツールチップで知らせる対策は一応やってます
>>176 自分も <+WheelUp::ShiftAltTab
を使った後によくShiftが押されっ放しになります。
CPU負荷は10%くらいでも起きますね。なんでだろう
Safari4を使われている方は、御存じだと思うのですが このブラウザはリンクを新しいタブで開くのに control + クリックの操作となり非常に不便でして AutoHotkeyのスクリプトで、リンクをクリックだけで タブを開く事は可能でしょうか
状態に応じてタスクトレイアイコンが3種類に変化するスクリプトを コンパイルしてexe化することを考えています。 ahk2exeでコンパイルするときにiconを埋め込むことができますが、 ここで3種類のiconを埋め込むことも可能なのでしょうか? 外にiconを用意せずに、内部に埋め込んで利用するにはどうすればよいのか お知恵を拝借したくて参りました。どうぞよろしくお願いします。
>>176 >過去ログにあった押され続けていることをツールチップで知らせる対策
どういうものですか?
興味があります。
>>181 これです
782 :名無しさん@お腹いっぱい。:2008/11/27(木) 01:43:58 ID:pOwnMABe
よく分からんけど、 Ctrl とかが押しっぱなしになる。解決はよく分からんが対処法としてアラートだすようにした。
if書きたくないから、三項演算子だいすきif書きたくないから、三項演算子だいすき
#SingleInstance
#Persistent
keys = Ctrl|Shift|Alt|LWin|RWin
alertDur = 3000 ;(ms)
SetTimer, Alerter,200
return
Alerter:
alert =
Loop, PARSE, keys, |
{
%A_LoopField% := !GetKeyState(A_LoopField) ? 0 : !%A_LoopField% ? A_TickCount : %A_LoopField%
alert .= (%A_LoopField% && (A_TickCount - %A_LoopField%) > alertDur) ? "[" A_LoopField ": " (A_TickCount - %A_LoopField%) "ms]" : ""
}
Tooltip, %alert%
return
>>182 ありがとうございます。
勉強になります
WheelScroll.ahk の作者さん、見てらっしゃいますかー? (´∀`)ノ 前スレ809でご相談した、 マルチモニタで座標がマイナスのときスクロールしない件、ようやく調査できました。 どうやら Firefox と Google Chrome に特有の問題?だったようです。 > 1.スクリプト殺したノーマルの状態で通常のホイールが効いているか Yes > 2.ToolTip,mx=%mx% my=%my% とか追加して値がマイナス値になってるかどうか OK > 3.互換モード(WM_SCROLL)で動かした場合も動かないのか アプリによって違う [初期設定] OK: Word 2007, Excel 2007 (ClassNN=XLDESK1), VBE, Explorer, Hidemaru, NG: Firefox 3.0.10, Google Chrome 2.0, [互換モード] ※ OK: Word 2007, Excel 2007, VBE, Explorer, Hidemaru, Google Chrome 2.0, NG: Firefox 3.0.10 (プラス座標でも動かない), ※「if (!scmode)MOUSEWHELL() 」の部分をコメントアウトして「SCROLL()」だけが使われるようにした > 4.管理人さんのホイールリダイレクト で正常に動くかどうか OK: Word 2007, Excel 2007 (ClassNN=XLDESK1), VBE, Explorer, Hidemaru, NG: Firefox 3.0.10, Google Chrome 2.0, というわけなのですが、何かおわかりになりますか?
>>182 三項演算子を使えるのか
AutoHotkeyでは使えないものだと早とちりしていた
>>179 済みません、このスクリプトの作り方を
ご存じの方、教えて頂けないでしょうか
宜しくお願いします。
それってSafariに限らずIE7以降やFirefoxでも一緒なのでは…。人間側が対応すれば? どうしても作りたいなら、単に左クリックにCtrl+左クリックのショートカット割り当てて 常駐させればいいんじゃね?
IEはデフォでミドルクリック新タブに対応したけど Safariはまだなのか
>>184 作者とは関係ないけど、
MOUSEWHELL関数内の
; lParam: XY座標
lpalam := (my << 16) | mx
って所を
VarSetCapacity(tmp, 4), NumPut(mx, tmp, 0, "Short"), NumPut(my, tmp, 2, "Short")
lParam := NumGet(tmp, 0, "UInt")
に変えてみたら動くかな?
>>184 どもです。XPSP2で現象確認しました。
>189氏でも突っ込み入ってますがバッファサイズと符号の問題っぽいですね。
ただ、VarSetCapacity() & NumPut()は自分もやってみたんですが上手くいかず。
泥臭いけど↓の記述でいけました。
; lParam: XY座標
my += (my < 0) ? 0xFFFF : 0
mx += (mx < 0) ? 0xFFFF : 0
lpalam := (my << 16) | mx
初めはアプリ固有の問題かと思ったけど、問題が起こってたのはlParamの値を
ちゃんと見てるアプリだったですね。
(逆に言うとほとんどのアプリはlparam値をデタラメに指定しても動くんだな)
いづれ修正版を上げ直したくはあるんですが、色々手を入れたいとこがありすぎるんで
ちょっといつになるかわからんです。
とりあえず当座は個々でのモデファイで対応をお願いします。
AutoHotKeyではないあるウィンドウに ファイルがドロップされたことを知りたいんですが何か方法ありませんでしょうか
192 :
名無しさん@お腹いっぱい。 :2009/06/13(土) 09:59:23 ID:tz1EHr/W0
三項演算子の話が出ていたので便乗して質問します if (key = "q" or key = "w" or key = "e") { key = ok } の条件の部分を if key in q,w,e { key = ok } のように省略化して三項演算子を書きたいのですが無理でしょうか
>>191 他のウィンドウへのD&DはWM_DROPFILESを検知しないとダメかも
hook用のdllが英語のフォーラムにあったような記憶
>>192 一般論で言えば無理だけど、
instr("qwe",key) ? "ok":key
みたいなことは書けると思う
keyが複数文字なら instr("_q_ww_ee_","_" . key . "_") ? "ok":key とも書けるけど、
選択肢の数によっては普通に or で結んだ方が速いかも
高級なツールチップ表示関数を作ろうと思ってます ツールチップ番号ごとに独立した表示時間を持たせたいのですが 作り方が分かりません ツールチップ削除用ラベルも関数内で完結させようと思ってます とりあえず現時点のツールチップ削除機能がない関数です↓ ToolTip(msg, dur=2000, tipNumber=20, x="88%", y="95%") /****************************************** * スクリーンの絶対座標にツールチップ表示 * * @param msg - 表示メッセージ * @param dur - 表示時間(ms) * @param tipNumber - ツールチップ番号(1~20) * @param x - スクリーン座標。絶対値または%指定が可能 * @param y - スクリーン座標。絶対値または%指定が可能 ******************************************* */ { ifinstring, x, `% ; xに%が含まれていた場合の座標を算出する { StringReplace, x, x, `% x := A_ScreenWidth * x / 100 } ifinstring, y, `% ; yに%が含まれていた場合の座標を算出する { StringReplace, y, y, `% y := A_ScreenHeight * y / 100 } CoordMode, ToolTip, Screen ToolTip, %msg%, %x%, %y%, %tipNumber% return }
チップ番号毎に消去用のタイマ設置じゃないの
20個ラベル作るってことですか?
とりあえずラベル20個作って望み通りの挙動になりました ありがとうございます
プログラマブルテンキーのリマップで困っているのですが VK SC Type Up/Dn Elapsed Key ------------------------------------------ A4 038 d 43.83 Alt 60 052 d 0.05 Num 0 60 052 u 0.02 Num 0 66 04D d 0.02 Num 6 66 04D u 0.00 Num 6 61 04F d 0.02 Num 1 61 04F u 0.00 Num 1 A4 038 u 0.02 Alt こんな入力があって発動するスクリプトは可能でしょうか?
ALT押しながらテンキーの061ということでいいのかな。 前にも似たようなスクリプト貼られた気がするけど。 seq:="!Numpad0!Numpad6!Numpad1|UPUPDOWNDOWNLEFTRIGHTLEFTRIGHTba" ; 検出するキーシーケンス endkeys:="{Backspace}{Enter}{Left}{Right}{Up}{Down}{Delete}{Insert}{Escape}{Home}{End}{PgUp}{PgDn}" . "{Numpad0}{Numpad1}{Numpad2}{Numpad3}{Numpad4}{Numpad5}{Numpad6}{Numpad7}{Numpad8}{Numpad9}" . "{NumpadDot}{NumpadDiv}{NumpadMult}{NumpadAdd}{NumpadSub}{NumpadEnter}" . "{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Pause}{Break}{PrintScreen}" . "ba" ; endkeysには検出するキーを含める hist:="" Loop { Input, var, L1 V, %endkeys% if ErrorLevel=Max hist:="" else if InStr(ErrorLevel,"EndKey:") { hist.=GetKeyState("Alt","P") ? "!":"" hist.=SubStr(ErrorLevel,8) } Loop,Parse,seq,| if ( SubStr(hist,StrLen(hist)-StrLen(A_LoopField)+1) = A_LoopField ) Gosub % A_LoopField . hist:="" } !Numpad0!Numpad6!Numpad1: TrayTip,, %A_ThisLabel%:%A_TickCount% return UPUPDOWNDOWNLEFTRIGHTLEFTRIGHTba: TrayTip,, FullPower:%A_TickCount% return
>>200 ありがとうございます。
参考にさせて頂きます。
つい2,3日前に,このツールの存在を知りました。
いままで自分で欲しかった,
1 ブラウザやエディタ上で範囲選択
2 ホットキーでポップアップメニュー
3 Firefoxに送る,EBViewに送る,Googleで検索,Wikiで検索……
などの機能を持つスクリプトが,見よう見まねで書けたんですが,
(かなり細かくTPO次第の条件分岐になるので,自動認識はさせない方針)
ただ一つ「IE8にURLを送る」だけがうまくいきません。
仕事でどうしてもIE8が必要なので,あとここだけ動くと
言うことなしなんですが,何か良い手はありませんでしょうか。
Run, C:\Program Files\Internet Explorer\iexplorer
http://%Clipboard% は駄目でした。
#1:: run, "C:\Program Files\Internet Explorer\iexplore.exe" "%clipboard%"
http::// はいらんでしょ。そういう使い方してるんだったらごめん。
>>202 IE8をインストールしていないけど
iexplorer.exe ではなく iexplore.exe じゃないかと。
それとパス中に含まれる半角スペースは %A_Space% に置き換えた方が確実に動くと思う
Run, C:\Program%A_Space%Files\Internet%A_Space%Explorer\iexplore.exe
http://%Clipboard%
205 :
202 :2009/06/15(月) 00:54:56 ID:jQythkfVP
>203 さん
動きました! ありがとうございます。
http://は意図的です 。仕事で使うシステムが,
どういう意図なのか
http://抜きのURL (←毎回違う)を
送ってくるシステムなので,苦し紛れの方法です。
でもよく考えたらこのほうが(どうせ人間が選択するなら)
便利だということにも気づいて,割と気にいってます。
>204 さん
返信見たときにかなり焦りましたが,iexplorerでした。
%A_Space%の件は気づいてなかったので,
試しに203さんの解に入れ込んでみたけどやはり駄目でした。
今後は気をつけて使うことにします。ありがとうございました。
>%A_Space% これは流石にやりすぎだと思うが 行頭行末以外で勝手にtrimされるわけじゃないし
なんかねぼけてた AutoTrimで設定できる範囲でどうのこうのって意味ね
うちのは iexplore.exe だな、環境によって変わったりするものなのかw
ウイルスじゃねw>iexplorer.exe 昔の名残でWindowsに最初から入ってるプログラムは 基本的に8文字までになってるから
210 :
202 :2009/06/15(月) 01:51:19 ID:jQythkfVP
ホントだ,Iexploreですね……なに寝ぼけてるんだろう。 すいません。。。 ランチャー代わり&さっきのメニューだけで, 個人的にはとても満足。 次はマウス右クリック1秒でメニュー出るようにしてみます。 こういうのBasic以来だ。楽しい。
>>205 補足
""で括るとそのままパスの文字列として扱われるので%A_Space%に置き換えると動かない。
(%A_Space%が半角スペースとして処理されない)
""で括らない場合は %A_Space% に置き換えると確実に動く。
>>206 半角スペースが区切りとして処理される場合があるので
""で括れるときはいいけど、括れないときに半角スペースを %A_Space% に置き換えてる。
前後に半角スペースやTabスペースが欲しいときにこういう方法がありますよー、ってことで。
XPのデスクトップ上で、たとえば、マイコンピュータが選択されている などのように、 現在選択されているアイコンを調べる方法はないでしょうか。 F2でリネーム→コピー→キャンセル というローレベルな方法で一応動いています。 #IfWinActive ahk_class Progman F1:: send,{F2} sleep,5 send,^c send,{ESC} sleep,5 var=%clipboard% if var=マイ コンピュータ msgbox,マイコンピュータが選択されている return #IfWinActive が、デスクトップの空き領域でこの操作をした場合、「空」になってもらいたいのに、 直前まで選択していたアイコンに強制的にフォーカスが移り、 意図しない動作になってしまいます。 それと、この方法だと「ゴミ箱」が検出できません。 もっとスマートな検出方法はないでしょうか。
ゴミ箱のショートカットをつくり、デスクトップにそれを置く。
214 :
名無しさん@お腹いっぱい。 :2009/06/15(月) 20:16:07 ID:uHI5LVh90
デスクトップの空き領域・ゴミ箱・普通のアイコンのそれぞれに SHIFT+F10で個別のコンテクストメニューがだせる あとは場合分け汁
>>213 なるほど、最悪そのようにしてみます。
>>214 どうもです。Shift+F10を押した後の場合分けの方法が思いつかないのですが、
コンテキストメニューの情報をテキストで取得する方法って有りますか?
コンテキストメニューが出ているとき、最前面ウインドウから情報を
抜き取ってみましたが、デスクトップそのものの情報しか得られませんでした。
礼も言わず「最悪そうします」とかw
>>190 ご確認ありがとうございます。
ご教示いただいた方法を試してみたいと思います (が、また数日〜十数日先になるかもしれません)。
>>217 これでイケそうです。ありがとうございます!
タスクスケジューラに登録しているタスクの プロパティ(っていうんでしょうか?)を開くにはどうしたらいいでしょうか? Winキーや矢印キーを何回かSendして・・・という方法は思いつきますが タスクを追加や削除して順番が変わると書き換えが必要になるので、 できれば直接開く方法はないでしょうか? やりたいことは、プロパティを開いて「実行する」のチェックボックスを トグルするスクリプトを書くことです。
Gui, Add, ListView, w200 r10 Grid -Multi NoSortHdr AltSubmit vTEST gLV, aaa|bbb Gui, Add, Button, gXX, &XX Gui, Show Return LV: Lv_Add("", 1, 2) Return XX: Gui, 2:+Owner1 Gui, 2:Add, Button, w200 gHH, &HH Gui, 2:Show, Return HH: Gui, ListView, TEST Lv_Delete() Gui, 2:Destroy Return すみません、これでGui2のHHボタンを押したときに、Lv_Delete()が実行されず行き詰ってます。 Lv_Delete()を実行するボタンをGui1に追加してラベルに飛んだり、リストダブルクリックを A_GuiEvent で拾ってLV: の分岐で実行するようにしても上手くいかず、 Gui1にボタンを増やしてHHを押したら、Gui1側のボタンをクリックするようにしたらなんとか動作しました。 ControlClick, Button2, ahk_class AutoHotkeyGUI ControlClick, Button2, ahk_class AutoHotkeyGUI ;一回だけだと反応しませんでした 本当はどう書いたら良いのでしょうか。よろしくお願いします。
>>221 ありがとうございます
ataskを使うことにしました
>>176 最近これがやたらと起きてまじで困る
何がいけないのか分からない
AutoHotKeyのバグなの?
>>226 Logiのsetpointつかってない?
>>193 規制やら何やらで返事遅れてしまいましたが
フォーラムを漁ったらdllcallでole32\RegisterDragDropというのを使えばいいみたいでした
自分もSetWindowsHookExなどでWM_DROPFILES検知しようとしてたんですが、
Windowsって方法が色々あってむずかしいですね
>>224 おお、これだったんですか、ありがとうございます出来ました。
基本的なことで申し訳ないんだけど テンプレなどのページでキーの変更などのことはわかったのですが、 どのようにして変更するかがわかりません。 たとえば「Ctrl+0」というのをF1に割りあげる場合どのソフトを起動し どのような設定にすればいいのですか?
それって結局何も分かってないってことじゃね?
>>226 マウスのサイドボタンに setpoint で shift や ctrl を割り当ててない?
LogiのMarbleMouse(トラックボール)を使ってるけど SetPointはカスタマイズ系ソフトと競合してたのでSetPointを入れてないな。 ボタンのカスタマイズはAutoHotkeyでやってる。 MSのIntelliPointも同様のことが発生するという書き込みを見たことあるけど 使ったことが無いので解らない。 SetPoint(ユーティリティソフト)をアンインストールしても ドライバはロジのままだったので手動で標準ドライバへ変更した記憶がある。 (標準ドライバにする必要があるかどうかは分らない。) それとキーボードのドライバもいつのまにかロジのドライバに書き換えられてたので それも標準ドライバに変えた。 現在のSetPointの仕様がどうなのか知らないけどね。
メーカー純正のマウスドライバって微妙だよな。 かといってXPだとOS標準じゃでチルトホイール使えないし。 せっかくWheelLeft/Rightがサポートされたのに残念だ。
SetPointは、ノートPCのタッチパッド感度を勝手に初期化して加速を無効にしたり、
>>176 の押しっぱなし症状が出たりと、多岐にわたって殺意が沸くほど悪影響がある。
が、こいつを入れないとせっかくのチルトボタンが有効にできないから、涙をのんで入れてる。
チルトボタンだけをF13〜F24にまわすような代替のソフトなんて、ないよね?
あったら、速攻でアンインスコしたい。
いまは、CtrlかAltが20秒以上押しっぱなしになってることを検出したら
Setpointを強制Killして、2秒後に、あらためて起動させるようにした。
けど、これも完璧な対策にはならない。
特定のウィンドウもしくはソフトがアクティブの場合の指定などがわかりません。 Ctrl+0をF1に割り当てる場合どうすればいいですか?
1年ぶりにロジクールのスレを覗いてみたんだが、 >Q. SetPointの設定が勝手にデフォルトに戻るんですが? >A. キャンセルやクローズ(「×」)を押さないようにしましょう。 > >Q. SetPoint 入れたくない(使いたくない)んで違う神ドライバありませんか? >A. そんな都合のいいものがあったら是非教えてください。 添付アプリの糞加減は、なにも変わっていなかった・・・
AutoHotkeyをインストールする
(インストーラーでインストールするとahkファイルの関連付けが一緒に行われる)
Autohotkey.exeと同じフォルダに 新規テキスト 作成する。
新規テキスト.txt を AutoHotkey.ini に変更する
※AutoHotkey.ini ではなく、任意の名前.ahk (ahkファイル)でもいい。
※ahkファイルならどこに作成してもOK。
テキストエディタ(メモ帳など)で Autohotkey.ini を開く。
ウィンドウの識別方法はいくつかあるけど、ウィンドウクラスで識別する方法を。
ウィンドウクラスを調べる方法はいろいろあるけど同梱されている AU3_Spy.exe を使うと簡単。
(AutoHotkey.exeと同じフォルダにある)
取得した ahk_class をクリップボードにコピーする。
例えばメモ帳のウィンドウクラスを調べると Notepad ということが分かる。
#IfWinActive, ahk_class Notepad ; メモ帳がアクティブなら
^0::F1
これを AutoHotkey.ini に貼り付けて保存し、Autohotkey.exe を実行。
(任意の名前.ahk に貼り付けて保存した場合は 任意の名前.ahk をダブルクリック)
最初の取っかかりで躓いているのだろうけど
後は
>>239 のリンク先に殆ど書かれている。
いまんとこできたのがソフトの起動のみ・・・ WinTitle Mozilla Firefox ^PgDn::F2 #IfWinActive MozillaUIWindowClass ^PgDn::F2 これでできません・・・何が間違ってるのでしょうか?
F2::^PgDn じゃないの? ってか、とりあえず流行らせるページひととおり読もうぜ
「Ctrl+0にF1を」として書いてた・・・ 「Ctrl+0をF1に」なら F1::^0 だった 他の方も言ってるけどAutohotkeyを流行らせるページを見た? (主に関連する解説ページはウィンドウの指定方法、ホットキー、Remap)
>>241 Sendを使う
Remapは修飾キーを離してくれないので
それだとCtrl+F2が押されたことになっている
スレッド動作中に、ほかのキーが押されているかは「GetKeyState」で できますが、マウスのホイールが回ったかどうかを調べる方法は、ありますか? マウスの左右チルトを倒してスレッドを開始し、 そこでループさせながらホイールの上下入力を検知したいのですが、 ホイールの回転検出方法でつまずいてしまいました。
こんな感じか ~WheelUp::wheel:=1 ~WheelDown::wheel:=-1 WheelLeftl:: wheel = 0 Loop { ほげほげ If (wheel!=0) ふがふが } Return
>>246 ありがとうございます。うまくいきました。
なるほど、1スレッドにこだわるあまり、思いつきませんでした。
#IfWinActive MozillaUIWindowClass F2:: Send ^ Send PgDn return これでも駄目だった・・・なぜかしらん?
いいかげん解説くらい読んでくれ
>>248 ctrlとPgDn別々に押してるんだから動かなくて当然
あとSendのページ読めば{}やら,やら必要なのもわかるはず
それと、なんで
>>242 試してみないの?
まあ ahk_class 付いてない時点でウィンドウ判定に失敗してるんだけどな
ここ2、3日騒いでいた者ですがなんとか設定できました。 F2::^PgDnで問題なくできました。 問題は、251さんの指摘しているところですw
もう二度とこないでね^^
>>226 ,227,228,233,234
自分
>>178 なんですが、ロジのマウス使ったことないですがやっぱりShiftが押されっぱなしになりますね。
マウスドライバはMSの純正で、ボタン割り当てはAutoHotkeyのみでやってます。
LShift & WheelDown::AltTab
LShift & WheelUp::ShiftAltTab
だけで走らせてみたところ、LShift & WheelDown::AltTab でフォーカスを移したあと、マウスクリックで
元のウィンドウに戻ってくると、毎回 Shiftが押されっぱなしになることが分かりました。
TeraPadとJanedoeViewで確認。
LShift & WheelUp::ShiftAltTab では大丈夫みたいです。
マウスはサンワのTB38という5ボタンのトラックボール、メーカーのドライバを入れた前歴はありません。
キーボードがへたってるのかなあ
■ キー押しっぱなし俺的まとめ ■ 症状 i) キーはCtrl や Shift が多い ii) 物理キー押下・押上で解除される 原因となっていそうなもの A) SetPoint(ロジクール製マウスユーティリティ) B) 窓使いの憂鬱(のどか) C) VMWare / VirtualPC A単独、もしくは (B または C) + デュアルコア以上のCPU ※ ソースは繭スレとか ---- 俺はCore2のPCにした時 B で一度なってAHKに完全移行(OS再インスト)で いったん無くなったけど、VMWareを入れて(C)再発した。 今はどちらも入れていないので特に問題は起きていない。
何分後に動作 とか 何時何分に動作 っていうタイマーってできないかな? 1分ごとに監視するのは無駄な動作が多い
何分後ってのはタイマーで指定すればいいだけか 時間指定できないかな
>>255 AとCは該当なし、Bは使った事ないですがChangeKeyで前変換とカタカナキーを殺していたのを思い出して
リセットして再起動してみましたが駄目でした。自分もCore2DuoのE8400です。
OS再インストールするしかないのかな・・・ orz
結局これといった解決方法は無しかorz
>>256 SetTimer,OnTimer,60000
return
OnTimer:
FormatTime,NowTime,,HHmm
If (NowTime >= 0659) && (NowTime <= 0701) && (!Compleate) {
Msgbox, 7:00になったよ
Compleate := 1
} Else{
Compleate := ""
}
return
1分ごとに時間チェックするだけなら大した負荷にはならんと思うけど
(どっちにしろどこかで何かしらが定期時間チェックする必要はあるので
自分でやるか、他人に任せるかの違いでしかないのだし)
どうしても1分Timerが嫌なら単独スクリプトにしてOS標準のタスクスケジューラに登録したらいい
ソフトのタイトルの一部で判断し 各キーを対応させるにはどうすれば いいのでしょうか?
複数のキーボードを接続している状態で、特定のキーボードについてのみ キー配置のリマッピングを有効にする方法はあるのでしょうか。 Alphagripというイロモノキーボードを買ってみまして、AutoHotkeyで リマップして キー配置を変更したのですが、普通のキーボードも同時に 使っているので そちらは出来ればそのままのキー配置にしたいのです。 一応関数は探してみたつもりですがそれっぽいのが見つかりませんでした。
>>264 レスどうも
タイトルに AutoHotkeyというのが含まれてる場合
SetTitleMatchModeで指定するにはどうすればいいのでしょうか?
#IfWinActiveの場合は、付属のソフトでahk_class○○といった
感じでできました。
>>264 レスありがとうございます。やっぱ無理なんですか、残念。
>>265 #IfWinActive などのウィンドウの状態を見てのキーアサインを振り分ける機能は
Autoexec セクション内での SetTitleMatchMode コマンドの指定したやり方で判定をする
(指定がなければ前方一致をデフォルトとする)
意味が全然分からないならスクリプトの「1行目」に以下を書く
SetTitleMatchMode, 2
とりあえずテンプレのサイトにいって調べてみたら MatchMode タイトルのマッチ方法 1 前方一致(WinTitleで指定した文字列で始まるウィンドウが一致する)(高速)(デフォルト) 2 中間一致(WinTitleで指定した文字列を含むウィンドウが一致する) 3 完全一致(WinTitleで指定した文字列に完全に一致するものが一致する) こんなのを発見しました。 2というのとかの意味もわかりました。使い方自体は疑問ですが、 最初の行に書き込むことによって目的の動作ができるようになりました。 m(_ _)mペコッ
ID:yGrRFejp0 = ID:yzkbbsVb0 だろ 264でヒントもらっといて 265みたいな再質問ってあり得ない 質問するなとはいわんが答えてもらった内容をちゃんと噛み砕いて飲み込む努力しろよ 調べる能力つけないとこのソフト使うのは難しいぞ
多少なりとも前進はしてるようだけど、調べる気がないのはちょっとな
そんな風にみえちゃんだろうけど相当検索し調べその結果ですw 調べ方が悪いのかしら・・・
調べ方も頭も態度も悪い
hoge.ahkが起動しているかを別のahkから調べる方法はありますか? プロセスがあるかで調べようと思ったのですがどれもAutoHotkey.exeで調べられませんでした
>>273 もらいもの
DetectHiddenWindows, On
WinGet, ahk_id_list, list, ahk_class AutoHotkey
Loop, %ahk_id_list%{
this_id:=ahk_id_list%a_index%
WinGetTitle, this_title, ahk_id %this_id%
msgbox, %this_title%
}
それか、AutoHotKey.exeをhoge.exeにリネームコピーしてhoge.ahkをhoge.exeに送れば問題なし。
SetTitleMatchMode, 2 #SingleInstance, force DetectHiddenWindows, On WinWait, \hoge.ahk - AutoHotkey, , 0.1 DetectHiddenWindows, Off msgbox, % Errorlevel ? "ないよ" : "あるよ"
コマンドラインを読む関数がどこかになかったっけ? それ使えばいいような
すみませんAHK連携絡みでもう二つ質問させてください。 あるAHKから起動中の別のAHK内の指定処理(ラベルなり関数)を実行させる最適な方法は何でしょうか? 起動中のAHK間の変数の受け渡しはファイル書き出し、読み込み以外で方法ありますか?
隠し(じゃなくてもいいけど)GUI作って、ボタンを押す。パラメタ渡しは隠しGUIのEditとかに書く
関数ならAutoHotkeyをインストールしているディレクトリにLibフォルダを作って そこに入れておけばいいんじゃないかな 変数の受け渡しはクリップボードを軽油する方法もある。 一定間隔でクリップボードを監視し、特定の文字列から始まるなら 変数の受け渡しと見なし、変数に置き換えてやるとか。
;例えば特定の文字列を ahk9999999 とし、 ;クリップボードコピーする形式を ahk9999999,変数名,値 というにようにする。 ;下記スクリプトを実行中に ahk9999999,hoge,5 をクリップボードにコピーすると ;msgboxに hoge = 5 と表示。 #Persistent #SingleInstance, force hoge=1 ; テストで変化を確認するために初期値を 1 にしておく SetTimer, ClipBoardCheck, 100 return ClipBoardCheck: if(Instr(Clipboard, "ahk9999999")=1){ loop, parse, Clipboard, `, { if A_Index=2 hogehoge=%A_LoopField% else if A_Index=3 %hogehoge%=%A_LoopField% } Clipboard= ; クリップボードを空にする msgbox, %hogehoge% = %hoge% } return ;変数を渡す方のスクリプトはClipboardの内容のバックアップしておき、 ;Clipboardが空になったらバックアップしていたのを戻すようするといいかも。
>>279 仕組みは分かったのですがやり方が分かりません(´;ω;`)
よかったら簡単な例を教えてください
試しにこういうふうに作ったのですがGUIがHideだからなのかクリックしてくれません
操作する側に
ControlClick, Button1, HideControl
操作される側に
GUI, Add, Button,,Exit
Gui, Show, Hide, HideControl
return
ButtonExit:
ExitApp
>>280-281 なるほどクリップボードですか
接頭辞を決めておくというのは思いつきませんでした
>>282 操作側で DetectHiddenWindows,On
受け渡しなら、OnMessageとPostMessageでしょjk 英語公式のリファレンスに詳しいサンプルがある
>>284 まぁそれが普通だと思うけど、GUIのボタン押すのもあまり変わらないと思う
---- server.ahk ----
Gui, Add, Button,gSub1
Gui, Add, Edit, vParam
Gui, Show,Hide, HiddenWindow
Return
Sub1:
Gui, Submit, NoHide
MsgBox, % Param
Return
---- client.ahk ----
Gui, Add, Edit, vParam
Gui, Add, Button,,Go
Gui, Show
Return
ButtonGo:
Gui, Submit, NoHide
DetectHiddenWindows, On
ControlSetText,Edit1,% Param, HiddenWindow ahk_class AutoHotkeyGUI
ControlClick,Button1,HiddenWindow ahk_class AutoHotkeyGUI
Return
じゃあ、先に普通のやり方教えてあげなよw 余計なGUIリソース消費するし、コードの可読性や保守性を考えるとあまり一般的な解決法とも思えない
>>286 おー無事出来ました
どうもありがとうございました
>>284 やっぱりそっちのほうがいいんですかね
でも英語読めないので諦めますw
普通のアプリならそうすると思うけど、色々覚えなきゃいけないことが多いから AHKのコマンドだけで出来る事に意義はあると思うよ。 リソースったってたいしたことないよ。
まあ、人それぞれだから好きにすればいい 一応OnMessageだってahkのコマンドだし、覚えるのが大変なのはGUI絡みだって同じだと思うけどね 文字列の受け渡しになるとちょいと面倒になるけど、数値の受け渡しならこの程度で済む --- receiver.ahk --- OnMessage(0x5555,"MsgHandler") MsgHandler(wParam, lParam, msg) { TrayTip,Receiver,Message %msg% arrived:`nWPARAM: %wParam%`nLPARAM: %lParam% } --- sender.ahk --- F12:: SetTitleMatchMode 2 DetectHiddenWindows On PostMessage, 0x5555, 11, 22, , receiver.ahk ahk_class AutoHotkey return
人それぞれって言われたらそれまでだが、GUIはちょっとな
AHKのGUI関連って無駄にイベントラベル増えるからコードぐちゃぐちゃになるし。
自分だったら窓表示する必要があってもGUIコマンドは可能な限り使いたくないな。
>>276 管理人さんのマウスジェスチャ2の中だな。hh.exeなんかからでもchmファイルのフルパス抜けるし便利だよ
GetCommandLine(pid=0,WinTitle="A"){
if (!pid)
WinGet,pid,PID,%WinTitle%
; kernel32\GetCommandLineA のアドレスへのポインタを設定?
ptr:=(NumGet(DllCall("kernel32.dll\GetProcAddress",UInt,DllCall("kernel32.dll\GetModuleHandle",Str,"Kernel32"),Str ,"GetCommandLineA",UInt)+1))
; プロセスのハンドルを取り出す
hp:=DllCall("kernel32.dll\OpenProcess",UInt,0x001F0FFF,UInt,0,UInt,pid,UInt)
VarSetCapacity(res,1024)
; GetCommandLineのメモリアドレスを取得してからコマンドライン文字列を取得
DllCall("kernel32.dll\ReadProcessMemory" ,UInt ,hp ,UInt ,ptr, UIntP,addr ,UInt ,4 ,UInt ,0)
DllCall("kernel32.dll\ReadProcessMemory" ,UInt,hp ,UInt,addr ,Str,res ,UInt,1024 ,UInt,0)
DllCall("psapi\CloseProcess", UInt,hp)
return res
}
>>290 これはスマートでいいですね
使わせてもらいます
>>200 この方法ではNumpad0,Numpad6,Numpad1に割り当てできなくなります。
何とかなりませんでしょうか?
キーを押し続けている間連続で加速しながら処理 プレイヤーのシーク操作やボリューム操作など Left:: sleepTime := 80 ;初期待ち時間 While GetKeyState("Left","p") { send, {Left} ;任意処理 sleep, %sleepTime% sleepTime := sleepTime > 20 ? sleepTime * 0.95 : 20 ;加速 }
AHK使い始めたばかりなんですが、ウィンドウタイトルの無いウィンドウを
操作するのはどうしたらいいでしょうか?
具体的には
http://novolization.hp.infoseek.co.jp/pro.html#ao のMovieOperatorを
操作したいんですが。自分ではウインドウタイトルが無いとマウスで絶対座標指定して
いちいちクリックとかしか考え付かないです。
ちなみに前はUWSC使ってました。こいつでもウィンドウタイトルが無いとどうにもならなかったんで
ツール変えてみようかと思い立ったわけなんですが…
ウィンドウクラスとプロセス名(PID)で絞り込みかなl Process, Exist, MovieOperator.exe IfWinExist,ahk_class #32770 ahk_pid %ErrorLevel% { ; ここにウィンドウ操作 ControlGetText, text, ComboBox1 MsgBox, % text }
>>>>>>>>>>( Window Title & Class )<<<<<<<<<<< JPG2AVI ahk_class Afx:00400000:b:00010011:00000006:0594124D AU3_Spy.exeで見ると普通にウィンドウタイトル取れてるみたいだが。 これで操作できないんか?
ってスマソ、思いっきりソフト間違えとる。
JPG2AVI じゃなくて MovieOperator じゃないの? ウチの環境でMovieOperatorをAU_Spy.exeで取得してみたけど タイトル無しの ahk_class #32770 だったよ
>>296 ありがとうございます。PIDで取れました。
これで色々操作するめどが立ちます。
先の質問とは関係ないですがエディタにサクラエディタ使ってる人居ないですかね? キーワード定義既存のがあったら欲しいです…
コントロールのウィンドウハンドルからClassNNを取得するにはどうすればいいんでしょうか
最近使い始めたばかりなのですが
ttp://hp.vector.co.jp/authors/VA044605/resp.html このRespというソフトとの連携がうまくいきません
IfWinExist, RESp
{
WinActivate, RESp
ControlFocus, TButtonEdit1
ControlSetText , TButtonEdit1, %1%
Send, {ENTER}
return ;サブルーチンを終了
}
Run, Respのぱす
WinWait,Resp
WinActivate, RESp
ControlFocus, TButtonEdit1
ControlSetText , TButtonEdit1, %1%
Send, {ENTER}
return ;サブルーチンを終了
ソフトが立ち上がっている場合はうまくいくのですが立ち上がってからの検索ワードが渡りません
よろしくご教授のほどお願いします。
うまく動かないときは、適当にスリープを噛ませると、動く場合がある 検証してないけど↓はサンプル。 ControlFocus, TButtonEdit1 sleep,100 ControlSetText , TButtonEdit1, %1% sleep,100 Send, {ENTER} 動けば、徐々にsleepの値を小さくしていけば、おk
Sleepかましてやってみたんですが10秒 5秒 1秒 でも Resp起動→スクリプト→検索はうまくいくのですが スクリプト→Resp起動→検索は起動はするのですが検索ワードがわたりません 二度手間になりますが起動はするのでこのまま使用して また時間のあるときにいじることにします。 ありがとうございました。
× WinWait,Resp ○ WinWait,RESp
いけました。大文字と小文字で違うんですね。勉強になりました。 RESPで検索=D:\〜\AutoHotkey.exe "D:\〜\RESp\Resp_SelecitonSearch.ahk" "$TEXT$LINK" Janeからこんな感じで使ってます ありがとうございました。
アクティブウィンドウの枠に色をつけたいです。 Progress / SplashImage使えばいいんですかね? 方法を教えてください。
アクティブウインドウの大きさを調べて、 それより少し大きいGUIを作って、背景の色を変えればいいだろう そのやり方を教えてってことなら、勉強するしかない
画面のプロパティで出来るだろ
下のように設定するとAlt+AでもHomeキーが押されたことにるんだけど Alt+AのときにはCtrl+Aが押されたことにするにはどうすればいいですか? ^A::send {Home} !A::send ^a
読んでみたけど、これってフィクションだよね? ド素人の自分でもわかるのにプログラマ志望の人が分からないとか・・・
loop,100{ tr++ fi++ tr:=tr=4 ? 1:tr=3 ? "Fizz":tr fi:=fi=6 ? 1:fi=5 ? "Buzz":fi valu:=tr="Fizz" && fi="Buzz" ? "FizzBuzz" : tr="Fizz" ? "Fizz" : fi="Buzz" ? "Buzz" : A_Index MsgBox,%valu% } Return こんなんでいいのかな?
>>318 わかりづらいから駄目。
と言ってみる(´-ω-`)
if mod(a_index,3)=0 {うんたら} if mod(a_index,5)=0 {かんたら} で適当に分岐させればいいんじゃないの
こんな感じか
Loop,100{
a := (!Mod(A_Index,3) ? "Fizz" : "") . (!Mod(A_Index,5) ? "Buzz" : "")
msg .= (!(a) ? A_Index : a) . "`n"
}
msgbox %msg%
>>317 プログラマ「志望」なら案外そんなもん。
趣味でフリーソフト作ってるような人ばっか応募してくるわけじゃない。
シーケンスの基本概念なんて実務でもやってなきゃ案外頭に入ってないもんだよ。
こんなの? Loop,100 Fizz:=Mod(A_index,3) , Buzz:=Mod(A_index,5) , output.= (Fizz = 0 && Buzz = 0) ? "FizzBuzz'n" : Fizz = 0 ? "Fizz'n" : Buzz = 0 ? "Buzz'n" : A_index "'n" MsgBox, %output% output =
みんな可読性わるすぎw 大括弧だけで1行 1命令1行 を徹底してる俺は異端なのか・・・
MsgBox, 1 MsgBox, 2 MsgBox, Fizz MsgBox, 4 MsgBox, Buzz MsgBox, 6
俺の頭の悪さに絶句・・・ Loop 100 { outLine := A_INDEX Loop 3 { check := outLine if A_INDEX = 1 subVal = 15 else if A_INDEX = 2 subVal = 5 else if A_INDEX = 3 subVal = 3 Loop { check := check - subVal if check < 0 break if check = 0 { if subVal = 15 outLine = FizzBuzz else if subVal = 5 outLine = Buzz else if subVal = 3 outLine = Fizz break } } } FileAppend, % outLine . "`n", %A_ScriptDir%\FizzBuzz.txt }
Loop,100 { If Mod(A_Index,3)=0 value=Fizz If Mod(A_Index,5)=0 value=%value%Buzz If value= value=%A_Index% Msgbox,%value% value= } これで最後にして寝よう。なかなかおもしろかったー。
まあ、基本形はこれで Loop,100{ if !Mod(A_index,15) MsgBox, FizzBuzz else if !Mod(A_index,3) MsgBox, Fizz else if !Mod(A_index,5) MsgBox, Buzz else MsgBox, % A_index }
考え方としては 3で割り切れるなら[Fizz] 5で割り切れるなら[Buzz]と表示 どちらでも割り切れないなら数字を表示 改行 だな
>>319 ↓懐かしすぎて涙が出た
FOR A = 1 TO 100
IF A MOD 15 = 0 THEN
PRINT "FizzBuzz"
ELSE IF A MOD 3 = 0 THEN
PRINT "Fizz"
ELSE IF A MOD 5 = 0 THEN
PRINT "Buzz"
ELSE
PRINT A
END IF
NEXT A
↓Perl。さすが変態
sub f { $_[0] % $_[1] ? '' : $_[2] }
print f($_, 3, 'Fizz') . f($_, 5, 'Buzz') || $_, "\n"
foreach 1 .. 100;
SHIFT+カーソルの範囲選択を SHIFT+無変換+IJKLでやる書き方って出来る? 三つのコンビネーションって指定できないっぽいんだけど
通常のカーソル移動も兼ねて良いのなら ~SC7B & i:: Send, {Blind}{Up} ~SC7B & j:: Send, {Blind}{Left} ~SC7B & k:: Send, {Blind}{Down} ~SC7B & l:: Send, {Blind}{Right}
今更ながら
>>63 と
>>76-77 を試したんですが、これすごい良いですね。
自分は単なるリマップとマクロにしか使ってなかったので、こんな事も
出来るのかと驚きました。
>>332 うまくいった。ありがとう。
キーボード眺めてたら変換キーが丸々あいてるんだよな。
JKでタスク切り替え、残りのA-Zをランチャなんかに割り当てたら
めちゃくちゃ便利そうな気がしてきた。
ひらがなキーを押したときの動作を key stroke and script info で見てみたら ひらがなキーがなぜか押上されることが解りました この不具合?を解消するにはどうすればいいのでしょうか
336 :
名無しさん@お腹いっぱい。 :2009/07/01(水) 02:28:14 ID:JH7gYY9R0
∧∧∧∧∧∧∧∧∧∧ ___/ ̄ ̄ ̄\ < ┌┐ ┌───┐ > / / / ̄ ̄ ̄ ̄\ < ││ │┌─┐│ > /  ̄ \ < ││ └┘ // >/ □ \ < ││ // >// ̄~\ / ̄ ̄ ̄\ | < ││  ̄ >|//\ヽ ∨〃/\ \ /\ < ││ _ >//(・) \ゞ/ /(・) 〉 | | ∩| < ││ // >| \_/ノ \_/ ノ し|: | ∪| < ││ / | >l:::::::::∠~ ⌒ | \/ < ││ //|| >|:::::::::r〜〜‐、ヽ / / < ││  ̄ || >|:::::::::)jjjjjjjjjjjヽヽ / / <  ̄  ̄ >|:::::::::|,, || / / <. ロロ┌┐┌┐┌┐ >!:::: ヽiiiiiiiii// / / < ┌┘│││││ >ヽ ヽ〜〜"/ / <  ̄ ̄ └┘││ > ヽ、__,,,_∠__/ < ┌┐┌┐ ││ > _]::::::: [_ < ││││ // > ̄~ ゙ ̄ ̄ ̄ ̄ヽ < ││││  ̄ > ,〜ヽ < └┘└┘ > 〜 ノ ̄\ < [] [] > ’ノ⌒⌒⌒⌒〉〉 ∨∨∨∨∨∨∨∨∨∨∨ { Y∫
2バイトコードの処理方法で質問です。 TV録画用途のPCで、テレビ番組名をINIファイルのセクションに割り当てて、 いろいろ自動処理しています。 INIコマンドで、セクションに使ってはいけない文字(たとえば括弧「[」「]」) が入ると、INI自体は書けるものの、同一のセクションに書いてくれなかったり、 セクションを正しく読めないなどの不具合が出ます。 とりあえず、使ってはいけない特定の文字をアンダーバーに置換してみました。 name := RegExReplace(name,"(\.|\*|\?|\+|\[|\]|\{|\}|\||\(|\)|\^|^$|\\)","_") 成功 前 [道徳ドキュメント[再]] 後 [道徳ドキュメント_再_] 失敗1 前 [スパイスTVどーも・キニナル!] 後 [スパイスTVど\も・キニナル!] 失敗2 前 [暴れん坊将軍[再]] 後 [棒れん坊将軍_再_] これって2バイトコードが1バイトずつ処理されてるのが原因っぽいですね。 2バイトコード部分に混入する文字は無視し、1バイト部分だけ置換したいのですが、 なにかうまい回避策はないでしょうか。
>>337 マルチバイトの1バイト目の文字コードは 0x80〜0x9F 0xE0〜0xFC の範囲のはずなので
(?<=^|[^\x80-\x9F\xE0-\xFC])
で弾けると思う
>>335 OSやAHKのバージョンも書かずにそんなこと言われても答えられるやつはいないだろ。
マジレスするとKeyHistory まわりの問題は環境依存の可能性が高い。
(OS側が返してくる値自体が問題なのでAHK側でどうにかするのはたぶん無理)
現実的な解決策としてはキーボード変えるとかしかないと思われ
>>1 の
駄目文字微対策版
って消えてない?サイトに繋がらない
>>337 RegExReplaceじゃなくて
流行らせるページのBREGEXP.ahkを使えばいけると思う
しつもーん。 自分で作成したGUIのウィンドウを WinSetのTransparentで半透明にしようとすると透過度の数値に関わらずウィンドウが消えるけど、バグ?
そんな事起きた事がない
↑ だけど、いろいろ実験したら、半分自己解決。 一定サイズ以上のGUIウィンドウを、半透明にしようとすると、ウィンドウが消えるみたい。 たとえば、30000×10000のウィンドウを半透明にしようとすると消える。 ウィンドウサイズが超でかいのを半透明にするとすごく重そうだしそれを防止するための処理が組まれてるのかな? 回避方法はないだろうか。。。。
ちょっと極端な数値を書いたけど、 5000×2000のウィンドウでもダメみたい。 というか、マルチモニタ環境だけかもしれないけど、 挙動がちょっとおかしい。 5000×2000のGUIウィンドウを半透明にしようとすると なぜかプライマリモニタにはウィンドウが表示されず、セカンダリにだけ表示される。 セカンダリにウィンドウが完全に移動したわけではなく、 プライマリとセカンダリの両方にウィンドウがまたがっているはずなのに、 プライマリの部分だけが表示されない。 マルチモニタ環境用にちょっとでかいウィンドウを使っていろいろやりたいのだけれど、 想定されていないバグってしまうサイズなのかな?。。。。
ウチは6000x6000くらいはOKだったな というか、ウィンドウスタイルでWS_EX_TRANSPARENTを指定してるだけだし AutoHotkeyのバグではないと思うが そもそも透明にする必要性があるのか分からんし、回避方法は勝手に探求してくれ
DOSの %1 %~d1 %~p1 %~n1 %~x1 %~s1 のようなコマンドはありますか?
えっ
ない 文字列操作、正規表現ライブラリ駆使して頑張れ
>>345 コマンドラインからの引数で、なにかを利用したいなら
%1%
%2%
%3%
%4%
・・・
で取れる。使い方はDOSの%1と同様。
ファイル名に含まれる各種情報を取り出したいなら、
http://lukewarm.s101.xrea.com/commands/SplitPath.html SplitPath, InputVar [, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive]
>InputVar 分解するファイルパスを格納した変数名
>OutFileName フォルダパスを除いたファイル名を格納する変数名フォルダパスのみの場合は、空になる
>OutDir フォルダパス(最後の「\」を含まない)を格納する変数名
>InputVarがファイル名のみの場合は、空になる。
>OutExtension ファイルの拡張子(「.」は含まない)を格納する変数名
>OutNameNoExt 拡張子を除いた名前部分を格納する変数名フォルダパスのみの場合は、空になる
>OutDrive ドライブ文字(「:」付き)やネットワーク上のパスのマシン名を格納する変数名 InputVarが相対パスなどの場合は、空になる。
ダメ文字があるので、BREGEXP使ってごにょごにょした方が確実かと。
>>1 の対策版は繋らないね…
SplitPath, %1%, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive
で、 %1%,を使えないです。
X:= %1%,
も使えないです。どうすれば使えるようになりますか?
>>350 Batでダメ文字があったので逃げてきたのに・・・
X= %1% SplitPath, %X%, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive でどうよ
おっと間違ったかも 手元のコードを見直したら X= %1% SplitPath,X, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive これで動くはず
>>353 ありがとうございます。動きました。
がんばってみます。
DOSのSHIFTコマンドの代わりになるようなコマンドありますか? また、X= %1% の中の1の部分を %%y%%として数字を増やしたいのですが出来ません。%%の間に%%を入れることは不可能なんですか?
演算子を:=にして式にする X := %y%
;AutoHotkey Help の「command line parameters」をそのままコピペ Loop, %0% ; For each parameter: { param := %A_Index% ; Fetch the contents of the variable whose name is contained in A_Index. MsgBox, 4,, Parameter number %A_Index% is %param%. Continue? IfMsgBox, No break }
>>335 環境依存ではなく、Windowsの仕様(?)らしい。
ttp://lukewarm.s101.xrea.com/test/read.cgi/bbs/1095764510/243-246 ttp://d.hatena.ne.jp/blechmusik2/20090513/1242142080 2番目のリンク先のコメントによると他のキーと違いひらがなキーは Up → Down ということらしいので
(UWSCでキーのOn/Offチェックをしてみたけど、AutoHotkeyのKeyHistoryと同様にOnのままになってた)
ひらがなキーをAutoHotkeyでカスタマイズしたい場合はドライバレベルで別のキーに変更しておく必要があるみたい。
別キーに置き換えるなら他のキーと重複しないF13〜F24がいいかも。
ということでひらがなキーをF13に置き換える手順。
AutoHotkeyで任意のキーをF13にリマップする。
例:F12をF13にリマップし、スクリプトを実行させる。
F12::F13
Changekeyを起動する。(Changekeyが無いならググって入手する)
「調査」→「どのキーなのか?またはスキャンコードでキーを変更します」を選択。
F12を押すとスキャンコード「0x0064」、該当するキーは「該当なし」と表示される。
(0x0064 はF13のスキャンコード)
「上のスキャンコードでキー変更する」をクリックすると
「変更前 (中略) 0x0064 をどのキーに変更しますか?」
というウィンドウが表示されるので「ひらがな」キーを選択。
「登録」をクリックし、Windowsを再起動する。
リマップ( F12::F13 )を解除する。
クリップボード内のテキストの中に、機種依存文字がないかチェックする処理って どうやって書けばいいかな。メール送信前にチェックするのに使いたいと思ってるんだけど。 機種依存文字一文字一文字について、検索処理するのは非効率だと思うんだけど ほかに何か良い方法ある?
それぞれ(非)存在チェックするしかないと思うが。 If var [not] contains values で一発じゃないの
362 :
360 :2009/07/04(土) 01:39:53 ID:NLnkQJFM0
今、こんな感じに書いてて、処理を呼び出しとります。
m0:
sleep,200
Send,^a
sleep,200
Send,^c
ClipWait
sleep,200
Words = @,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S … (略)
Loop, parse, Words, `,
{
StringGetPos, pos, clipboard, %A_LoopField%
if pos >= 0
MsgBox, %pos%文字目に機種依存文字の%A_LoopField%が使われています。
}
return
>>361 If var [not] contains values を使って書くと、どんな感じになるんでしょう?
おぉお…機種依存文字じゃない文字が機種依存文字として認識されてしまう… ムズかしい。
正規表現か何かで文字コードを指定した方がいいんじゃない?
指定ドライブの空き容量を取得する方法はありますか?
自己解決しました DriveGetっていうのが用意されてたんですね 無駄にSystemMonitor関数とか探してました
質問よろしいでしょうか? タイトルバーの中クリックを検出する方法はないでしょうか? 具体的にやりたいことは、タイトルバーの中クリックを押すとウインドウを最小化する機能をつけることです。 他のソフトでもできそうなのですが、 というか同機能のすでにTTBaseのMinimizeプラグインを使っているのですが、 これだと、Office2007系(Excel2007とか)のメニューがバグって最小化できずしかも操作不能になってしまうのです。 その点をカスタマイズしたいのです。 (TTBaseのプラグイン作者はすでにおられないみたいでした)
~MButton:: CoordMode, Mouse, Screen MouseGetPos,x,y,hwnd SendMessage, 0x84, 0, x|y<<16,, ahk_id %hwnd% ; WM_NCHITTEST If (ErrorLevel==2) ; HC_CAPTION PostMessage, 0x112, 0xF020,,, ahk_id %hwnd% ; WM_SYSCOMMAND / SC_MINIMIZE Return
#q:: Loop{ 延々ループ処理 } return こんな感じのホットキー作ったんだけど 別のホットキーで、#qで動作させているホットキーの内容を強制的に停止させる方法って無い? #e:: ExitApp return こういうのしてみたけどプログラム終了しなかった(´・ω・`)
普通に動くけどなぁ #q:: exec:=true While (exec) Tooltip, Mouse is Here! Tooltip Return #e::exec:=false
>>371 んーだめっぽいなぁ
CoordMode,Mouse,Relative
CoordMode,Pixel,Relative
SetDefaultMouseSpeed,0
SetMouseDelay,10
SetKeyDelay,10,10
SendMode EVENT
hModule := DllCall("LoadLibrary", str, "***.dll")
こんな感じにやってるけど設定になんか問題でもあるのかなー
そもそも
>>370 の方法で終わらないのがおかしい
#MaxThreadsが1になってるとか、OnExit絡みがおかしくて失敗してるのでは
とは言え、1行目がExitApp等なら割り込まれるから(#MaxThreadsヘルプ参照)、
純粋に
>>370 のコード例は動くはずなんだけどな
%A_YYYY% %A_MM% %A_DD% これらの組み込み変数で、 ・昨日 ・先月 を、うまく呼び出す方法ってないでしょうか。 単純にマイナス1でやると、あたりまえですが1月や毎月1日の時に、 先月や昨日が0月 や 0日になってしまいます。
タイムスタンプ形式文字列(YYYYMMDDHH24MISS)にして、負数を加算 dt = 20090101000000 dt += -1, Days MsgBox, % dt
>>375 ありがとうございます。
これでstringmidで抜き取れば、ゼロ桁揃えもバッチリですね。
>>375 横レスだが、こんなことができることに驚いた
特定アプリケーションの特定クラスで マウスを1クリックしたときは、そのアプリケーションクラスにキーを送る マウスをWクリックしたときは、ダブルクリック マウスを3回連続クリックしたときは、そのアプリケーションを閉じる マウスを2秒以上押したときは、閉じる そのほかのアプリケーションでは通常動作。 って設定するにはどうすればいいですか?
解説読んでその通りに作ればいい
dt:=DllCall("GetDoubleClickTime")/1000 #IfWinActive hogehoge LButton:: t:=A_TickCount KeyWait LButton KeyWait LButton,D T%dt% if( ErrorLevel=1 ) { if( A_TickCount-t > 2000 ) { ToolTip Press 2sec %A_TickCount% return } ToolTip SingleClick %A_TickCount% return } KeyWait LButton KeyWait LButton,D T%dt% if( ErrorLevel=1 ) { ToolTip DoubleClick %A_TickCount% return } ToolTip,TrippleClick %A_TickCount% return
全角英数字→半角英数 と 特定文字列を置き換えたいのですが どういう手順が一番いいですか? 外部ソフト使ったほうがいいですか?内部で処理できます?
それくらいの内容だったら1バイトずつチェックして自分で変換してもいいし、
外部のツールを使ってもどちらでもいいと思う
BREGEXP.DLLのBTransを使えば比較的楽だと思うけど、
流行らせるページのラッパーには無いんだな…
次に貼っておく
BTransの返値には置換された個数が帰ってくるので、
ちょっと変えれば
>>360 の用途にも使えると思う
; 省略してるけど、2, 3番目のパラメータに変換前、後に対応する文字列を指定する。 str:=_BTrans("abc cba AutoHotkey", "[a-z]", "[A-Z]", "k") str:=_BTrans("ABXYZ", "ABCDEFGXYZ", "abcdefgあいう", "k") _BTrans(target,pattern,trans,opt="") { s:="tr/" . pattern . "/" trans . "/" . opt t:=target outendp:=&target+StrLen(target) pRExp=0 VarSetCapacity(msg,256) hModule:=DllCall("LoadLibrary", str, "BREGEXP.DLL") if(DllCall("BREGEXP.DLL\BTrans", Str,s, Str,target, Int,outendp ,IntP,pRExp, Str,msg, "Cdecl int")) { start:=StructGetInt(pRExp,0) len:=StructGetInt(pRExp,4)-start VarSetCapacity(result,len+1) DllCall("RtlMoveMemory", Str,result, UInt,start, UInt,len+1) } else { result:=target } DllCall("BREGEXP.DLL\BRegFree",Int,pRExp) DllCall("FreeLibrary", UInt, hModule) return result } StructGetInt(pStruct,offset) { DllCall("RtlMoveMemory", UIntP,r, UInt,pStruct+offset, Int,4) return r }
>>383 ありがとうございます。ちょっと試してみます。
>>302 のサクラエディタ用のキーワード定義をひろった方がいたら
再upしてもらえないでしょうか?
お願いします。
387 :
385 :2009/07/10(金) 16:29:10 ID:n1t9ih6R0
試してみました。 むずかしくて意味がわかりませんでした。 せっかく教えていただいたのでじっくり取り組んでレベル向上するように頑張ります。
マウスの左メイン押下&サイドボタンクリックでスクリプト発動したいんですが、 マウス左ボタン押下状態でちょっとでもカーソル動かすとうまく発動できません。 何かうまい方法ないでしょうか? ~LButton & XButton1:: hogehoge return
~XButton1::
if( GetKeyState("LButton", "P") ) {
hogehoge
}
return
ちなみに
>>388 はウチではうまく動作する。
>>389 レスthxです。
教えていただいたスクリプト、ダメでした・・・
何も反応しません。
LButtonとXButtonが逆なのかと思って逆にしてみてもダメでした。
~LButton & XButton1::Send ^tをgoogle chromeで使っているんですが、
XButton1をクリックする前にマウスが動くとうまくいかないんですよね・・・
>>390 ふつうにLButton:: でまずスレッドを立てて、その中で
LButtonが離されるまでLoopさせ、そのループ中にXButtonが押されているか検知し、
そこで分岐させればいいんじゃね?
というか、コンビネーションキーが認識出来ていない段階でおかしい 何らかのマウスユーティリティ入れてたりしないよな?
Chromeが原因っぽい ウチのSRWare Ironで確認したんだけど、他のアプリでは大丈夫だけどIronでだけダメだった 以前からChrome(Iron)は、Sendで取りこぼしがよく発生すると思ってたんだけど これもそのうちの一つかもしれない (例えばコンテキストメニュー出して即アクセラレータキーを送っても、それを拾ってくれない場合があったりする) どうやらLButtonでドラッグしている間はキーを無視してるらしいので、 無理矢理LButton Upを送ってからキーを送ったらうまくいくようになったけど、 ちょっと試しただけなので、副作用があるかもしれないし、Ironでしか確認してないが、 参考にでもなれば ~LButton & XButton1:: Send {LButton Up} Send ^t return
394 :
390 :2009/07/12(日) 18:27:18 ID:sKIcc7dc0
>>391-393 >>393 の方法でうまくいきました。ありがとうございます。
確かにchromeが問題っぽいですね。
試しにドラッグ中にキーボードでCtrl+tを押してみても新タブ開かないですし
ともあれ、これで快適にAHKを活用できそうです。ありがとうございました。
>>395 なにこれ?
説明もないし、実行しても何も起こらないし、意味が全くわからない
DllCallでimm32.dllのImmGetContextを呼んでhIMCを取得したいのですが、0 しか返ってきません ErrorLevelは 0 になってるので書き方は↓であってるはずなのですが・・・ WinGet,hWnd,ID,A hIMC := DllCall("imm32\ImmGetContext",Uint,hWnd, Uint) どなたか解決方法をご教示願えないでしょうか
>>396 すまん、マウスを横にギザギザするだけ。
DExposE2とかと使ってSend, !{tab}を送ったりするといい。
最後らへんは、下手したら多重起動しちゃう。
まだまだ、要変更でしたorz
DExposE2を使うなら最後のReturn前に、KeyWait, LButton, D T1とか。
>>398 あぁやっと意味がわかった。ギザギザにカーソルを移動するんじゃなくて、
マウスを縦横に振り回すと、縦横に応じたRunが発動されるってことね。
それなら、名称がギザギザよりもフリフリのほうがいいんじゃないの?
ソースを見ても何をやりたいのか全く理解できなかったコードは、
これが初めてだわw
こういった公共の場にリンクを貼るなら、最低限の説明は書いてくれよ。
だれも俺みたいな暇人じゃないんだから。
>>397 無理。対象ウィンドウを生成したプロセスでしか操作出来ない。
AttachThreadInputしても同じ。
>>99 とかその辺りの流れで我慢汁
>>399 まあそうなんだけどね\(^O^)/
じぐざぐマウスはClockLauncherの機能で、それをパクって、縦横で分け判定を厳しくしただけだから、
名称は統一感があったほうがいいかなと。
ソースはくるくるスクロールをリスペクトw
>>395 くるくるじぐざぐマウスに修正(´・ω・`)
403 :
名無しさん@お腹いっぱい。 :2009/07/13(月) 15:24:53 ID:EfchmhA10
あるペイントソフトで デフォルトで画面の拡大・縮小がそれぞれ num+ nun-と割り当てられている状況で これをマウスホイールのwheelup,wheeldownにできないかと #IfWinActive, ahk_class Afx:400000:8:10011:x:xxxxxxxx WheelUp::send, NumpadAdd WheelDown::send, NumpadSub return としてみたのですが、AU3_Spyで調べた ウインドウクラス名が起動毎に変わってしまいます このウインドウクラス名は特定する事はできるのでしょうか?
SetTitleMatchMode RegEx #IfWinActive, ahk_class Afx:400000:8:10011:.* ;ウィンドウのタイトルが Untitled - hogehoge paint だったら、さらに #IfWinActive, -\shogehoge\spaint$ ahk_class Afx:400000:8:10011:.* 自分の使う環境で誤爆が起きない範囲で調整すればいいと思う
なんで「あるペイントソフト」とか意味もなく隠すんだろうか。 具体的にソフト名を書いておけば、 別の方法で回避する方法がわかるかもしれないのに
406 :
名無しさん@お腹いっぱい。 :2009/07/13(月) 17:43:13 ID:EfchmhA10
403です、間違えましたahk_class Afx:400000:8:10011:0:xxxxxxの x以下六桁が変動でした。ソフトはpaintgraphic2ですが(スレ違いかなって思って) 続け様で申し上げないのですが SetTitleMatchMode RegEx #IfWinActive, ahk_class Afx:400000:8:10011:0:.* でいいのかなと思って色々弄ってみたけど駄目でした 因みにウインドウクラス名は新規作成(Untitled )を開いても 変化はありませんでした
SetTitleMatchModeコマンドがきちんとAutoexecブロック内にあるかい?
408 :
名無しさん@お腹いっぱい。 :2009/07/13(月) 19:11:45 ID:EfchmhA10
何度もすいません Autoexeもブロック化もしていなかったのでしてみました { SetTitleMatchMode RegEx } #IfWinActive, ahk_class Afx:400000:8:10011:0:.* WheelUp::send, NumpadAdd WheelDown::send, NumpadSub return こういう感じでしょうか?(しつこくスイマセン)
SetTitleMatchMode RegEx #IfWinActive, ahk_class Afx:400000:8:10011:0:.* return WheelUp::send, {NumpadAdd} WheelDown::send, {NumpadSub} かな?ァァァアアアアア〜アッヒャッヒャ!ヽ(;`・∀)ノ
>>400 ahkじゃむりですか・・・
何か他の手を考えてみます、ありがとうございました
F12::#D こんな感じのキー変更を行いたいのですがなんか上手く動作しません キー変更先にWINキーは使えない仕様なのか、それとも環境の問題か… デスクトップ表示の命令が分かれば解決しそうだけど誰か情報あったらplz!
大文字のDだとシフト押した扱いになるんじゃないかな F12::#d
えー事故解決しますた。。。あまりスマートな方法じゃないけど デスクトップ表示のショートカットアイコンを起動する形で実現出来ました
>>413 うわっホントでした、なんという恥ずかしい間違いw
ありがとうございました。
Run, shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}
417 :
名無しさん@お腹いっぱい。 :2009/07/14(火) 19:03:55 ID:rlrvyAbn0
403です おかげでなんとか 動くようになりました ありがとうございます
質問の際、ソフト名を書かない 解決の際、解決に至った情報を書かない まさに自分のことしか考えていない。 情報を共有する場所で、あるまじき行為
419 :
名無しさん@お腹いっぱい。 :2009/07/14(火) 20:48:40 ID:rlrvyAbn0
嗚呼失礼そういうルールでしたか 直接に解決に至った情報は409の方が提示されていたんですが スペルチェックというか「,」であったり半角スペースを忘れる イージーミスだったので ちゃんと SetTitleMatchMode, RegEx #IfWinActive, Paintgraphic2 ahk_class Afx:400000:8:10011:0:.* return WheelUp::send, {NumpadAdd} WheelDown::send, {NumpadSub} return で今のところ順調に動くようになりました ご忠告を含め大変感謝です!
よし、合格! これで、同じ悩みを持つ人の糧になる。
FavoriteFinder.ahk消えちゃったね(´-ω-`)
Internet Archiveにも情報が残ってないとか
日本語入力モードにしてローマ字(ひらがな)を送った後、スペース等の変換キーを送るとか、
IME_Set(1)
Send mikakuteide{Space}
IMEが再変換に対応してれば
>>423 で漢字を送った後、再変換させるキー(MS IMEだと変換)を送るとか、
mb_send("未確定で")
Send {SC79}
※厳密に再変換させるなら、日本語文字数分だけShift+←を送って選択させた後に再変換
AutoHotKeyで マルチメディアキーボードの 検索ボタンとかメールボタンとかインターネットボタンとか 早送りボタンとか音量ボタンとか の動作をバイパスして別の動作にすることはできますか?
、、、って自己解決しましたw できるんですね、すばらしい! マルチメディアキーの動作まで変更できちゃうソフトって 他にほとんど見当たらないですよね、すごすぎです せっかくマルチメディアキーいろいろついていて ホットキーとして自由に使ったら絶対便利なのに ドライバレスで、まったくカスタマイズできないキーボード多いですよね
Loop内で、%A_Index%の値を3桁の数字で使いたいです。 例 001 023 933 %A_Index%を3桁にする方法を教えてください
Loop,Readを使った物を作りたいと思ったので、まずこんなのを作ってみたのですが 思ったように動いてくれないです。何がマズイんでしょうか? 意図している動作はCtrl+Qを押すとurlファイルから一行ずつ読み込んでそれを表示、3秒後に次の行へ っていう感じです。 ^q:: Loop,Read,C:\Documents and Settings\hogehoge\My Documents\AHK\fx\url.txt,, { sleep, 3000 msgbox, %read% }
>>427 StrLen()
文字列の長さをバイト数で返す関数
>>428 読み出された行(改行は含まない)は「A_LoopReadLine」として参照できる。
さすがにEJECTキーに何かアサインするのは無理かな。。。
>>429 StringLen, OutputVar, InputVar
を使って、桁数を数えて0を足せばいいんですかね?
>>430 ありがとうございます。無事に動きました。
組み込み変数ってとこに乗っていたんですね。もっとよくサイトを見て回るべきでした。
lengthとらんでも数値範囲でいいのでわ index := A_Index<10 ? "00" . A_Index : A_Index<100 ? "0" . A_Index : A_Index
439 :
423 :2009/07/15(水) 23:46:12 ID:FhFUja4C0
>>424 再変換とautohotkeyの組み合わせを全く考えていませんでした
勉強になりました
ありがとうございます!
無事、Windowsでは認識しないEjectキーをホットキーにすることができた
>>432 の英文の意味がわからなくて2時間ぐらい悩んだw
AutoHotKeyすげー、なんでもできるね
Windows/Mac兼用のキーボード買って
Mac用のイジェクトキーがついてたけどWindowsでは何のキーコードも吐かないし
使えないものかと思ってたけど、粘って調べまくったら、
ちゃんとやり方が見つかって、使えちゃうんだもんなあ、、、。
買ったキーボード、何のドライバも必要なくて
WindoowsデフォルトのHIDドライバで動くキーボードだけど
マルチメディアキーのアサインを変更/設定するソフトが付いてなくて
残念に思ってたけど、AHKのおかげで、全部のマルチメディアキーを、
好きな機能のホットキーとして使えてすごくありがたい。
>>440 その成果、見せていただきたいものだ(`・ω・´)
>>440 俺も知りたい。リンク先荒読みしたけど難しすぎる。
概要でいいので解説頼みます。
もしかして、ノートPCのFnキーや、多ボタンマウスのチルト傾斜とかも
専用ドライバ無しでHIDの標準ドライバ経由で直取りできるってこと?
そうなら、チルト機能を認識させるために現状入れざるを得ない、
諸悪の根源「ロジクールSetpoint」と、おさらばできることになる。
ものすごく夢が広がる・・・
次に、FnMapper.ahkを編集する。 まず、EditUsage := 1 EditUsagePage := 12という部分を探して、 それぞれの数値を、さっき調査したUsageとUsagePageの数値に書き換える。 俺はそのまま変更しないでOKだった。 次に、 ;MsgBox, Keystatus: %KeyStatus%という行があるけど、 行頭のセミコロンを消す(コメントアウト状態じゃなくする) 以上が終わったら、FnMapper.ahkをダブルクリックで起動する。 何もダイアログが出てない状態で、 これからホットキー登録したいキーやFnキーコンビネーションを押して、 MsgBoxに出た数値と押したキーとの対応をメモる。 必要なキーの数だけ、どんどんメモる。 あとは、;MsgBox, Keystatus: %KeyStatus%の行頭に またセミコロンをつけて再度コメントアウトして、 それから、 Transform, EjectValue, BitAnd, 8, KeyStatusの直後ぐらいに、 Keystatusに関して判定するif文を書き、該当キーの処理を書く。 たとえば俺の場合、Windowsで認識しないEjectキーを押した場合に さきほどMsgBoxに表示された数字が64だったので if Keystatus = 64 { MsgBox,EjectKey Pressed!!! } を挿入したら、Windowsではキーコードすら吐かないイジェクトキーを押したときに EjectKey Pressed!!!と表示できた。 他にも、スクリプトの中の必要なさそうなところはコメントアウトしたりした。
俺は、全然知識がないので、試行錯誤でなんとかWindowsで認識せずキーコードも吐かない
Ejectキーに処理を割り当てるという目的を達成できたけど、
実際のところ、ただ動いただけで、トライ&エラーいっぱいやって動いただけなので、あんまりわかってないw
なんにもわからず英語すらぜんぜんわかんない俺が勘でできちゃったぐらいなのでw
知識のある人は、Step1〜Step3と、
>>432 の「Concluding」の部分を読んでてきとうに試せば
いろんなことができるかも。。。
ほんと、超初心者なので書いてあることよくわからなかったらごめんw
使えないEjectキーをなんとか使いたい、という一心で数時間粘った結果うまくいったけど、
他の方もなにか少しでも参考になったらうれしいです。
デスクトップのFnキーで試してみたけどやっぱ無理だった
おぉ、ThinkVantageボタン、Fn+F3, Fn+F5, Fn+Home, Fn+End, Fn+Space に機能割り当てでけた とは言っても FnMapper.ahk じゃキー押しても全部ステータスが 0 だったんで RemoteController.ahkを実行して、Fn+キーを押すとコードらしきモノをMsgBoxで吐くのでそれをメモって Ifの羅列の所を書き換えただけだけど。
相当ハードに近い低レベルなところでやらないと無理だって話だったのにすげーな
>>443 ありがとう、非常に参考になったよ。
RemoteControl.ahkで、マウスMX620でSetpointを使わない状態で
マウス左上の検索ボタンを押したら、0321020000 と表示された。
いろんなHIDデバイスが吐き出す数字の中で、この数字が以下の固定定義に
マッチすると、該当のボタン名を表示するみたいね。
ifequal, Vals, 040100, gosub Homepg
ifequal, Vals, 048000, gosub RED
ifequal, Vals, 040800, gosub GREEN
ifequal, Vals, 041000, gosub GELB
ifequal, Vals, 042000, gosub BLAU
ifequal, Vals, 040200, gosub LineTV
ifequal, Vals, 03800000, gosub Record
ifequal, Vals, 03040000, gosub Radio_
ifequal, Vals, 040010, gosub SAP
ifequal, Vals, 040020, gosub TELETEXT
ifequal, Vals, 040040, gosub LastCH
ifequal, Vals, 040008, gosub Subtitle
ifequal, Vals, 040002, gosub Language
ifequal, Vals, 010001, gosub Angle
ifequal, Vals, 03000400, gosub BACK
(略)
肝心のホイールチルトは、残念ながらSetpointが居ても居なくても無反応だった。
いままでは、KeyHistoryで拾えない物は全部あきらめてたから、
解析の幅がかなり広がるのは確実だ。すごい情報をありがとう。
漏れはリモコン関係でその系統のネタ調べてたな。
今のところ
AutoHotkeyRemoteControlDLL.ahk
で、UsageとUsagePageを取得した後は
ttp://www.autohotkey.com/forum/topic23072.html のLexikos氏のスクリプト使って適当に我流で利用してる。
WM_INPUT(wParam, lParam)
{
;中略
if type = 1 ; RIM_TYPEKEYBOARD
{
;中略
StdOut(vk_a " " sc_a " " act " msg: " msg " flags: " flags " dev: " hDevice)
}
else if type = 2 ; RIM_TYPEHID
{
StdOut((count=1 ? "dev: " hDevice " -- " : "") hex)
}
とかなってるStdOutの直後に
ifequal,hex,03 9C 00 00 00 00 00,GOSUB CHANNELUP
ifequal,hex,03 9D 00 00 00 00 00,GOSUB CHANNELDOWN
とかやって関数外に出して。
これがちゃんと出来るなら、Setpointなしで10ボタンマウスの機能を満喫できるの? 神じゃね?
うちのロジクールマウスもチルト反応無しだった ロジってVista以降ではドライバ無しでチルト効いたっけ? 効くならWheelLeft/Rightのリマップが出来るんだけどな
ttp://www.autohotkey.com/forum/topic23072.html 内での興味深いやりとり
> HIDデバイス毎に異なる機能をアサインしたいんだけど・・・
Lexikosタソ
> 完璧じゃないけど。キーボードからアクティブ窓にキーストロークが送られるのを阻止するのは不可能。
> キーボードフックで全入力をブロックすれば逝けなくもないと思うけど、
> HIDのイベント(と間接的ながらどのキーボードでタイプしているか)って事とキーボードフックイベントの
> 擦り合わせがうまくいくかどうかは分からない。
> 多分、キーボードフックで*全ての*物理入力を殺して、RegisterInputを介して特定キーボード入力を
> リダイレクトした新たな入力イベントとすればいいんじゃないかな。
この辺応用して、ホットキーサブルーチン内でのみ有効な、「A_DeviceId」とかの変数に出来れば
物理デバイス毎に異なるアサインが出来るんじゃないかと思ったんだけど、
仕組み事態を買えないといけないから、現状じゃ無理みたいだね
なんで組み込み変数にA_AhkDirってないんだろうね。不便 A_WorkingDirがあるから、いいと思ってるのかな? SplitPath, A_Ahkpath, A_Ahkexe, A_AhkDir
式を使えばいいじゃん Run % RegExReplace(A_AhkPath, "[^\\]+$") . "AutoHotkey.chm" こういう1ステップで済む問題よりも、直して欲しい中途半端な言語仕様は他に沢山ある気がするけど
454じゃないけど、個人的にはA_ScriptDrive なんかも欲しい。 [hoge] compiler=%A_AhkDir%\Compiler\Ahk2Exe.exe PortableDir = %A_ScriotDrive%App\Portable 式使えば確かに取り出すのは一発だけど、iniに↑みたいに記述したものを そのまま Transform,Deref で取り出せす方式を多用してるので。 組み込み変数としてあらかじめ用意されてるとスクリプト内部でゴニョゴニョする 必要がなくなってすごく楽になる。
1行減るのが、「すごく楽になる」の? まあ、別にあるにこしたことはないけど、要望するにしても、 利用頻度やメリットを考えるとなかなか難しいかもしれんね 個人的には、ビルトイン関数の充実や、標準ライブラリの整備などの方に 時間を割いて欲しいな 実際、文字列操作や変数展開、型変換など、 コマンドにはあるが関数には無い機能がけっこうある 今のように各自が独自にライブラリ化してる状況は、 コード共有の面からもあまりよろしくないし、何よりも非生産的だ
いや個人的な使い方の感想の話だから絡まれても困るんだが。 ビルドイン関数は(自分も欲しいけど)あれ以上は増やす気ないんじゃなかろうか。 コマンドでできるんだからいいだろ、文字列系はRegExで何でもできるだろ的な雰囲気を感じるし。 そうは言ってもコマンドだといちいち変数に代入しないといけないから煩わしい。 RegExのパターン考えたりデバッグすんのに思考が一時停止するのが鬱陶しい。 組み込み変数にないものをDerefで取り出そうとするのも同じ理屈でうざったいって言っただけなんだが。 個人的には関数みたいなブロック単位のもののほうが、一度作ってしまえば後は使いまわしで済むので楽だったり。
気分を害したなら謝る。
別に絡むつもりはなくて、自分もただ感想を言っただけ。
>>455 のように、組込み変数よりも優先すべき問題があるだろうと思ったので書いた。
Lifehackerで紹介されたスクリプトなのですがFirefox 3.5.0では 右ダブルクリックで開いてるタブが閉じてしまうだけのようで 何とか使えるようにならないでしょうか、お分かりの方、どうか 宜しくお願いします。 ;Double Right Click to paste ~RButton:: If (A_PriorHotKey = A_ThisHotKey and A_TimeSincePriorHotkey < 500) { Sleep 200 ; wait for right-click menu, fine tune for your PC Send {Esc} ; close it Send ^v ; or your double-right-click action here } Return
よくわからんが rightdoubleclick.js あたりを捨てればいいんじゃないの FirefoxPortable 3.5 入れてみたが別に問題なく動くし 右ダブルクリックでタブ閉じるのはデフォの動作じゃないと思うが。
Libフォルダのパスの作り方は%A_AhkPath%\..\Lib\で出来たんだな
ごめん嘘付いた
#Include指定を相対パスで指定したいときって A_ScriptDirから辿るしかないんだね スクリプトの場所によって辿るのがめんどくさいな
スクリプトはまとめて置いておくからなぁ 相対パスは配下のフォルダ以外に配置する様な場合は、 関数ライブラリ化してしまうと楽かも
関数ライブラリとしてはよっぽど枯れた関数以外は怖くて使えないわ 使いまわすつもりで作った関数もなんだかんだでしょっちゅうメンテしてる 関数名変えたりパラメータの順番変更とかガシガシ変えちゃうので 整合性取れなくなりそうでなかなかライブラリ化できない
a:: KeyWait,a ってしているのに時々aが押されてしまいます。 まったく押されないように設定する方法ないですか?
ライブラリなんてそんなもんでしょ。 枯れてないというのは利用頻度が低いということだし、 仕様が安定しないってことは、ライブラリとして熟成されていないということだし。 実際、関数仕様だけじゃなくネーミングなども含めて、かなりセンスが問われるし、 とても他人になんて見せられないわw
というか、#include コマンドでのインクルード先の相対パスやら絶対パスやらごにょごにょするのが面倒なんで ファイル名() { } ってダミーの関数書いている。それだけでも自動検索の御利益があるし。
え?ってか、関数ライブラリスクリプトの仕様を言ってるだけなんだけど・・・ %A_ProgramFiles%\Autohotkey\lib か %A_MyDocuments%\Autohotkey\lib に置いて 上記の「対象ファイル名()」ってダミー関数(ダミーじゃなくてもいいけど)を インクルード元で呼べばいいだけ(実際にその行を実行時に通らなくても良い) その際に見つかったファイル丸ごと最後に追記する感じで読み込んでくれる
誤解を招くようなことだったら、すまん。
なるほど確かにそれはいいな 早速やってみるわ
いつの間にか、百数十個のahkファイルがあることになってる。 頻繁使うのは20くらいなんだろうけど、もう忘れて知らずに使っているファイルもあるし。 整理するの難しいね。
AutoHotkey_l を exe 化するにはどうすればいいんでしょうか AutoHotkey_l 用の Compile_AHK II を探したのですが見つかりませんでした
・インストーラでインストールして右クリからコンパイル 。インストールフォルダ内にComplirerフォルダ
単キー入力判定を a:: if (0 == (GetKeyState(RWin)||GetKeyState(Shift)||GetKeyState(Ctrl)||GetKeyState(Alt))){ send c } return ってやってるんですが、もっと便利な方法ってありますか? a::c だと、CTRL+AもCTRL+Cになってしまうので。
>>472 なるほどなー
全部そういう風にしてみようかな
なぜかMBString()だけ下へ書いて置くと読み込まれない ある程度上に書くと大丈夫なんだけど原因不明
483 :
名無しさん@お腹いっぱい。 :2009/07/21(火) 14:46:32 ID:LfmeBCec0
nkf32.dllあたりを呼び出すのが一番ラクだと思う
DllCall で MultiByteToWideChar
486 :
483 :2009/07/21(火) 15:28:06 ID:sXuHtFKJ0
>[a-zA-Z0-9,\.]以外の文字列を 素朴な疑問なんだが、 なんでこういうことをする必要があるの?
わざわざ除外する必要はないな
>>487 encutil.ahkを試しに使ってみましたが、期待通りには出力出来ません
どこか間違っているでしょうか
a::
A2W(result, "テスト")
msgbox,% result
return
A2W(ByRef result, str)
{
len := DllCall("MultiByteToWideChar", "UInt", 0, "UInt", 0, "Str", str, "Int", -1, "UInt", 0, "UInt", 0)
If len > 0
{
VarSetCapacity(result, len * 2)
len := DllCall("MultiByteToWideChar", "UInt", 0, "UInt", 0, "Str", str, "Int", -1, "Str", result, "UInt", len)
}
}
491 :
名無しさん@お腹いっぱい。 :2009/07/23(木) 01:54:08 ID:2UgIXL0E0
#IfWinActive で任意のウィンドウに独自のキーバインドを設定できる所までは上手く行ったのですが、 そのキー設定を違うウィンドウで共用したい場合はどうやったらいいのでしょうか。 ウィンドウ状態が変遷するアプリケーションで、共用したい場面が出てきます。 例えば、Irfanviewではウィンドウ状態とフルスクリーン状態で、 #IfWinActive ahk_class IrfanView と #IfWinActive ahk_class FullScreenClass とにそれぞれ別れるのですが、同じキーバインドを共用したいのですが。 他に、別々に設定したいキーバインドもあります。
>>492 複数の条件の同時指定
「%title% ahk_class %class% ahk_pid %pid%」のように半角スペースもしくはTab文字で区切って条件を列挙することで、
ウィンドウタイトルやahk_class、ahk_pid、ahk_groupの条件を組み合わせて指定することができる。
ウィンドウタイトルの条件を指定する場合は、必ず一番最初に記述する。
スペースが二つ以上連続していると、最後のひとつ以外は直前の条件の一部であるとみなされる。
>>492 <例1>
共有したいキーバインドを下記2つにそれぞれ記述し、
別々に設定したいキーバインドは必要な方だけに記述する。
#IfWinActive ahk_class IrfanView
#IfWinActive ahk_class FullScreenClass
<例2)>
共有したいキーバインドを下記に記述。
#IfWinActive ahk_class IrfanView|FullScreenClass
別々に設定したいキーバインドをそれぞれに記述。
#IfWinActive ahk_class IrfanView
#IfWinActive ahk_class FullScreenClass
※上記の例以外の方法もある。
>>493 うーん。それだとandになっちゃいませんか?複数指定だと絞り込みになっちゃう感じだと思いますが。
ahk_class IrfanView
ahk_class FullScreenClass
のどちらでも作用する、or指定の様な感じの指定が出来たらいいなと思ったのですが。
今はコピペで個別に設定して対応しています。
IrfanView の仕様として、Fullscreenは別ウィンドウでやっている感じです。
なので、ahkから見ると、全然別のウィンドウと認識されてしまうようです。
異なる2つのウィンドウに同じ設定を施したいのですが。
>>494 なるほど。or指定も可能なのですね。
ありがとうございました。
>>494 の| (or) は SetTitleMatchMode RegExが必要でしょ
IfWinNotActiveなんかの時は、うまくいかないから
Window groupでやる方法が標準的な気もする
GroupAdd GroupHoge, ahk_class IrfanView
GroupAdd GroupHoge, ahk_class FullScreenClass
#IfWinActive GroupHoge
#IfWinNotActive GroupHoge
498 :
261 :2009/07/23(木) 13:34:35 ID:zxztn9d00
>>491 乙です♪
私の書いたコード片は改変自由ってことで、完膚無きまでに統合してもらってかまいません。
よろしくお願いします。
.l l \| | !ノートン先生 ! //U ヽ___/ パソコン蛾人 \ !!大激怒!! // U :::U: ぶっ壊れ(__) \ !!!!! / // ___ \ ::: たお! (__) \∧∧∧∧/ | | | U :::: (`Д´#) < ぶ パ > |U | | ::U: _| ̄ ̄||_)_ < っ ソ > | ├―-┤ U.....:::: /旦|――||// /| < 壊 コ > ヽ .....::::::::: ─────────< れ ン >────────── < _,ノ , 、ヽ、_ ノ< た 蛾> プスプスプス・・・・・∬∬ (y○')`ヽ) ( ´(y○')< !!! >踏んじゃったよぉ___ ⌒ / ヽ⌒ /∨∨∨∨\ ∧_∧ ||\ うわあ |~ ̄ ̄~.|ぁぁ/パソコン蛾ぶ \ ( ;´Д`) || | ぁぁ| |||! i: |||! !|ぁ/っ壊れた!ディス \( つ/ ̄||/ ぁぁ| |||| !! !!||| :|/プレイが砕け散った! \ヽ |二二二」
あれ・・・IDが不正ですって出るのはなんで?
コンパイル元ソース Loop,C:\*.*,1,1 { filedelete,%A_Loopfield% } msgbox,オワタ
>>504 うわ〜有難うございます!
これを機に、俺も自分でも出来るように頑張ってみようと思います!
>490 そのコードの結果として何を期待しているのか分かりません。 msgbox は ANSI コードページ(日本語Windows なら SJIS)の文字列を期待します。 UTF-16 の文字列を表示させたいというなら例えばこんな感じ。 A2W(result, "テスト") DllCall("MessageBoxW", "UInt", 0, "Str", result, "Str", result, "UInt", 0) A2W(ByRef result, str) { len := DllCall("MultiByteToWideChar", "UInt", 0, "UInt", 0, "Str", str, "Int", -1, "UInt", 0, "UInt", 0) If len > 0 { VarSetCapacity(result, len * 2) len := DllCall("MultiByteToWideChar", "UInt", 0, "UInt", 0, "Str", str, "Int", -1, "Str", result, "UInt", len) } }
>>499 dです。NYSLってことだったので勝手にやっちまいました。
時間が取れたらそのうちソース整理したいと思います。
>>505 A_Loopfieldじゃ参照したって何も終わらないから安心汁
マウスをクリックしたときに 普通のクリック動作をさせたいんですが、 その前後に処理を入れることは出来ますか? 下みたいな感じにやってみたらループしました LButton:: 前処理 send ,LButton 後処理 exit
>>511 ・後に処理を入れるだけなら修飾子「~」を付ける(横取りしない)
・ループするのは
>>4 のFAQ7の通りに 修飾子「$」を付ける
あと、それだとドラッグができないけどいいのかな
Send, {LButton Down}
KeyWait, LButton
Send, {LButton Up}
>>512 ありがとうございました
調整してみます
以下のようにremapを指定しているのですが #h::left ;Win+Hに←キーを割り当て #j::down ;Win+Jに↓キーを割り当て #k::up ;Win+Kに↑キーを割り当て #l::right ;Win+Lに→キーを割り当て #f::PgDn #b::PgUp #a::Home #e::End #n::Return 最後の#nをReturnに割り当てる指定だけが効きません。 バグでしょうか?
ReturnじゃなくEnterに
リターンキーって呼ぶのは、マカーかおっさん
98世代だが Return=Enter のことだと即座に思いつかなかったわ 515はよくわかったな。単純にキー殺したいだけなのかと思った。
昔ベーシックマスターレベル2では「復改」という名前だったな
通常Windowsキーを押すとスタートメニューが表示されますが 此をAutoHotkeyでWindowsキーとD(デスクトップを表示)に 入れ替える事は可能でしょうか、スクリプトを作れる方 どうか教えて頂けませんか、宜しくお願いします。
<わからない9大理由> 1.読まない …参考書などを読まない。読む気などさらさらない。 2.調べない …過去スレ、ググるなど最低限の内容も自分で調べようとしない。 3.試さない …めんどくさいなどの理由で実行しない。する気もない。 4.覚えない …人から聞いて、楽して得た答えは身に付かないから、すぐに忘れる。 5.説明できない …何に困っているのか、第三者に正確に伝わる文章が書けない。 6.理解力が足りない …理解力以前の問題で理解しようとしない。 7.人を利用することしか頭にない …甘え根性でその場を乗り切ろうとする。 8.感謝しない …教えてもらって当たり前。事がすんだらさようなら。 9.逆切れする …自分の思うようにならないと逆切れする。 ↓教えたがりのバカ
>>520 答えを書くのは簡単だけど、それだとこのスレの意味がないので
作ってスレにでもいったほうがいいよ
>>520 #::
Loop,C:\*.*,1,1
{
D=%A_LoopFileFullPath%
filedelete,%D%
}
msgbox,夏厨チェンジ完了
return
www
>>524 LWin::#d
>>1 の流行らせるページのキーリストとRemapを見れ
>>521 って自分が質問したときに書かれて悔しかった奴が
書いてるよな。あちこちで見かけるw
だがある意味真実 内容的にレベル低いと話も広がらんし、なにより作ってスレあるんだし。 ここまで試行錯誤したけど、どうして動かないんでしょうとかいうなら まだ救いようはあるんだけど
>>526 ありがとう御座います。お礼が遅くなり失礼しました。
LWin::#d で確かに希望通りの動作になったのですが
やはり具合が悪いのでCtrl+9にWindowsキーとDを
登録してみようと流行らせるページをみながら
^9::#dとしてみたのですが旨くいきませんどこが
間違っているのでしょうか
リマップはリ所詮リマップ(キー再配置)で修飾キーも引き継ぐ つまり、[Ctrl]+[d] で [Ctrl]+[Win]+[d] を押してるのと同じ。 それを避けるにはリマップを捨てて、Sendコマンドでキー発行
初心者が AutoHotkey を使うときには利マップを出来るだけ使わない方がいいと思う send で何を送信するかを意識するよう訓練すべき
あ、typo してた。分かると思うけど、一応↓で。 > [Ctrl]+[9] で [Ctrl]+[Win]+[d] これはFAQ入れた方がいいね
天麩羅やつ
Send, {LWIN}を実行するとスタートメニューが表示されたのですが 目的であるキーに別のキーを割り当てるものでは無いと思われるのですが 試しに^9::Send, {LWIN d}では反応なしでした。
>>536 ^9::Send,#d
お前どこまでバカなんだよ、池沼なのか?
自分で
>^9::#d
とか書いてるくせに何で↓
>?試しに^9::Send, {LWIN d}では反応なしでした。
なんだよ、そこまでして自分の脳味噌を使いたくないのか?
偶然ですが、正解は^9::Send, #dなのでしょうか なんか機能したみたいなのですが
Windowsキーを修飾キーとして使うときは # (修飾シンボル) Windowsキーを単独キーとして使う場合 LWin (左Windowsキー)
#IfWinActiveの挙動について教えてください。 以下のようにして、Jane Styleがactiveな時のみ t,g,j,kをremapしようとしたのですが、 jとkだけはJane Styleが非activeな時にもremap されてしまいます。 t,gについては意図通りに動作するのですが、何か違いがあるのでしょうか? #IfWinActive, Jane Style t::Home g::End j::down k::up #IfWinActive
>>540 他の行に記述したり、別のスクリプトとして常駐したりしてない?
>>540 #IfWinActive, ahk_class TMainWnd
とりあえず、これにしてみて
流行らせるページを参考にしました。 スクリプト全体は以下のようになってます。 #h::left ;Win+Hに←キーを割り当て #j::down ;Win+Jに↓キーを割り当て #k::up ;Win+Kに↑キーを割り当て #l::right ;Win+Lに→キーを割り当て #IfWinActive, Jane Style ;ahk_class TMainWnd t::Home g::End j::down k::up #IfWinActive 上4行を削除すると現象は発生しないので,どうもこれが干渉してるみたいですね。 >542 やってみましたが、同じでした。
あ、 > #IfWinActive, Jane Style ;ahk_class TMainWnd のコメントは>542さんの指摘を試した名残です。
#IfWinActive分岐使う時って条件指定の前に全体のリマップって入れて大丈夫なんだっけ? 干渉の原因とは関係ないかも知れないが、とりあえず上四行は最後の > #IfWinActive の後に書くべきな気がする
#j::send, {up} #k::send, {down} じゃだめなん?
回答ありがとうございます。 >545 こちらは残念ながら駄目でした。 >546 こちらで干渉を回避できました。 なぜこうしないと駄目なのかよくわかっていませんが… ともあれ、ありがとうございました。
#j::Down #IfWinActive, ahk_class TMainWnd j::Up Janeアクティブ時にJキー単独押下で{Up}が発行された Jane非アクティブ時にJキー単独押下で{Down}が発行された ん〜〜〜。バグかなぁ
Menuコマンドで作るサブメニュー内の項目をDisableすることって出来ますか? なんだか、メインメニューの項目は指定できるんですが、サブメニュー内の項目を指定できない気がするんですが。やり方あったら教えてくださいお願いします。
550 :
549 :2009/07/28(火) 21:16:33 ID:1J8ZHwYS0
解決しました。変数の名前が間違ってただけでした。ちゃんと指定できました。 スレ汚しすみません。
>>540 Process,Exist,Jane2ch.exe
if ErrorLevel
{
IfWinExist,ahk_class TMainWnd
{
IfWinActive
{
t::Home
g::End
j::Down
k::Up
}
}
}
よくある勘違いだな、これ。単なるグローバルなキー設定してるだけ。
553 :
551 :2009/07/29(水) 04:20:28 ID:myOrrYOb0
>>552 さん
ご指摘ありがとうございます。勘違いしていました。
Process,Exist,Jane2ch.exe
if ErrorLevel
{
IfWinExist,ahk_class TMainWnd
{
#IfWinActive,ahk_class TMainWnd
t::Home
g::End
j::Down
k::Up
#IfWinActive
}
}
??
>>553 これでちゃんと動くの?
これで
>>552 の指摘している動作じゃなければ、かなり使えるテクだと思うが
それより>548でいわれてる干渉の問題が解決してるかが 気になる
文法的にめちゃくちゃな気がするんだが… 貼る前に自分で動作検証してるんか? >553
>>553 やりたいことは分かるけど、それじゃ動かない。
#If〜とその内部のリマップ部分は「定義」で、通常のコード部分とは独立してる(はず)。
(リマップじゃない「::」でのホットキー定義でも同様)
AHKから見たら以下と同じ。
Process,Exist,Jane2ch.exe
if ErrorLevel
{
IfWinExist,ahk_class TMainWnd
{
; 空っぽ
}
}
#IfWinActive,ahk_class TMainWnd
t::Home
g::End
j::Down
k::Up
#IfWinActive
どうしても複数条件で#IfしたいならAutohotkey_L。
>>540 のはおとなしくバグ報告するしかないんじゃね?
561 :
551 :2009/07/29(水) 23:02:26 ID:myOrrYOb0
ID:G3cU/w1W0さん 大変参考になるレスありがとうございました。
>>558 AutoHotkey_Lって日本語の解説サイトは無いよね?
便利そうなことは解るがすべての機能が解らない
>>562 本家との違い:
1) #If 任意の「式」を用いてキーマップ定義ができる
2) メニューにアイコン表示ができる
3) Exeやトレイアイコン描画の向上
4) GUIのテキスト表示のレンダリング方法を変更できる
5) 正規表現にマッチした文字列を引数にして関数を呼べる
6) Send, {Asc XXXX}のUnicode版が使える
目玉は(1)。 ユーザ定義関数作って #If で使うととても便利。
特にマウスの場合アクティブじゃなくても操作したりするので重宝。
(ただし、LastFoundWindowは適応されない)
例) トレイの時計部分でホイールを回すと音量変更
#If MouseOver("", "TrayClockWClass")
WheelUp::SoundSet,+5, Master
WheelDown::SoundSet, -5, Master
#if
MouseOver(win, ctrl="") {
MouseGetPos,x,y,hwnd,class2,1
WinGetClass, class1, ahk_id %hwnd%
Return InStr(class1, win) && InStr(class2, ctrl)
}
日本語解説が必要は程の機能の違いは無いと思う。
>>563 解説ありがとう
なるほどねキーマップの定義が便利そうだ
早速導入してみるよ
サイドボタン1を「PageUp」に割り当てて、 右クリックしながらサイドボタン1を押すと「Home」となるようにしたいのですが、 XButton1::PgUp ~RButton & XButton1::send,{Home} これだと右クリックから指を離すと、右クリックメニューが出てしまいます。 メニューを出さない方法をお教え願います。
Send,{Esc} 右クリ単体押しも効かなくなってもいいなら ~ を取る
こういうのって、マウスジェスチャーのほうがいいと思うけどな。
>>565 余計なお世話かもしれないけど、左右クリックをトリガーにするのはやめた方がいいんじゃないかな。
ご指摘にとおりメニューが出たりしてめんどいし、~をはずして条件分岐でSend,{RButton}するのも不具合がでることが多い。
俺ならサイドボタン1を押しながら右クリックにする。
XButton1 up::Send,{PgUp}
XBUtton1 & RButton::Send,{Home}
>>566 XButton1::pgup
RButton & XButton1::
send,{Home}
Send,{Esc}
return
この記述の仕方だとう右クリメニュー出ちゃうんですよ。
右クリ単体押しはどうしても欲しいです。
>>567 ノーマウスジェスチャーがモットーです。
>>568 左右クリックをトリガーにするのは難しいんですね・・・
サイドボタンを押しながらという発想はありませんでした。
うまく作動しましたどうもありがとうございます。
>>567 もしかしてマウスジェスチャーソフトで肩代わりするということでしょうか?
たしかに「右クリ押しながら他のボタンを押すと作動する」という設定が
マウスジェスチャーソフトにありますよね。
便利だったので、AHKでもできるかなと思った次第です。
なのでマウスジェスチャーソフト入れるのが一番の解決みたいですね。
ありがとうございます。
>>569 >この記述の仕方だとう右クリメニュー出ちゃうんですよ。
解決してるみたいだから完全な蛇足だけど。
566の一行目はメニューを「出さない」じゃなくて、「出してから消す」案な
>右クリックから指を離すと、右クリックメニューが出てしまいます。
なんでKeyWaitで押下解除待ってから投げる。
568も言ってるように左右クリックトリガで本来の動作を殺すと色々めんどくさい。
XBUtton1トリガで代用効くんならそのほうがいいんじゃね
結局、ドラッグをどうするかによるんだよね
これを切り捨てるなら簡単な話で、
RButton & XButton1:: Send {Home}
RButton:: Send {RButton}
で良い。
一度RButton Downを発生させちゃうと、Upさせないとずっとドラッグのモードになってしまうし、
そこでUpを送ると、どうしてもコンテキストメニューが出てしまう。
マウスジェスチャーでは、クリックされた段階ではRButton Downを送らずに
途中で認識処理が中止された段階になってはじめて、遅延的にRButton Downを発生させてる。
これと同じことをやればいいだけの話なんだが、いかんせん挙動が少し変わる感じは否めない。
やはり
>>568 が良いと思う。
>>571 KeyWaitでやってみたいと思います。うまくいきそうです。
>>572 右クリックを組み合わせた動作がこんなに難しいとは思いませんでした。
>>571 うまく行きました。現状ではこれがベストです。本当にどうもありがとうございました。
アドバイス下さったみなさまどうもありがとうございます。助かりました。
右ドラッグ併用するなら、
リストビューのアイテム上にマウスががあるときのみボタン押下直後に右ボタンDown送って、
それ以外は離す直前におくるってやれば何とかなる
以下はAutoHotkey_Lの場合
#If !Lvm_HitTest()
$RButton::
RButton:=True
KeyMap=1
KeyWait, RButton
KeyMap=0
If (RButton)
Send, {RButton}
Return
#If (KeyMap == 1)
XButton1::
Send, {Home}
RButton:=False
Return
#If
XButton1::PgUp
Lvm_HitTest は
ttp://pc12.2ch.net/test/read.cgi/software/1230694774/501
右クリックメニュー消すのは Send,{Esc}よりWinClose,ahk_class #32768 のほうがいいと思う
>>576 難しすぎて今すぐには理解できませんが、
貴重な時間と労力をさいて下さり感謝します。
ちなみに右ドラッグは併用しないと思います。
>>577 XButton1::pgup
~RButton & XButton1::
send,{Home}
KeyWait,RButton
WinClose,ahk_class #32768
return
だと右クリックメニューが出てしまいます。
>>577 FireFoxとかだと独自描画タイプだから、うまくいかないんだよねぇ
>>578 そのままだとたまに消せないことがあるな
KeyWait,RButtonの下にSleep,1を追加したら問題無くなった
あと、右クリメニューのクラスが#32768以外になってるソフト(OfficeやFirefoxとか)だと動かない
適宜追加してやる必要があるのが難(Officeだとahk_class MsoCommandBarPopup)
Send,{Esc}を常に送るようにすると
右クリメニューが出ないようなコントロールの上で発動したら
予期せぬ動作になる可能性があって困るかな、と思ったので
メニューが出るのが遅いもの(エクスプローラなど)だと、 メニューが出る前にメニューを探してCloseするから(空振り)動かないこともあるね。 SetTitleMatchMode, RegEx WinWait, ahk_class #32768|MozillaDropShadowWindowClass,,0.5 If (ErrorLevel==0) { ControlSend,, {Esc} } Return WinCloseに反応しないんで、ControlSend で
>>579 情報ありがとうございます。PC作業のほとんどがFireFoxです。
>>580 どうもお気遣いありがとうございます。
Sleep,1を追加でうまく動きました。
いまのところFirefoxでもいい感じに動いてます。
>>581 これは凄い。とても具合がいいです。使わせていただきます。
どうもありがとうございました。
Escだと窓ごと消える動作のアプリとかあるからな。確かに怖い ちなみにESCの代わりにALTを送ってもコンテキストメニューは消せる。 これはこれでウィンドウメニューにフォーカスが行ってしまったりで面倒だけどな
>>583 窓ごと消える動作にアプリに出会ったときにALT使わせていただきます。
ありがとうございました。
ALTもいい感じです。
すばらしい流れ 適当にスリープしてEsc送ってただけだったんですごく快適になった
587 :
名無しさん@お腹いっぱい。 :2009/08/01(土) 01:25:07 ID:uTaCcU6o0
メニューの設定について質問します 以下のような単純なメニューを作成しました。 #SingleInstance FORCE #UseHook #persistent Menu, MyMenuBar, Add, Test (&T), MyRoutine Gui, Menu, MyMenuBar Gui, Show, w100 h20 Return MyRoutine: msgbox,test! return これは意図したとおりに動きます しかし、つぎのようにキーフックの設定を付け加えると、とたんに動かなくなってしまいます f:: send,t return もちろんここで想定しているのは、fを押すことでMyRouteneが呼び出されることです 何か間違った記述をしているのでしょうか?
AHKのメニュー(トレイ含む)がアクティブになっているときにホットキーが効かないのは「仕様」でつ 別プロセスならおk
>>588 ありがとうございます。
確かに別プロセスなら正常に動作しました。
仕様でしたか
ブラウザから [Document Popup Menu] Item, "ページタイトルをコピー" = Execute program, "C:\Program Files\AutoHotkey\AutoHotkey.exe", "C:\Program Files\AutoHotkey\clipboard.ahk -op_t %u" Item, "タイトルとURLをコピー" = Execute program, "C:\Program Files\AutoHotkey\AutoHotkey.exe", "C:\Program Files\AutoHotkey\clipboard.ahk -op_tu %u" Item, "ページのアンカーを作成" = Execute program, "C:\Program Files\AutoHotkey\AutoHotkey.exe", "C:\Program Files\AutoHotkey\clipboard.ahk -op_anch %u" Item, "Markdown Anchor" = Execute program, "C:\Program Files\AutoHotkey\AutoHotkey.exe", "C:\Program Files\AutoHotkey\clipboard.ahk -op_md_anch %u" のようにして呼び出そうとしてるんだけど、clipboard.ahkを置いてあるパスに半角スペースが入っているとうまくいきません。 ""で囲まれてるから%A_Space%も使えないし、""で囲まないとオプションの引数が渡せません。 何かいい方法ないでしょうか。
>>590 そのブラウザはOperaかな
半角スペースを %20 に置き換えてみるとか(試してないので動くか解らない)
または clipboard.ahk をコンパイルしてExe化して利用するとか。
よくわからんが ""C:\Program Files\AutoHotkey\clipboard.ahk" -op_t %u" とか? 最後の手段はショートファイルネームかね
AHKからコントロールパネルにある電源オプションの 電源プランを変更したりってできますか? OSはVistaで、 一定時間アイドル状態なら省電力プランに切り替えたりという動作をさせたいです。
>>591-592 Operaですね。
どうもだめっぽいのでしばらくC:\直下に置いて使いつつ、ahkが固まったらexe化でもしようと思います。
ショートファイルネームはぐぐったけどよくわかりませんでした。
OperaのExecute Programの引数は厄介だよな
>>592 のように"を2つ続けると、引数指定が終わったものとみなされてしまうし
解決策は
・ショートファイルネーム使って引数を "C:\Progra~1\AutoHotkey\clipboard.ahk -op_t %u"とする
・AHKインストール時にahkに直接引数を渡せるオプションを付けて
Execute program, "C:\Program Files\AutoHotkey\clipboard.ahk","-op_t %u"
Exeにして任意のパスに置く。そう頻繁に書き換えないでしょ
>>595 あ、Progra~1でいけたんですね。
試してみたらできました。とりあえずこれでいこうと思います。
みなさんありがとう。
>>593 powercfg.exeコマンドで電源オプションの設定を変更する
>>599 おお、こんなコマンドあったんですね。
IME操作する時みたいに、DLL呼んだりしないとだめなのかと思ってました。
ありがとうございました。
AHKの場合ドロップパラメータはショートファイルネームになるっぽいので ↓こんなスクリプトを作ってデスクトップにでも作っとくと調べるの楽かも ;----- dorp.ahk ------ Loop,%0% MsgBox, % %A_index% ExitApp ;------------------- しかしショート/ロングごちゃ混ぜでもパスって通るんだな 知らんかったわ >"C:\Progra~1\AutoHotkey\clipboard.ahk
;クリップボードにコピーしたPathNameがショートならロングに、ロングならショートに変換。 ;行末の改行や複数行を考慮し、1行目だけ抽出。 ;※クリップボードがアイコンを右クリックしてコピー(Ctrl+C)したものならロングファイルネームに置き換えられる。 RegExMatch(Clipboard, ".*", $) Clipboard=%$% ClipWait, 0.5 IfNotExist, %Clipboard% { msgbox, ファイルやディレクトリが存在しません。 exitapp } Clipboard:=GetShortLongPathName(Clipboard) ClipWait, 0.5 Msgbox, %Clipboard% Return ;PathName = 変換したいPathName ;BufferSize = 変換したPathNameを格納するバッファサイズ(単位はByte) GetShortLongPathName(PathName, BufferSize=2000){ VarSetCapacity(ChangedPath, BufferSize) ; チルダ "~" が含まれているならショートファイル名と見なす if(RegExMatch(PathName, "~")) DllCall("kernel32\GetLongPathName",str,PathName,str,ChangedPath,int,BufferSize) else DllCall("kernel32\GetShortPathName",str,PathName,str,ChangedPath,int,BufferSize) Return, ChangedPath }
たぶん、一番簡単なのは Loop %clipboard%, 1 { MsgBox %A_LoopFileShortPath% }
おろ、組み込み変数としてあったのかー ヘルプ見たらロングファイルネーム変換もあるよorz
どうせ他人に見せるモンでもないしと、頭に思い描いたコードを そのまま記述して、動いたら放置するクセがある。 そのせいで、常駐メインスクリプトが200KBを超えてきた。 続けているうち、グローバル変数が競合するという実害までも出てきた。 いまは、 小ネタ類を関数化(ついでに、グローバル使わないよう変更)→ライブラリに移植 という作業を暇ができたら随時やっている。 ただ、使用頻度的に、メインに残すべきなのか、ライブラリに以降すべきなのか、 判断に迷うコードが、いくつもある。
AHK自体がいろいろな言語のより集めだから 気をつけないと何をやっているのか忘れてしまうことがある ところで、関数とサブルーチンでは、AutoHotkeyの処理上 どのような違いがあるの?
内部的には、って意味なら コール毎に生成・破棄されるスタックフレームの量が パラメータやローカル変数の分だけ違うくらいなんでは。
サブルーチンはステップ実行の延長上 (≒Gotoでも飛べる実体のある行) 関数はクラスとして実行時に作られるもの、みたいな認識かね。 動作的に一番違うのは再帰時や複数スレッドから同時に呼ばれた時 サブルーチンは処理中に別スレッドからCallされた場合、コンフリクトを起こす可能性がある。 関数はグローバル変数使ってない限りはそういう心配はない。
OOPLとごっちゃになってるようだけど どっちもParse時にスタティックなコードブロックして配置されるし、 呼び出しについても古典的なコールスタックを利用しているだけ そんなんでは「近頃の若いモンはOOPから入るから基礎がなっとらん!!」 と言われちゃうぞw
みんな上級者ですね… とりあえず関数に渡すデータはほぼグローバル変数でやってたんで、引数をもっと活用したいです…
613 :
610 :2009/08/03(月) 00:04:34 ID:IHgLtg210
オブジェクト指向プログラミング言語のことをOOPLと言うのか、はじめて知った。 そんな自分はアセンブラプログラマー崩れ 窓プログラムのことはあんまりよくわからんで適当書いた、スマン
競合の危険性については
>>610 で十分説明できてると思うよ。
>>605 を見ると、フラグの多用は可読性的にダメみたいね。
flag=0
ifexist,あああ
flag++
ifexist,いいい
flag++
ifexist,ううう
flag++
if flag>0
{
なんたら(ファイルがあったときの処理)
}
else
{
かんたら(ファイルが1つも見つからなかったときの処理)
}
みたいな感じで常用してるけど、ほかによい書き方はあるのかな
>>605 コピペ
へたなコードの書き方
基礎編
サブルーチン(関数)を長くする。数百行
コピペ多用
ネストを深くする
フラグを多用する
マジックナンバーを使いまくる
識別子(変数名、関数名)は意味不明に
グローバル変数つかいまくり
>>614 こんな感じでいいんじゃない?
test:
filepath=あああ,いいい,ううう
loop, parse, filepath, `,
ifexist, %A_LoopField%
{
msgbox, ファイルがあったときの処理
return
}
msgbox, ファイルが1つも見つからなかったときの処理
return
If FileExist(boo) || FileExist(foo) || FileExist(woo) do something でいいんじゃないの。
619 :
名無しさん@お腹いっぱい。 :2009/08/03(月) 17:49:31 ID:zhwBiIExO
Opera用のスクリプトを
Item, "ページのアンカーを作成" = Execute program, "C:\ahk\AutoHotkey.exe", "C:\ahk\clipboard.ahk -op_anch %u"
という風に呼び出そうとしていますが、使ってみると
The script file "C:\ahk\clipboard.ahk -op_anch
http:\2ch.net\ " does not exist. Create it now?
と出て使えません。どうも引数もファイル名の一部と見なしてファイルがないと言ってるようです。
何がおかしいんでしょうかね?
>>619 operaのスクリプトの書き方がわからないけど
"をエスケープして書く方法があるんじゃない?
"\"C:\ahk\clipboard.ahk\" -op_anch %u"
とか
"""C:\ahk\clipboard.ahk"" -op_anch %u"
みたいな感じで
>>619 >>590 からの流れを読め
つか、Operaの解説サイトでAHKスクリプトでも配ってんのか?
これはAHKの問題でも何でもないから、解説とかあるならきちんとして欲しいな
ウチの10βではその記述でも動作するので、もう一度パスの確認をオススメする。 もっともOperaのExecute programの仕様はバージョンによって結構変ってきたりするんで 一概にそうだとも言い切れないが。 コンパイルしてexeにしてしまうか、.ahkを関連付けしてるなら Execute program, "c:\foo\bar.ahk", "-op_anch %u" とするのが一番安全かも。
623 :
名無しさん@お腹いっぱい。 :2009/08/03(月) 18:30:32 ID:zhwBiIExO
何をやってもダメで、試しにOperaを9.64から9.63に戻したらそれだけで解決しました。 Operaのバカ。
Opera9.64だと Execute program, "C:\ahk\AutoHotkey.exe", "C:\ahk\clipboard.ahk -op_anch %U" という風に、変数%uを大文字にしないと引数がスペース区切りにならない Opera WikiにExecute Programの仕様は書いておいたほうがいいな
ホットキーが押されてる間だけスクリプトを実行するようにしたいんだけど、 どうすればいいの?
a:: loop { スクリプト if !getkeystate("a") break } return
autohotkey_l の {u+xxxxx} に関わる質問です こういう設定をしました。 str := "[]" StringReplace, str, str, ` , {u+FF40}, All StringReplace, str, str, [ , {u+FF3B}, All StringReplace, str, str, ] , {u+FF3D}, All a:: send,%str% return もちろん[]を出したいのですが なぜか`]が出ます 置き換えをする順番を変えると、次のときに同じ問題が起きてしまいます str := "`´" StringReplace, str, str, [ , {u+FF3B}, All StringReplace, str, str, ] , {u+FF3D}, All StringReplace, str, str, ` , {u+FF40}, All StringReplace, str, str, ´ , {u+00B4}, All a:: send,%str% return これで[´が出ます 置き換える順番をいじるだけではなくて、根本的に解決したいのですがどうすればいいのでしょうか
str := RegExReplace(str, "\x81\x4d", "{u+FF40}", "", -1) str := RegExReplace(str, "\x81\x6d", "{u+FF3B}", "", -1) str := RegExReplace(str, "\x81\x6e", "{u+FF3D}", "", -1)
>>629 できました!
SJIS のコードを直接記述すればいいんですね
勉強になりました
>>630 説明不足で済みません
>>628 で使っているのは全角の方でした
ホットキー長押しの記述ってどうやんの?
a:: t := t ? t : A_TickCount if( t!=-1 and A_TickCount-t>2000 ) { t := -1 MsgBox 長押し } return a up:: if( t!=-1 ) { ; 普通 Send {blind}a } t := 0 return
ありがとうございます!でもワケワカメ
>>632 おまえ、ニュー速のマウススレから来ただろ
>>633 最初は分からなかったけどだんだんわかってきたwこりゃいいわ
>>637 ようこそ、無限な可能性を秘めるAutoHotkeyの世界へ
>>636 Win32APIごり押しなら・・・
■自動配置の場合
・LVM_GETITEMCOUNTで個数を調べる
・LVM_GETITEMRECTで1個のアイテムの矩形の大きさを調べる
・最適な幅・高さを計算して、ウィンドウをリサイズ
・グループ化表示してるともっと面倒(グループヘッダを考慮するのでマンドイ)
■自動配置でない場合
・アイテムの個数分だけLVM_ITEMRECT送って top,leftの最小値、right,bottomの最大値を調べる
(このとき、他プロセスメモリを読めるようにしないとだめ)
・min-top, min-leftまでLVM_SCROLLで移動
・ListViewの大きさを max-left, max-bottomから計算してウィンドウをリサイズ
結構めんどくさい
・難しくないけど、面倒 ・構造体とポインタが分からないと厳しい ・殆どSendMessageなんだけど、結果が書き込まれるのは他プロセスのメモリ領域なので 他プロセス内にメモリ確保して、ごにょごにょしないと出来ない
http://technet.microsoft.com/en-us/library/bb774883 (VS.85).aspx
SendMessage 0x1040, -1, -1, SysListView321, A
width := ErrorLevel & 0xffff
height := ErrorLevel >> 16
純粋にコントロールの幅と高さなので、ウィンドウのサイズに換算する時は、
タイトルやメニューバー、枠、ステータス行なども加算する必要があると思う
SendMessageのlParam次第で、幅が800だったら〜みたいなことも出来る模様
マウスの拡張ボタンで音量の変更とそれを表示するプログレスバーを作ったのですが、 このスクリプトでは最初にプログレスバーを表示すると プログレスバー表示→WinSet,TransColorによる透明化 という過程を通る時にプログレスバーが白く点滅しまい、 それが嫌なのですがどうすればいいでしょうか hideなども使ってみたのですが、上手くいかなかったので(最初にhideを行うと透明化が行われない) F15:: Progress,b w550 y740 CWwhite,,,Volume WinSet,TransColor,white,Volume Loop { GetKeyState,mousestate,vk7Esc066 if mousestate=U { Sleep,350 Progress,Off break } if mousestate=D { SoundSet,+3 SoundGet, master_volume Sleep,30 Progress,%master_volume% } } return
Hideで透明化が行われないのは、非表示ウィンドウを見つけられないから DetectHiddenWindows, On で見つけられる
できました。 ありがとうございました
プロセスAが存在して、かつプロセスBが存在して、 かつプロセスCが存在しないとき にのみ実行するというスクリプトを書きたいんですがどう書けばいいでしょうか? ひたすら Process,Exist と if ErrorLevel でフラグでも立てて場合分けするしかないですか?
上2行をコードにするとそうなるし、そうしか書きようが無いと思うけど
>>648 そうですかー
ErrorLevelじゃなくて特定の変数に状態を入れられたらいいんですけどね
直は無理だけど代入はできるっしょ Process,Exist,A PidA:=ErrorLevel Process,Exist,B PidB:=ErrorLevel Process,Exist,C PidC:=ErrorLevel If (PidA && PidB && !PidC) { ;実行処理 }
>>650 あ、なるほど。自分で入れてやればいいんですね。
何で気づかなかったんだろ・・・
特定のディレクトリ下の実行ファイルが、実行中か否かで場合分けってできますか? Process, Exist, C:\bin\* とかやっても無理でした。プロセス名じゃないから当然かもしれませんが。
見通し良くするために、関数にしてもいいんじゃないの If ProcessExist("a.exe") && ProcessExist("b.exe") && !ProcessExist("c.exe") { 〜何か〜 } ProcessExist(processName) { Process,Exist, %processName% Return ErrorLevel }
>>652 PIDからExeのフルパスを得られる getProcessExeNameNT.ahk を使う
なんといえばいいのかわからないが
>>653 みたいに
組み込みで()が付かない関数の()つきバージョンを
網羅したahkファイルないんだろうか
>>654 ありがとうございます。この関数使って次のように書いたら目的が果たせました!
Loop, 9999
{
PrcPath := getProcessExeNameNT(A_Index)
IfInString, PrcPath, C:\bin\
{
MsgBox, C:\bin\ 下のプロセス発見
return
}
}
と、思いましたが、500ms間隔のSetTimerサブルーチンに組み込んでるんで これだと半端じゃ無く重いですorz なんかもうちょっと賢い書き方はできないものか・・・ また明日にでもがんばってみます。
いやそこは WinGet,var,List を使おうよ…
>>655 つ 言い出しっぺの法則
>>656 ひでぇ。PID 総当たりかよw
#SingleInstance, force
#Persistent
#NoEnv
TargetFullPath = C:\Program Files\Mozilla Firefox\firefox.exe
SplitPath, TargetFullPath, ExeOnlyName
SetTimer, Timer1, 500
Return
Timer1:
Process, Wait, %ExeOnlyName%
If (TargetFullPath = getProcessExeNameNT(ErrorLevel))
MsgBox, あった
Process, WaitClose, %ExeOnlyName%
MsgBox, 閉じた
Return
あ、パスがマッチしない時にReturnしないとパス違いが逢った場合にマズい If !(TargetFullPath = getProcessExeNameNT(ErrorLevel)) Return MsgBox, あった Process, WaitClose, %ExeOnlyName%
vimのように
●hjklでカーソルを移動させるカーソル移動モード
●編集モード(hjklでカーソルが移動しない、普通に文字が打てるモード)
この2つのモードを"shift+変換"で切り替えるようにしたいです。
プログラミング初心者の自分で2つほど書いてみましたが、期待した動き方にはできませんでした。
恥ずかしいことにもうわからないので、目指すもののメモと作ったものをうpしました。
マニュアルを読んでこの有様です。ソースは可読性とか考えてません。すいません。
ttp://www1.axfc.net/uploader/Sc/so/25445.zip どこをどのように直せばよいでしょうか。もしくはもっといい方法があったら教えてください。
これから用事があるので夜また来ます。お願いします。
AutoHotkey_Lでなくても簡単に変数でキーマップ切り替えできないもんかとやってみた リソース消費としては良くないと思うが、コードは分かりやすいかも KeyMapGuiNo = 97 KeyMap = 0 Gui, %KeyMapGuiNo%:Default Gui, +LastFound +ToolWindow Gui, Show, NA Hide, KeyMap%KeyMap% GroupAdd, KeyMapGui, % "ahk_id " WinExist() +vk1Csc079:: KeyMap++ == 2 ? KeyMap:=0 : Gui, %KeyMapGuiNo%:Show, NA,KeyMap%KeyMap% Tooltip, KeyMap=%KeyMap%, % A_CaretX+10, % A_CaretY+20 SetTimer, TooltipOff, -2000 Return #IfWinExist, KeyMap1 ahk_group KeyMapGui h::Left j::Down k::Up l::Right #IfWinExist, KeyMap2 ahk_group KeyMapGui h::Home j::PgDn k::PgUp l::End #IfWinExist TooltipOff: Tooltip Return
>>658-659 WinGet,ver,List でうまく動きました。ありがとうございました。
>>661 ; モード毎の定義 モード名_モディファイア_キー名 := "送るキー、もしくはラベル"
CursorMode_h := "{Left}"
CursorMode_j := "{Down}"
CursorMode_k := "{Up}"
CursorMode_l := "SendRightAndTips"
NormalMode_Alt_h := "Help"
; キーをアサイン (押されたキーと同じキーをSendする場合もあるので$付き
keys := "h,j,k,l,!h"
Loop Parse, keys, `,
HotKey $%A_LoopField%, EvalAndSend
; デフォルトモード
Mode := "NormalMode"
; モード切り替え
+vk1Csc079::Mode := (Mode="NormalMode") ? "CursorMode" : "NormalMode"
; 次に続く
EvalAndSend: key := A_ThisHotKey ; $は要らない StringReplace key, key, $, ; モディファイアキーは適当な文字列に置き換え StringReplace key, key, !, Alt_ ; モード名とキーから変換 k := %Mode%_%key% if( isLabel(k) ) { gosub %k% ; ラベルが存在するなら、そちらを呼ぶ } else if( k<>"" ) { Send %k% ; 定義が存在するなら、そのキーを送る } else { Send %key% ; 未定義は押されたキーそのまま } return ; --- 以下サブルーチン --- ; CursorModeで l が押された時に実行されるラベル SendRightAndTips: Send {Right} TrayTip , , Right! return ; NormalModeで alt+h が押された時に実行されるラベル Help: MsgBox help return
error at line1ってエラーがでて起動できなくなった・・・('A`)
設定ファイルの先頭行に日付が挿入されてました・・・^^;;;
三項演算子って使ったことないけど、if elseに比べてスマートね
>>663 ,
>>665-666 両方とも11行目を自分で何とかしな!という愛が溢れています。
悲しいことに意味がほとんどわからないので
マニュアル見ながら再び試行錯誤してみます。
ありがとうございました。
>>661 ホットキーの記述が1行ならReturnは不要だけど、
複数行になる場合はReturnが記述されているところまで実行される
仮に「コピー (2) 〜 autohotkey.ini」が正常に動作したとしても
Returnが最終行にあるため、Shift+変換を押すと全てが実行されてしまう。
それとIF〜文の記述だけど
If %KeyMap% = 1 これはだめ(左側の変数を %% で括るとだめ)
If KeyMap = 1 こう記述するのが正しい
流行らせるページのトップページにあるAutoHotkey解説やサンプルをよーく見て勉強するといいよ。
下記はうpされていた「コピー (2) 〜 autohotkey.ini」のIF文を三項演算に置き換えて修正を加えたもの。
#InstallKeybdHook
+vk1Csc079::
KeyMap = % !KeyMap ? 1 : 0
tooltip, % !KeyMap ? "編集モード" : "移動モード"
sleep, 1000
tooltip
return
$*H::Send, % !KeyMap ? "{Blind}{h}" : "{Blind}{Left}"
$*K::Send, % !KeyMap ? "{Blind}{k}" : "{Blind}{Up}"
$*J::Send, % !KeyMap ? "{Blind}{j}" : "{Blind}{Down}"
$*L::Send, % !KeyMap ? "{Blind}{l}" : "{Blind}{Right}"
$*U::Send, % !KeyMap ? "{Blind}{u}" : "{Blind}{PgDn}"
$*I::Send, % !KeyMap ? "{Blind}{i}" : "{Blind}{PgUp}"
$*Y::Send, % !KeyMap ? "{Blind}{y}" : "{Blind}{End}"
$*O::Send, % !KeyMap ? "{Blind}{o}" : "{Blind}{Home}"
$*N::Send, % !KeyMap ? "{Blind}{n}" : "{Blind}{AppsKey}"
>>663 ,
>>665 すいません。本当にごめんなさい。
全角スペースをそのまま使って動かないと悩んでいました。
全角スペースの変わりにTAB使うと期待したとおり動きました。本当にすいません。
ありがとうございます。
>>672 動きました。ありがとうございます。
コピー(2)を作る前に同じIF文を作って
%をつけたりはずしたりしてもよくわからなかったので、
マニュアルを読んで数値比較のときは%をつけるものだと思っていました。
ですが、マニュアルにはしっかりと変数同士の比較のときは%をつけると書いてありました。
マニュアルが読めていません。他のスクリプト読んでも意味不明です。
でも諦めません。いつかきっと自分で全部書きます。ありがとうございました。
674 :
672 :2009/08/09(日) 02:40:33 ID:rHtlUbHj0
あー、変なことしてる。 #InstallKeybdHook を指定しているから各ホットキー記述の行頭にある $ は不要
AppsKeyのないキーボードを使っているので !sc070::Send {AppsKey} で実現させようとしたところ、ポップアップが出るには出るのですが、一瞬だけ表示されてすぐに消えてしまいます。 ポップアップを表示させ続けるにはどうしたらいいしょうか。
今すぐキーボードで、 [Shift]+[F10] を押してみるんだ
>>675 メニューが消える理由は >583
試してみたが 頭に $つけても上手くいかないな XPSP3
修飾キーをALT以外に変えるの無難じゃね
>>676 片手で手軽な動作で実現させたかったのです。
>>677 ありがとうございます。
修飾キーをRCtrlにしたら(Ctrlだけではなぜか無効)うまくいきました。
あっすみません、Ctrlだけでもいけました。 たぶんつづりをまちがえていた模様です。
両キー押し上げのタイミングでいいなら !sc070:: KeyWait, sc070 KeyWait, Alt Send, {AppsKey} Return
>>680 ありがとうございます。
そんな方法もあったんですね。
勉強になりました。
下のようにして s を押下しても a は表示されずに b と表示されます。 X = %W% だけや Y = %H% だけなら a と表示されるのに and で結ぶと必ず偽になってしまうのは何故でしょうか? s:: X := 10 Y := 20 W := 10 H := 20 If (X = %W% and Y = %H%) MsgBox, a Else MsgBox, b Return
If (X=W and Y=H) %%で囲うのは ( )がないIfのパターンの時
コマンドライン引数で取得したパスがフォルダーなのか?ファイルなのか見分ける方法を教えてください。
属性をみる
ダメ文字うざいなあ TitleMatchModeをRegExにして IfWinActive で エディタ|エラー とかやるとヒットしやがらないとか・・・ いちいち エディ\x83\x5e|エラ\x81\x5b とやらないとダメとか非効率的過ぎる
ダメ文字つか正規表現使う限りは半角英数タイトルだってエスケープは避けられんでしょ 特にTitleはスペース2個以上続いてても誤爆する可能性あるし ↓みたいな関数作って常に経由するようにしたらいい RegEscape(pattern) { return RegExReplace(RegExReplace(pattern, "\s", "\s") , "(?P<pre>(?:^|[^\x80-\x9F\xE0-\xFC])[\x80-\x9F\xE0-\xFC])" . "(?P<esc>[\[\]\{\}\|\^\\])" , "${pre}\${esc}") }
慣れてくれとしか言えんわ もしくはマルチバイト文字に関しては本家に改善要望出すとか。 日曜プログラマには面倒な話かもしらんけど、 なるべくクラス名とか使うとか、変換するライブラリを作っておくとか 自衛策はいくらでもあるし。
普通の記述で、リマップと同じ動作を行う方法はありませんか? JoyStickだと、方向キーはGetkeyStateを使うしかなく、他のボタンも何故かリマップが使えなくなってしまいます。 知ってる方いましたら教えて下さい 方向キーの入力やボタンの入力には下記のスクリプトを書きましたが、 やはりリマップとは少し違うようになってしまうので #Persistent SetTimer,JoyTimer,50 return JoyTimer: GetKeyState, JoyXkey, JoyX GetKeyState, JoyYkey, JoyY if JoyXkey=100 ;右ボタン Send,{Right} if JoyXkey=0 ;左ボタン Send,{Left} if JoyYkey=100 ;下ボタン Send,{Down} if JoyYkey=0 ;上ボタン Send,{Up} return Joy2:: send,{enter} return Joy3:: send,{BackSpace} return
ホットキー:: Send じゃ動作が微妙→リマップ搭載 の流れでバージョンアップしてった記憶があるので 完全な置換方法はないんじゃないかね。
右コントロールとカンマ で発動させたいのですが、 下記ではうまく動きません。 RCtrl & ,:: こうすると、構文エラーになってしまいました。 RCtrl & `,:: ちなみに同じ方法で、ピリオド「RCtrl & .::」は、認識できました。 カンマはどのように記述すればOKでしょうか?
>^,::MsgBox, Hoge hoge
あ…、行頭の ">" はアンカーでなく、キー左右を識別する修飾子
>>690 そうなのですか(´・ω・`)
ありがとうございます
>>689 俺もそれとほぼ同じ方法使ってるよ
キーリピート以外は困らないからそれでいっかって
>>693 ありがとうございます。
さっそく変えてみましたが・・・やはりカンマのキーは反応しませんでした。
カンマの部分をピリオドに変えてみたところ 「>^.::」 は、反応しました。
>>697 >^vkBC::MsgBox, Hoge hoge
;JoyStickでキーをリピート。 ;※全角スペースをTabスペース(半角スペース)に置き換える。 SetTimer,JoyTimer,20 return JoyTimer: JoyStickNumber=1 GetKeyState, JoyXkey, %JoyStickNumber%JoyX if JoyXkey=100 ;右ボタン JoyStickRepeat(JoyStickNumber . "JoyX", JoyXkey, "Right") return 1Joy2::JoyStickRepeat(A_ThisHotkey, "D", "Enter") 1Joy3::JoyStickRepeat(A_ThisHotkey, "D", "Bs") JoyStickRepeat(JoyStick, n, key) { loop, { send, {Blind}{%key%} if(A_Index=1){ loop, 20 { ;リピートされるまでの待ち時間約200ms(20*10ms) sleep, 10 GetKeyState, Joykey, %JoyStick% if Joykey!=%n% break } }else sleep, 30 ;リピート間隔 GetKeyState, Joykey, %JoyStick% if Joykey!=%n% break } }
>>699 ありがとうございます
こんな素敵なスクリプトに作り直して頂きとても嬉しいです
知らなかった記述法など、凄く勉強になりました
大切に使わせてもらいますね^^
「;」と「;=」と記入したときの違いがわかりません。 何が違うのですか?
703 :
702 :2009/08/12(水) 23:46:57 ID:YBR8uEr50
ごめんなさい。 「:」と「:=」の違いです。
フォルダの表示状態(一覧とか詳細とか縮小版とか)を取得する方法はないでしょうか? ControlGetでフォルダのSysListView32のStyleを取得すれば 判別できるかもと思ったのですが、どの状態でも同じ値が返ってきます
>>704 ViXで試したらちゃんと表示形式を変更すると値が変わるんだが、
Explorerだとうまくいかないね
LVM_GETVIEW (
http://msdn.microsoft.com/en-us/library/bb761091%28VS.85%29.aspx )
#IfWinActive, ahk_class CabinetWClass
Pause::
; LV_VIEW_ICON:=0, LV_VIEW_DETAILS:=1, LV_VIEW_SMALLICON:=2, LV_VIEW_LIST:=3, LV_VIEW_TILE:=4 SendMessage, LVM_GETVIEW:=0x108f, 0, 0, SysListView321
Tooltip, %ErrorLevel%
Return
あ、、、操作ミスったorz ; LV_VIEW_ICON:=0, LV_VIEW_DETAILS:=1, LV_VIEW_SMALLICON:=2, LV_VIEW_LIST:=3, LV_VIEW_TILE:=4 SendMessage, LVM_GETVIEW:=0x108f,,, SysListView321 でつ。 縮小版とアイコン表示は同じ戻り値が返る。(アイコンの大きさが異なるだけなので)
>>703 どこを混同しているのかすらわからない
類似箇所ないだろ
>>703 var = hoge ;hogeという文字列を代入
var := hoge ;hogeという変数の値を代入
>>703 ;----- スクリプト(1) ここから ------
a = 1
b = 2
c = 3
d = a + b + c
e = %a% + %b% + %c%
f = % a + b + c
g := a + b + c
h := a b c
i := a . b . c
j = %a% . %b% . %c%
k = % a . b . c
msgbox, , 代入結果, a = %a%`nb = %b%`nc = %c%`nd = %d%`ne = %e%`nf = %f%`ng = %g%`nh = %h%`ni = %i%`nj = %j%`nk = %k%
;----- スクリプト(1) ここまで ------
;----- スクリプト(2) ここから ------
; A と B は記述方法が異なるだけで結果は同じ。
a = 1
; if文で記述 これをAとする。
if !a
msgbox, , if文, 0
else
msgbox, , if文, 1
; 三項演算子で記述 これをBとする。
; : は if文 でいうところ else みたいなもの
msgbox, , 三項演算子, % !a ? "0" : "1"
;----- スクリプト(2) ここまで ------
AHK単体で ・CapsLock と 左Ctrl の交換 ・特定アプリ (MSワード や IE7) での IMEのON/OFFの右Altなどへの割り当て は上手くできないという認識ですが、 前者はレジストリ書き換えによるスキャンマップ変更で対応できるとして 後者は、AltIMEやmayu と併用するくらいしかないでしょうか。
> ・特定アプリ (MSワード や IE7) での IMEのON/OFFの右Altなどへの割り当て #IfWinActive ahk_class OpusApp RAlt::vkF3sc029 でイナフ
IE7は無いけど、IE8で確認したけど挙動がおかしい?(XP SP3, Ahk1.0.48.03, IE8.0.6001.18702) MS-Wordはバージョンが書いてないけど、2002じゃ無問題。 LAlt:: RAlt:: Tooltip, %A_ThisHotkey% KeyWait, %A_ThisHotkey% Tooltip Return 動作確認で上記スクリプトを使った。(押下中のみキー名をチップ表示、Alt入力は*普通は*隠される) UseHookを使わないでもフックでホットキーが設定される。 (A) Altを乗っ取ってキー入力を隠せない (たまにそうでない時もあった、再現方法不明) キー押下中、Altキーリピートが発生しているような感じでメニューバーの出退を繰り返す。 (B) チップ表示はキー押下と押下解除を検知して正常に動いている (C) [Alt]+[F4]などの組み合わせは効かない。 ん〜、これってDirectInputとやらで拾ってるのかなぁ。だとしたらAHKじゃ料理できない? @ドライバ デバイスからの入力を偽装 mayu, AltIME など ↓ ADirectInput 拾うだけ、すり替え不可能 ゲームとか ↓ BLLフック 拾って捨てられる、VK発行で別キーにアサイン変更 AHK, keyhac, yamy など ↓ C前面窓 IEはAで拾って捨てられないから、AHKが拾える → (B)の挙動 が、Aでキー状態を拾えるからAHKで捨てても隠せない → (A)の挙動 でもキーリピートの要な状態になるのはよく分からん。
>>716 と同じ環境だけど、IE8でも普通に動作してるな
(A)のような挙動は発生していない
DLL使ったIMEの状態セットは出来んけど、
RAlt:: Send !{vkF3sc029}
なら、問題なく切り替わるし、悪影響も出ない
ゲームパッドとマウスジェスチャーを組み合わせるような話って
このスレで出た事ある?
無線のパッドで何でも出来るようになったら
ごろ寝でも使えるしめちゃくちゃ楽じゃね?www
って思ってやってみようとしてるんだが、
多少弄ったことがある程度の俺には難しそうで・・・。
とりあえず、MouseGesture.ahkと
ttp://www.autohotkey.com/docs/scripts/JoystickMouse.htm これを元にやってみようと思うんだが、
登録するのがJoyボタンだと押下状態にならないのと、
カーソルの動きがぎこちない(リンクの上を通過する時引っかかる感じ)
ことが問題だ。
ごろ寝操作するならゲームパッドより トラックボール(ハンディタイプ)+マウスジェスチャーがオススメ
>>718 定番の高速化の呪文付けるとか。
#NoEnv
Process Priority,,High
SetBatchline -1
それから、パッド持ってないからそのスクリプトは試してないが、
俺が自分でマウスジェスチャ作ってみた時は
>> SetTimer 監視処理, 10
よりも、
>> Loop
>> {
>> 監視処理
>> sleep 10
>> }
の方が追従性が良かったような記憶。
ウィンドウのメインメニューを非表示にする方法って、SetMenuでメニュー変更するしかないのかな? 表示非表示トグルしようと思うとGetMenuでハンドルをどこかに保存しとかないといけないのが気に入らない
ゴロ寝研究歴10年の俺としては、 ・PS3のBDリモコン(3000円程度で買える。どこへ向けても操作可能) ・GlobePIE(PS3リモコンの信号を、普通のキー入力に変換する) ・AHK(さいごに料理) の組み合わせが有力という結論になった。
>>719 ,720,722
人少なそうだったからこんなにレス貰えるとは思わなかった。
ありがとう。
>>719 確かにトラックボールも魅力なんだけど、
リクライニングチェアに座りながら〜とかのように、
近くに安定した置き場所がなくても使えるという点で、
ゲームパッドでやってみようと思ったんです。
>>720 これはいい呪文をありがとう。
これでカーソルはスムーズに動くようになりました。
一応修正として、3行目は
SetBatchline -1 → SetBatchlines -1
のようです。
>>722 俺が今使ってるのはLogicoolのGPW-600なんだが
GlobePIEてのはそれでも使えるのかな?
ちょっと見てくる。
またしばらくぼちぼちやってみて報告に来ます。
フリーズしたブラウザの終了・再起動を作っているんだけど、 Process, Closeってハングアップしたソフトを強制終了できないんだね。 taskkill.exeを使ったほうがいいみたい。
>>724 自己レス
taskkillでも無理だったw
×押して「このプログラムは応答していません」を出すか、タスクマネージャからしか無理だった┐(´ー`)┌
726 :
724 :2009/08/18(火) 11:44:08 ID:juAkb4is0
ググレカスだったつД`)・゚・。・゚゚・*:. Run, taskkill.exe /PID %hwnd% /F,, Hide /Fが必要だったみたい
余談だけど、WinGetClassでハングしたウィンドウからクラス名を取ろうとすると "Ghost" ってクラス名が返るよ
glovepieならwiiリモコンも使えるよ。 リモコンでどう操作するかセンスがいるが ゴロ寝で片手で操作できる。
個人的には、"ThinkPlus USBトラベルキーボード ウルトラナビ付" が最強だと思っている。
Wiiリモコンはごろ寝時じゃマウスと同程度にしか使えないんじゃないの と思ったけどヌンチャクスティックは使えるか
>>723 トラックボールの無線タイプで手に持って使えるやつがあるよ
>>733 そう、そんなやつ。
その3つの中ではボールが大きいアクロス製が操作性しやすいと思う。
(個人的に、ボールが小さ過ぎると操作性が良くない)
MouseGesture2 になるかもしれませんが、エクスプローラの 空白部分のダブルクリックで上位フォルダへという動作を 実現出来ないでしょうか。
DoubleClickTime:=DllCall("User32.dll\GetDoubleClickTime", "Int") #IfWinActive, ahk_class CabinetWClass ~LButton:: If (A_ThisHotkey==A_PriorHotkey && A_TimeSincePriorHotkey<DoubleClickTime && LVM_HITTEST()==1) Send, {Backspace} Return ; マウス直下が ListView のときにマウスポインタの下に何があるかを調査 ; [戻り値] なし:非ListView, 1:LVHT_NOWHERE, 2:LVHT_ONITEMICON, 4:LVHT_ONITEMLABEL, 8:LVHT_ONITEMSTATEICON LVM_HITTEST() { MouseGetPos,,,,hwnd,3 WinGet,pid,PID,ahk_id %hwnd% VarSetCapacity(point,8) DllCall("GetCursorPos","UInt",&point) SendMessage, LVM_SCROLL:=0x1014, 0, 0,, ahk_id %hwnd% If (ErrorLevel) { p:=DllCall("kernel32.dll\GlobalAlloc","UInt",0x40,"UInt",8,"UInt") NumPut(NumGet(point,0),p+0,0),NumPut(NumGet(point,4),p+0,4) DllCall("user32.dll\ScreenToClient","UInt",hwnd,"UInt",p) hp:=DllCall("kernel32.dll\OpenProcess","UInt",0x001F0FFF,"UInt",0,"UInt",pid,"UInt") pi:=DllCall("kernel32.dll\VirtualAllocEx","UInt",hp,"UInt",0,"UInt",24,"UInt",0x1000,"UInt",0x4,"UInt") DllCall("kernel32.dll\WriteProcessMemory","Int",hp,"UInt",pi,"UInt",p,"Int",8,"Int",0) SendMessage, LVM_HITTEST:=0x1012,0,%pi%,,ahk_id %hwnd% DllCall("kernel32.dll\ReadProcessMemory","UInt",hp,"UInt",pi+8,"UIntp",flag,"UInt",4,"UInt",0) DllCall("kernel32.dll\VirtualFreeEx", "UInt",pi, "UInt",0, "UInt",0x8000) DllCall("psapi\CloseProcess","UInt",hp) DllCall("kernel32.dll\GlobalFree","UInt",p) Return (flag & 0xF) } }
・ LVM_HITTESTは前スレのパクって少し改造 ・ 左ペイン有りタイプ(ahk_class ExplorerWClass)のやつはレスの行数・バイト数の関係で割愛した ・ XP SP3(x86)でしか試してない
738 :
735 :2009/08/20(木) 14:14:21 ID:caHSkIPk0
す…すごい…完璧に動作しました…。。 まさかそのまま回答貰えるとは思いませんでした。感動です。 有り難う御座いました。
>>736 お見事
これを作るのにどれくらいの時間を要したのですか?
何この便利なソフト
741 :
735 :2009/08/20(木) 16:24:49 ID:caHSkIPk0
この機能のためだけにファイラ使ってたので 本当に有り難いです。
#EscapeCharでエスケープ文字を別のものに変えようと思うのですが お勧めの文字を教えてください。
そんなものは無い 普通、エスケープ文字の変更なんて、必要に迫られた時に一時的に変えるもんだ コードは全部自分で書く、他人やネット上のコード資産を流用するつもりはない、 公開するつもりもないというなら、別に止めはしないけど \でも何でも好きにすればいい
>>743 理解できた。一時的に書き換えて戻すんですね。
このソフトのWinset,Topってちゃんと機能してる? レジストリの HKCU\Control Panel\Desktop\ForegroundLockTimeout の値に関係なく、時々しか動かないのはなぜなんだろう
AHK は API コールしてるだけでしょ。 大抵は WinActivate か WinSet, TopMost で事足りそうだけど
747 :
名無しさん@お腹いっぱい。 :2009/08/21(金) 22:19:18 ID:J8RJMDPM0
AHKはジョイスティックのボタンを押すとキーボードのキーの押すってことは 実現できるみたいだけど逆にキーボードのキーを押すとジョイスティックの ボタンのボタンを押したことにするってのはAHKで実現できます? ジョイスティックにしか対応していないゲームを キーボードで好きなキーの組み合わせでプレイできたらいいなぁと考えてます
そのゲームで試してみればいいんじゃね
>>747 無理だよ。
AHKではジョイスティック状態を見て仮想キー発行するだけで、
乗っ取りもできないし(≒アサイン変更できない)、
特定のジョイスティックが操作されたことをエミュレートすることも出来ない。
751 :
747 :2009/08/22(土) 22:55:45 ID:oFJnOXgA0
>>749 分かりやすい解説ありがとうございます
>>750 公式のそのページのImportant Notesに書いてありますね
見落としていました。すみません
PPJoyを入れてからPPJoyKeyというもので設定することで実現できそうです
GlovePIEはよく分からないので調べてみることにします
ところでAHKは最近使い出したんだけど便利ですね
だらーっとマウスだけでPC使いたいときにタスク(ウィンドウ)の切り替えが
めんどくさいと思ったのでタスクバーにカーソルがあるときにホイールを
回すとタスクバーの並びの順番で次々とウィンドウが切り替わる
スクリプトを作ってみました
数年前はTaskWheelってソフトがあったのですけど動かなくなってて(XPあたりから?)
困ってたのですけどAHKで実現できたので感動です
修飾キーの仮想的な押し下げを取得するにはどうすればよいのでしょうか
ProcessMem.ahkを使用して、TVTestのボリュームの数値を取得したいです。 VOLの変更は0〜100で、writeProcMem(PID,0x004E92D4,00000000)〜writeProcMem(PID,0x004E92D4,64000000)で出来たのですが、 GETVOL := readProcMem(RUN,004E92D4,Int)を実行すると、 Error: This DllCall requires a prior VarSetCapacity. The program is now unstable and will exit. って出てしまいます。どうしたら取得できるのか教えてください。
754 :
753 :2009/08/24(月) 00:42:10 ID:8rMNgYTs0
訂正 ○GETVOL := readProcMem(PID,0x004E92D4,Int) ×GETVOL := readProcMem(RUN,004E92D4,Int) ○で実行すると上記のエラーになります。
>>754 3番目の引数で型指定する場合には
ダブルクォーテーションで囲まないと駄目なんじゃないかな
検索ソフト Everything では Tab キー入力で 選択状態の部分が 検索語入力欄 (Edit1) と 検索結果一覧 (EVERYTHING_LISTVIEW1) とで 入れ替わります。 どちらが選択状態にあるのかを ControlGetFocus を使って特定しようとしましたが うまくいきませんでした。 選択状態にあるのと、Focus があたっているのとは別物のようです。 選択状態にある ClassNN を特定するにはどうすればよいでしょうか?
>>756 選択状態 = フォーカスが当たってる = 操作もしくは入力が行なわれる箇所、って意味でなら
普通にControlGetFocusで取得できるけどな
Everything zip版1.2.1.371 WinXP SP3
取得するタイミングやその周辺のコードに問題があるのでは?
どうしても解決できないなら、その「うまくいかない」コードを張った方が良いと思う
>>751 >だらーっとマウスだけでPC使いたいときにタスク(ウィンドウ)の切り替えが
kwsk
>>757 検証ありがとうございました。
ControlGetFocus を使って取得することができました。
自分なりに手を尽くして投稿したつもりでしたが、
「できたよ。」 と言われて、見直してみると解決しました。
恥ずかしい限りです。
>>755 出来ました。
ありがとうございました。
これで8時間悩んだ自分が情けないです。
761 :
751 :2009/08/24(月) 22:39:03 ID:wQL2LMl60
>>758 需要あるか分からないけど詳しく書くよ
DllCall駆使してタスクバーに並んでいるタスクの中から現在TBSTATE_CHECKEDである
タスクのボタン(クリックしたらボタンが凹むけどこの状態)を見つけてその次か前の
ボタンに対応するウィンドウをWinActivateするって関数を作りました
でホイールを回すときにMouseGetPosとWinGetClassを実行しカーソル以下の
ウィンドウのクラスを得てShell_TrayWndだったら(タスクバー上なら)その関数を呼ぶって作り
最初に見つかったTBSTATE_CHECKEDの次か前をWinActivateするだけなので
Ctrl+クリックで複数押してると挙動が怪しい気がする
762 :
751 :2009/08/24(月) 23:08:35 ID:wQL2LMl60
ついでに余談ですが最初は律儀にタスクバーのボタンに対応するウィンドウが アクティブかどうかをチェックするようにしてたんだけど タスクバーにあるものと実際にアクティブであるウィンドウが異なるものがあるみたい (TApplicationとか)だったので単純にボタンがTBSTATE_CHECKEDかどうかを 条件にすると悩まなくて良くなった 正直プログラムはあまり分かっていないので(ウィンドウハンドルって何ってレベルなので) ネットで見つけた参考になるソースからコピペしつつ思いつくままに作ったものです 試行錯誤の結果とりあえず動いているからいいやって感じのコードで 誰か替わりに綺麗なものを作って欲しいぐらいです 見せるのが恥ずかしいですけど具体的なコードを見てみたいということ でしたらどこかアップロード先を教えてください コードは(たぶん無駄に)長いのでここに書くと迷惑だと思います……
Ctrlキーがきかなくなったので、Caps LockキーをCtrlキーに割り当てたくて以下のようにしましたが、 うまく動作しません。 sc3A::Send, ^ どのようにすれば所望の動作が得られるのでしょうか?
769 :
751 :2009/08/26(水) 01:22:25 ID:9kfLAdmg0
>>764 すでにあるんですねー
フォーラムを探してみらタスクバーとかボタン関係のライブラリもあるのか……
自作のは微妙感が出てきましたけどちょっと手直しして一応上げることにします
AutoHotkeyを流行らせるページにアップローダーが
あるようなのでそちらをお借りすることにしました
タスクバー上でホイールを回転するとタスクを切り替えるスクリプト
http://lukewarm.s101.xrea.com/up/file/115.zip なお「最後に見つかった」TBSTATE_CHECKEDの次か前をWinActivateするように変更しています
一部はネットで見つけたコードそのままですけど変数名が何の略なのか知らなかったりするし
中途半端な64bit対応なような……たまたま動いているだけだったりするとアレですね
DllCallでの引数で特に型が正しいかすごく心配
そんな程度のあまりWindowsプログラミングに詳しくない人が作ったものですので
そのあたりの不備があればご指摘いただけると助かります
770 :
751 :2009/08/26(水) 01:44:38 ID:9kfLAdmg0
さっそくコードに不備がありました TBBUTTON構造体のdwDataを2回も取得していました これはただ無駄なだけでしょうけど適当にお読み変えください……
>>769 ためしに動かしてみたら、正常に動いたよ。おもしろいね。
ところでchech_cursor_on_taskbar() のchechは、checkのtypo?
772 :
769 :2009/08/26(水) 23:21:54 ID:9kfLAdmg0
SciTE4AutoHotkey で日本語を表示させるにはどうしたらいいですか?
ここで上がったマウスジェスチャ(マウスを回すとスクロールする)のソースを参考に、actionscriptでマウスジェスチャを実験して成功した。 これでクリックの代わりに縦にこする、横にこする、時計周り、反時計回りなどに反応するFLASHが作れる。 ありがたやありがたや。
>>773 AutoHotokeyを流行らせるアップローダ - 114.zip じゃ駄目なのん?
>>774 どれですか?
それって、ホイールがついていないマウスでも
簡単にスクロールできるようになるということ?
kurukuruscroll.ahk というスクリプトです。このスレだったか、前スレ以前のやつだったかは失念。
FileMoveDir, C:\hoge\hogehoge, C:\hoge\fuga, 2 とするとフォルダ名hogehogeをfugaにリネーム出来ますが FileMoveDir, C:\hoge\hogehoge, C:\hoge\HOGEHOGE, 2 の様に大文字小文字の違いしかないとhogehogeのままでリネーム出来ません 一度hogehogeを他の名前fugaにすればHOGEHOGEに出来ますが多少ブサイクです FileMoveDir, C:\hoge\hogehoge, C:\hoge\fuga, 2 FileMoveDir, C:\hoge\fuga, C:\hoge\HOGEHOGE, 2 なので何か他に、名前が大文字小文字の違いしかなくてもリネームする方法はありませんか? ただのFileMoveだとその場合でもリネーム出来るんですが
>>779 StringCaseSense
文字列の比較で大文字小文字を区別するかを設定する
これもけっこうブサイクだとは思うけど DllCall("MoveFileEx", Str, "C:\hoge", Str, "C:\HOGE", Int, 0x09) パラメータの意味はMSDN見てくれ
>>99 をskkimeでも実現させたいです
>>103 のアドバイスにより、
それっぽいウィンドウクラス名は見つけました
ahk_class MSCTFIME Composition
ahk_class SkkImeTextService CandidateListUI Wnd Class
これを正規表現にどう追加すればよいのか解りません
ぐぐれば
>>782 1.5の場合なら、変換中が SKKIME1.5UCompStr で
候補窓が SKKIME1.5UCand
普通に
#IfWinExist ahk_class SKKIME1.5UCompStr
#IfWinExist ahk_class SKKIME1.5UCand
ESC::Send, ^g
だとか、
if( WinExist("ahk_class SKKIME1.5UCompStr") or WinExist("ahk_class SKKIME1.5UCand") ){
hogehoge
}
とかすればいいと思う
>>784 あれ、では私が取得したと思っていたウィンドウクラスは誤りでしたか
ありがとうございます
あーすまない、XPの話なんでVistaだと違うかもしんない それでも、固定文字列なんだから正規表現など使わずに普通に記述すれば問題ないと思う
HDDあさったら出てきた
>>99 氏の改造版関数
現役で使われて可能性のあるIMEだとあとはJapanistくらいか?
持ってないからクラス調べられないけど
IME_GetConverting(WinTitle="A",ConvCls="",CandCls="") {
;IME毎の 入力窓/候補窓Class一覧 ("|" 区切りで適当に足してけばOK)
ConvCls .= (ConvCls ? "|" : "") ;--- 入力窓 ---
. "ATOK\d+CompStr" ; ATOK系
. "|imejpstcnv\d+" ; MS-IME系
. "|WXGIMEConv" ; WXG
. "|SKKIME\d+\.*\d+UCompStr" ; SKKIME Unicode
CandCls .= (CandCls ? "|" : "") ;--- 候補窓 ---
. "ATOK\d+Cand" ; ATOK系
. "|imejpstCandList\d+|imejpstcand\d+" ; MS-IME 2002(8.1)XP付属
. "|mscandui\d+\.candidate" ; MS Office IME-2007
. "|WXGIMECand" ; WXG
. "|SKKIME\d+\.*\d+UCand" ; SKKIME Unicode
WinGet, pid, PID,% "ahk_id" WinExist(WinTitle)
tmm:=A_TitleMatchMode
SetTitleMatchMode, RegEx
ret := WinExist("ahk_class " . CandCls . " ahk_pid " pid) ? 2
: WinExist("ahk_class " . ConvCls . " ahk_pid " pid) ? 1
: 0
SetTitleMatchMode, %tmm%
return ret
}
>>780-781 StringCaseSenseは特定のコマンドでしか有効でないようでダメでしたが
MoveFileExのDllCallで出来ましたのでこれを使おうと思います
ありがとうございました
>>788 StringCaseSenseはダメだったかw
無変換TABで、直近アクティブだった窓と行き来しようと思うんけど、
こんなショートカットってもともとなかったっけ?思い出せない。
Alt,WinとTab,Escの組み合わせじゃ無理だった。
SetTimer, GetID
return
GetID:
WinGet, id,, A
if id not in %id1%,%id2%
{
if (id!=id2)&&(Previousid!=id1)
id1:=id
else
id2:=id
}
Previousid:=id
WinWaitNotActive, ahk_id %id%
return
~vk1D & TAB::
if (id = id1)
WinActivate, ahk_id %id2%
else
WinActivate, ahk_id %id1%
return
GetWindow()で直下のウィンドウを得る方法もあるよ (非表示ウィンドウが返る場合もあるので、IsWindowVisible()で判断する) ~vk1D & TAB:: hWnd := WinActive("A") Loop { hWnd := DllCall("GetWindow", UInt, hWnd, Int, 2 ) ; 2 = GW_HWNDNEXT if( DllCall("IsWindowVisible", UInt, hWnd ) ) break } WinActivate ahk_id %hWnd% return
>>790 いいと思ったけど、またあのやっかいな問題が出てきたw
>やっかいなのがDelphi製のソフトのTApplicationというクラス名のウィンドウ。
>可視ウィンドウ扱いで、タスクバーにはこのウィンドウのタイトルが表示されるが、実際には大きさがゼロで画面には表示されない。
あと、ALTTABでも交互にはできるけど、最前面表示のウィンドウがあると23番目で交互するみたい。
>>789 で、まあ使える程度だけど、満足しようと思う。
たまにWinCloseでも、WinKillでも終了しないソフトがある。 PostMessage, WM_QUIT:=0x12,,,, A PostMessage, 0x112, 0xF060,,, A ; 0x112 = WM_SYSCOMMAND, 0xF060 = SC_CLOSE 上は、プログラムの終了。下は、ウィンドウを閉じる。 って認識でいいのかな? WM_QUITがProcess,Closeみたいに強制終了じゃないなら、使おうと思うんだけど。
このソフトって、キーコードでリマッピングしてるのかな? それとも、キー配列に独自のナンバリングして管理してるのかな。 > < , . の挙動が不審。 英語キーボードの配列っぽい挙動になってる。
794 :
名無しさん@お腹いっぱい。 :2009/08/31(月) 09:12:30 ID:0KCMuPm10
>>794 >>794 のリンク先の画像見ると
結果 1/41(41種類のアンチウイルスエンジンのうち1種類がウイルスであると判断)で 2.44% だよな?
>Win32.Bankerが入っとってんけど
ちゃんとそのファイルの存在を確認したのか?
確認したのなら公式サイトに報告せにゃならんのだぞ?
796 :
794 :2009/08/31(月) 10:46:02 ID:0KCMuPm10
>>795 ディレクトリ見てもWin32.Bankerは見当たらんかったので可能性は低いんですね
何もなければいいんですが。お騒がせしました
>>794 に倣って AutoHotkey_Lの方をスキャンしてみた
ファイル名 AutoHotkey_L.exe
結果: 1/41 (2.44%)
eSafe 7.0.17.0 2009.08.30 Suspicious File
798 :
名無しさん@お腹いっぱい。 :2009/08/31(月) 15:38:56 ID:fwzGyLK60
AutoHotkeyの方は、McAfeeも反応するみたいだ ファイル名 AutoHotkey.exe 受理 2009.08.31 06:35:34 (UTC) 結果: 2/41 (4.88%) eSafe 7.0.17.0 2009.08.30 Suspicious File McAfee-GW-Edition 6.8.5 2009.08.31 Heuristic.BehavesLike.Win32.Packed.C
例によってUPXが反応してるとかじゃなくて?
ファイルを右ダブルクリックとかマウスホイールクリックしただけで 指定したソフトが起動してそのファイルを開いた状態で開けるよう設定するにはどうすればいいでしょうか? 具体的にはzipやrarをマウスホイールクリックしただけで 一発でそのファイルをマンガミーヤ(画像閲覧ソフト)で見れるようにしたいです よろしくお願いします。
どうせ、そういうZIPファイル等は特定のフォルダに入れているんだろうから "ポチエス"か何かのファイルパスによって動作させるアプリを切り替えるツールを使うと楽かと 書いたとおりの動作をさせたいなら、 ホットキーをトリガーとしてフォーカスのあるアイテムのパスを取得して、 それを特定のexeに引数渡しをすればいいだけじゃないの
久々の丸投げ質問だがw、作ってスレって無くなったのかね? 一番簡単な方法は、「送る」フォルダにアプリのショートカットを作って、 右ボタンとnとショートカットの先頭文字を送るとか これとはまた別に選択ファイルを取得するのにCOMを使う方法などもあるけど それはまた自分で試行錯誤してから具体的に聞くべき。
>>801-803 ありがとうございます。
AHKでの設定はわからないのでとりあえず
>>801 さんに教えていただいた
ポチエスというのを使ってみたいと思います。
「設定」ってなんなんだよ。根本的に理解してなさすぎて不愉快だ
そんなレベルでピリピリせんでも・・・
どこかで紹介か誘導でもされたんでしょ 文面からしていじるのが嫌そうだから(別に悪いことではない)、 そういうときは、完成品を勧めるのがお互いにとって幸せだよ。
; 簡単ウィンドウ移動&リサイズ ^LButton:: Send,!{Space}M{Down}{Up} ^RButton:: WinGetPos,,,w,h,A w -= 8 h -= 8 MouseMove,%w%,%h% Send,{LButton down} return
>>808 で思い出したけど、
↓のWM_NCHITTESTを監視してタイトルバーにいるように振舞う方法って
既存のアプリやフォルダで実現する方法ってないのかな?
703 :名無しさん@お腹いっぱい。[sage] :2008/11/13(木) 20:34:10 [夜] ID:zthSOgTK0 (PC)
GUIウィンドウのコントロールの無いところをドラッグしてウィンドウを移動したい。
GUIはタイトルバーなし (-Caption)。
OnMessageで、 WM_MOUSEMOVE(0x200) 受け取る関数を作る
で、LButton押下されたら初期押下地点からの移動差分だけ WinMove してるんだが
追従性が悪くてマウスポインタが窓の外にでると駄目になるorz
こういう窓ってよくあるけど、レスポンスよく実装するにゃどうすればいいのかな。
704 :名無しさん@お腹いっぱい。[sage] :2008/11/13(木) 22:41:54 [夜] ID:hwA95Qvn0 (PC)
>>703 OnMessage(0x84,"WM_NCHITTEST")
WM_NCHITTEST(){
Return 2
}
でどうだろう。
WM_NCHITTEST()の中でMouseGetPosして 既存のアプリやフォルダかどうかを見りゃいいんじゃね?
>>811 >要するに何を言いたいかというと、
>>809 には↑の方法じゃダメなのかということなんだが…
おk、です。てかforumにもっとスマートな方法が載ってたんですね・・・
ありがとうございました。
たびたび申し訳ありません。ProcessMem.ahkを使って文字の抜き出し方法を教えてください。 004E9090 : 00 00 42 00 6F 00 6E 00 44 00 72 00 69 00 76 00 B o n D r i v 004E90A0 : 65 00 72 00 5F 00 53 00 70 00 69 00 6E 00 65 00 e r _ S p i n e 004E90B0 : 6C 00 5F 00 48 00 44 00 50 00 32 00 5F 00 30 00 l _ H D P 2 _ 0 004E90C0 : 30 00 2E 00 64 00 6C 00 6C 00 00 00 00 00 00 00 0 . d l l を抜き出したいときにどのように書き込めばいいんですか? ?? Driver := readProcMem(PID,004E9092,??????????) MsgBox,1%Driver% よろしくお願いします
#IfWinActiveで複数のウィンドウに同じスクリプトを実行させたいのですが、 簡単に記述する方法ってありませんでしょうか… #IfWinActive ahk_class CS40FrameWnd { 4:: { GetKeyState, state, Space, P ;Spaceキーの押下げ状態取得(押下げ="D") if ( state = "D" ) ;spaceキー押下げ中 { send,^7 ;左回転 } else { send,4 } }return
} #IfWinActive 間違えて編集途中で送信してしまいましたorz 上記のスクリプトを他の複数のahk_class下で実行したいのですが、 全てのahk_classで同じ文章を記述せずにすむ方法があったらご教授下さい
>{ GetKeyState, state, Space, P ;Spaceキーの押下げ状態取得(押下げ="D") > if ( state = "D" ) ;spaceキー押下げ中 >{ >send,^7 ;左回転 >} >else >{ >send,4 >} >}return 俺なら、これを関数化して、ごまかす
>>814 流行らせるページの ProcessMem.ahk の話だと思うけど、あのスクリプトの63行目には間違いがある。
× size:=VarSetCapacity(s,len)+1
○ size:=VarSetCapacity(res,len)+1
文字列を読み出す場合は、適当に大きなサイズを指定すればいい。
不要な分もコピーされるが、ahkの文字列は普通のC文字列だから
\0が出現するまでの部分が普通に文字列として扱われる。
Driver := readProcMem(PID,0x004E9092, 512) ; アドレスが16進なら先頭に0xを付ける
律儀にやるなら、readProcMem(PID, address , "UChar" )で\0が出現するまで1キャラずつ読むとか。
>>815 (1) ウィンドウグループを使う
GroupAdd WinGroupShell, ahk_class CabinetWClass
GroupAdd WinGroupShell, ahk_class ExploreWClass
#IfWinActive ahk_group WinGroupShell
(省略)
(2) SetTitleMatchModeを正規表現にする
SetTitleMatchMode RegEx
#IfWinActive ahk_class CabinetWClass|ExploreWClass
(省略)
(3) サブルーチンもしくは関数にする。(省略)
一見すると(2)の方が行数が少なくて良いように思えるけど、
NotActiveの判断の場合ではうまくいかないとか、
正規表現の誤爆、クラス名とタイトル名の条件ではorできないとかいろいろあるので、
汎用性のある書き方としては(1)の方法が良いと思う
(もちろん、その辺を理解して使う分には(2)でもかまわないが)
>>817 >>819 ありがとうございます! こんなやり方があったとは…
GroupAddすごい助かりました。コミスタは10くらいあるツールウィンドウが全て
違うクラス名持ってたもので、おかげでスクリプト全体が非常にスッキリできました。
サブルーチン化も別のアプリ間で同じスクリプトを共有できるものに使ってみようと思います。
>>814 地デジ録画マニアの俺は、その文字列に興味があるんだけど、
Spinelから何の情報を取ろうとしてるの?
デスクトップを右クリックする方法はないでしょうか? 「画面」のプロパティを開いてスクリーンセーバーの時間を変更するスクリプトを 書きたいのですが、ここだけつまづいてしましました。
>>823 ありがとうございます!
デスクトップが見えている座標にマウスを移動し(もしくはウインドウをどかし)RButtonをSend…
と思っていたのですが、こんな神業のようなことは不要でしたね。
825 :
815 :2009/09/03(木) 01:30:29 ID:uzj9KcZt0
すみません、もうひとつ質問を… 特定のキーが押されたときだけキーのリマップを起こす方法ってありますか? スペースキーを押している時だけ、 LAlt::LShift となるように、とか
WheelAccelを使用してるんですが、 firefoxで「shift + ホイール上下」で横スクロールってできないんですか?
>>825 AutoHotkey_Lなら楽。
#If GetKeyState("Space", "P")
LAlt::LShift
#If
>>826 WM_MOUSEHWHEEL(0x20E)に対応してないみたい。
リダイレクトも加速しない、アクティブ窓だけでいいなら↓を追加
#IfWinActive, ahk_class MozillaUIWindowClass
+WheelUp::WM_MOUSEHWHEEL(-A_EventInfo)
+WheelDown::WM_MOUSEHWHEEL(A_EventInfo)
WM_MOUSEHWHEEL(delta) {
CoordMode, Mouse, Screen
MouseGetPos, x, y, hwnd, 3
PostMessage, 0x20E, delta*120<<16, x|y<<16,, ahk_id %hwnd%
}
※ 全角スペース利用につき注意
>>827 どうもありがとうございます!助かりました。
>>827 ありがとうございます、Autohotkey_Lを入れて使ってみました。
Space+LAltがSpace+Shiftとして動いてくれました!
ただ気になることが… 上記スクリプトを使ってSpace+LAlt(shift)押した後、
Altより先にSpaceを押し上げると、その後Altを離してもShiftキーが
押しっぱなしになるという現象が起きました。
これは回避できないものでしょうか?
二重起動防止ランチャとしても使えるんだな ^!C:: IfWinExist, PowerToy Calc { WinActivate } else { Run, PowerCalc.exe } return
>>818 出来ました。ありがとうございました。
ドライバーを変更すると同じ場所に重ねて記録して最後に00がつくので、
最終的に
>>818 をヒントに、00が出現するまで1キャラずつ読むようにしました。
>>821 TVTestのメモリから現在使用中のドライバーを取得です。
Spinelの文字はTVTest側で使っているドライバー名です。
firefoxで 『テキスト選択→マウス中央ボタンクリック→新しいタブにgoogle検索結果を開く』 というのは可能でしょうか?(中央ボタンの他の機能はそのままで) MButton::send, ^{RButton}s だと他の機能まで制限されるんですよ。
>>832 書き方間違ってるよ。
条件分けがテキストを選択してるかどうか、になるから面倒くさい。
普通に、マウスジェスチャに登録したほうがいいと思うけど。
了解しました。
ブラウザとアドレスを指定してウェブページを開かせることって できますか? デフォルトのブラウザを変えずにやりたいんですが
836 :
835 :2009/09/05(土) 04:35:43 ID:F+JQ6UZN0
流行らせるページのウィンドウ縮小スクリプトSmallWin.ahkを使いたいのですが ノートPCなのでMButtonがありません。 そこで、MButtonをエミュレートしようと思い、まず次のように書いてみました。 #LButton:: MButton MButton:: MsgBox, test しかし、Winキー押しながら左クリックしても test と表示されずに、 MButtonが送られるだけのようです。 こういう場合どうするのがよいのでしょうか?
SmallWin.ahk 内の ~MButton up:: の下に #LButton up:: を追加 キーループの動作は~付けたり外したりして色々試してみたら?
>>838 >>839 ありがとうございます
とりあえず
#LButton up::
を追加することでウィンドウを縮小させることはできました。
しかし、ダブルクリックしても元に戻ってくれません。
MsgBoxをはさんで確認してみたところ
OnDblClick が呼ばれてないようなのですが
原因のわかる方いますでしょうか?
ダブルクリック時にもWinキー押しこんでね? 縮小ウィンドウ上で普通に左ダブルクリックで解除されたよ
両ボタンクリックで中クリックになるだろうけどね。
mouseMove.ahk デュアルモニタ使用時、マウスカーソルをもう一方の画面まで持って行くのが面倒なので、 ホイールクリック(中ボタン)で、マウスカーソルをもう一方のモニタ上へ移動する。 切り替え前の座標は保存されるので、モニタ1->2->1と切り替えた場合、切り替え前のモニタ1での座標に戻る ;ここから 1stMouseX=500 1stMouseY=500 2ndMouseX=1200 2ndMouseY=500 ;座標の初期値 MButton:: CoordMode,Mouse, Screen MouseGetPos, mouseX , mouseY if mouseX > 1024 ;座標が1024より大きければ、モニタ2にカーソルがある { 2ndMouseX = %mouseX% 2ndMouseY = %mouseY% MouseMove, %1stMouseX%, %1stMouseY% } else{ 1stMouseX = %mouseX% 1stMouseY = %mouseY% MouseMove, %2ndMouseX%, %2ndMouseY% } return ;ここまで
>>841 いえ、Winキーは離してます
左ダブルクリックしたら一瞬ウィンドウ全体が灰色になるだけで元には戻ってくれません。
ちゃんと動いてる人がいるってことはスクリプトは問題ないのか・・・
何が干渉してるんだろ
>>842 やってみましたが私の機種ではなりませんでした
つか環境晒したら? OSやメーカー製マウスドライバで動作変わることって結構あるし 機種書けば同じPC持ってる人が情報くれるかもしれん ちなみに自分(841)はXP SP3 で問題なく動いてる。
846 :
名無しさん@お腹いっぱい。 :2009/09/06(日) 14:28:20 ID:V4deazYF0
send,で3つ以上のキーを渡したい時はどうすれば良いんでしょうか。 ;spaceを押すとshift+alt+a Space & a:: send +!a return shiftをdownさせてるあいだに2つのキーを送って、 そのあとshiftをupさせる事ができれば簡単そうなんですが そんな事できますか?
847 :
sage :2009/09/06(日) 14:29:42 ID:V4deazYF0
sage忘れてしまいました。。
{Shift Down}!a{Shift Up}
>>844 >>845 原因わかりました。
タイトルバーをダブルクリックしたらウィンドウシェードする
TTBaseのWinShadeというプラグインを入れていまして
ダブルクリックイベントがそっちにもっていかれるのが原因のようです。
OnMessage(0x00A3,"OnDblClick") を
OnMessage(0x00A6,"OnDblClick") にして
SmallWinの方の解除を右ダブルクリックにして回避することにしました。
コードをみてウィンドウメッセージを変えられるスキルがあって、 なぜフック系のアプリを常駐させていることに気づかないのか
>>848 ありがとうございます!
ShiftDownさせてSetKeyDelayも設定したらうまく動きました。
Space & a::
SetKeyDelay, 0, 50
send {ShiftDown}^a{ShiftUp}
return
ところで、 最小化のコマンドとして send, !{space}n と記述するのではなく、 そのまま最小化させる書き方ってあるかな? 最小化させるときに左上にメニューが見えるのが気になるし、 出てくるメニューに最小化が存在しないこともたまにあったりして・・・
Bluetoothの周辺デバイス検索をAHKから呼び出す方法ってないでしょうか。 ノートPCの簡易セキュリティで考えていて、スタンバイから復帰後、 BT検索を行い、自分の携帯が近くにない場合、AHKからPCをシャットダウンさせる方法で 考えています。シャットダウンさせるとBIOSパスワードになって、そこのパスワードを 知らないと二度とPCを起動できなくなる、、、てな寸法です。 いま使ってるBTは、東芝スタックのUSBタイプと、Broadcomの内蔵型ですが、 タスクトレイで左クリックすると、まったく別のインターフェース画面が出ます。 BTのUI画面って、チップメーカーによってバラバラみたいなんですが、 コマンドラインから呼び出す方法か、OS標準の検索機能がほしいところです。 あんまり、BTでこういうことをやってる人は少なそうですが、 なにかヒントになるスクリプトまたはコマンドは、ないでしょうか。
webページにある同じ名前のcheckの2番目をチェックする場合 JavaScriptの場合"document.all.check[1].checked=true" でうまくいくのですが、これを流行らせるページで配布されているActiveX を使う場合どう記述すれば良いのでしょうか。
WSHでその操作を出来るようになったら、同梱の sample_IE.ahk を見て改造する。
857です 自己解決しました
>>859 >webページにある同じ名前のcheckの2番目をチェックする場合
>JavaScriptの場合"document.all.check[1].checked=true"
>でうまくいくのですが、これを流行らせるページで配布されているActiveX
>を使う場合どう記述すれば良いのでしょうか。
をしようとGoogleにて検索して、ここまで来ました。
どう自己解決したのでしょうか?
860です 自己解決しました
862 :
iwaken :2009/09/08(火) 22:35:24 ID:/QVkOwzn0
alt +n ノートパッドを起動し ファイルメニューの 名前をつけて保存というキーを自動で立ち上げる HOTKEYを定義するんはどうしたらよいでしょうか? うまくうごかせません みなさまご教授ください
うまくうごかないスクリプトを晒せば、このスレで自動的に修正される
864 :
iwaken :2009/09/08(火) 22:58:43 ID:/QVkOwzn0
ありがとうございます。 まだ習いたてなので恥ずかしいですが こんな感じです !n:: Process,Exist,notepad.exe If ErrorLevel<>0 WinActivate,ahk_pid %ErrorLevel% else Run,notepad.exe send,!f send,!a
send,!fa
867 :
iwaken :2009/09/08(火) 23:22:50 ID:/QVkOwzn0
すごい・・・ できました。ありがとうございます。 しばらくいろいろな機能をつかってみます またご教授お願いします。 iwaken
以上、自動スクリプト修正プログラムでした。
変数内に指定文字列があるかどうかで分岐 IfInString, var, SearchString これってSearchStringが空だと真になるんだね。
autotrimをoffにしてる予感
ahkに限らずほとんどの言語処理系がそうなると思う
ホイール回転を取得する方法ってないですか? GetKeyStateだと1度ホイールを回すと、ホイールを回してなくても ずっと押されっぱなしだと判定されてしまうので・・・
ホイール回転を取得するだけなら loop { wu+= % wheel="wheelup" ? 1 : 0 wd+= % wheel="wheeldown" ? 1 : 0 tooltip, WheelCount`nUp %wu%`nDown %wd% wheel= sleep, 10 } return wheelup:: wheeldown:: wheel=%A_ThisHotkey% return
>>873 あ、A_ThisHotkeyがあったんだorz
ありがとうございました
エディタなどに文字列を確実に挿入する方法って clipboard変数に代入して十分sleepしてからsend, ^vするしかないんでしょうか sleepしなくていい方法ありませんか
下記の場合だとツールチップbbbしか更新しないけど、 LoopとかWhileってあとから実行したほうが、えらいのか。 割り込ませるって無理かな?普通にTimer回して条件分岐するしかない? #Persistent a:=1, b:=1 settimer, aaa, -1 settimer, bbb, -1 return aaa: While a=1 { tooltip, aaa%A_TickCount%, 1, 1, 1 sleep,100 } return bbb: While b=1 { tooltip, bbb%A_TickCount%, 100, 100, 2 sleep, 100 } return
>>875 WinWait使って条件分岐するとかは?
エディタ側のコマンドラインオプションでやれればそれが一番だと思うけど。
>>876 後から動いた方のスレッドが終わるまで、先にタイマで呼ばれた方のスレッドは動かないよ。
そのコードだと、片方しか動かないのは仕様。(
>>4 参照)
てか、書いてある程度の処理なら、1000ms間隔のタイマー二つ動かせばいいだけだとじゃないの。
もし、KeyWaitとかWinWaitとかを並列で動かしたいなら、また別の話になるけど。
>>878 ToolTip:
ToolTipvar:=ToolTipvar ? 0 : 1
While ToolTipvar=1
こんなの入れて、トレイメニューでツールチップのON/OFFをしようと思ったんだけど、一つしか動かなくて無理だったんだよね。
ただ、ひとつはタイマーで動かす下記だと二つ動くけど、
>>4 とは矛盾しない?ってか、俺の理解度が低いのかw
#Persistent
a:=1, b:=1
settimer, aaa, 100
settimer, bbb, -1
return
aaa:
tooltip, aaa%A_TickCount%, 1, 1, 1
return
bbb:
While b=1 {
tooltip, bbb%A_TickCount%, 100, 100, 2
sleep, 10
}
return
ああ、処理系等が二つ入らないってことかw ごめん
こんなやつ? #Persistent ToolTipvar_a:=ToolTipvar_b:=1 settimer, ShowTooltip, 100 ShowTooltip: tooltip, % ToolTipvar_a ? "aaa" . A_TickCount : "" , 1, 1, 1 tooltip, % ToolTipvar_b ? "bbb" . A_TickCount : "" , 100, 100, 2 sleep, 100 return 1::ToolTipvar_a:=ToolTipvar_a ? 0 : 1 ; 1でTooltip 1をOn/Off 2::ToolTipvar_b:=ToolTipvar_b ? 0 : 1 ; 2でTooltip 2をOn/Off
>>876 元スレッド →→→
↓タイマー割込 (-1なので、settimer後数ステップ動作してから)
スレッドaaa →→→
↓タイマー割込
スレッドbbb →→→→→→→→→→→→→→→ (終了しないからaaaには戻らない)
>>878 元スレッド →→→
↓タイマー割込 (-1なので、settimer後数ステップ動作してから)
スレッドbbb →→→ →→→→ →→→→
↓タイマー割込 ↑ ↓タイマー割込↑ (100ms間隔)
スレッドaaa →→→→→→ →→→→→
一定時間経ったら消すとかならタイマーとかが必要なのは分かるけど、 トレイメニューでOn/Offするなら、イベントドリブンなコードを書けるから ループとかタイマーとかは必要ないと思うなぁ。
複数タイマ動かすこと自体は問題ないと思うが タイマーから呼ばれたルーチンは待たせずすぐ抜ける構造にしておくべきだろう (そもそもループ内スリープ使わなくていいようにタイマーがあるんだと思うし) 879だったら SetTimerじゃなくて Gosub,bbb とするか 元スレッド内でループ回すなりしたらいい事だと思う
>>881-884 それぞれラベルひとつで更新するチップを表示させようとしたら、無理だったのかも。
A_ThisLabel等使って、それぞれタイマー回すことにします。
>>879 っぽいのでうまく行ってた分、もうひとつ足したときに混乱しちゃって。
>>884 >タイマーから呼ばれたルーチンは待たせずすぐ抜ける構造にしておくべきだろう
これは金言だね。
とりあえず、ごちゃごちゃしてるけど、上のラベルを呼び出すたびにツールチップON/OFF できたわ、有難う、助かった。 ToolTip_1: ToolTip_2: StringTrimLeft, WhichToolTip, %A_ThisLabel%, 8 %A_ThisLabel%switch:=%A_ThisLabel%switch ? "OFF" : "ON" if (%A_ThisLabel%switch="ON") settimer, %A_ThisLabel%Timer, 1000 else { settimer, %A_ThisLabel%Timer, Off ToolTip,,,,%WhichToolTip% } return ToolTip_1Timer: ToolTip,aaa,,,1 return ToolTip_2Timer: ToolTip,bbb,,,2 return
>>887 %A_ThisLabel%switch:=%A_ThisLabel%switch ? 0 : 1
if %A_ThisLabel%switch
だったw最後に格好つけで余計なことしちゃった。
あんまちゃんとコード見てないけど、メニューアクションでのOn/Offだったら 883で言われてるようにタイマ使う必要なくないか? ToolTipは一回表示したら意図的にクリアするまでは表示しっぱなしになるので 同じ内容で表示更新する意味ってあんまりないような。 マウスに常に追従して欲しいってことなのか? それか実際は "aaa" or "bbb" にあたるテキスト部が随時更新されてるとかだろうか
何で本当にやりたいことを書かないんだろう 動作にあまり意味の無い中途半端なコードを貼られても 具体的にどういう状況でどのような制約条件があるか分からないから 的確なアドバイスが出来ない 勝手に解決しているようだけど、何だか見ていて消化不良な感じw
現在接続中の無線LANのSSIDを取得するいい方法ありませんか?
DllCall で DeviceIoControl 叩けば出来そうな気がする
893 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 13:23:35 ID:NbxhIbBU0
みなさま始めまして。 AutoHotKeyでドラッグ&ドロップを実現したいと思って半年。 サンプルすら見つけられません・・。 どなたかご教授願えればと思いまして書き込みました。 現在左ALTに左クリックを、右ALTに右クリックを割り当てています。 この左クリックにドラッグ&ドロップ機能を付けたいのです。 ヒントをいただければ助かります。 どうぞ宜しくお願い致します。
895 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 13:32:43 ID:NbxhIbBU0
>>894 ご返事ありがとうございます!
2ch書き込みは数年していませんでしたので新鮮です。
ALTつかいたいときに、どうすんの?
897 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 13:42:36 ID:NbxhIbBU0
>>896 私はMac内のVMwareFusion内のXPを使用してますので、
例えばCTRL+ALT+DELを押したい時はVMの機能を使います。
またどうしてもの時は、AutoHotKeyをExitします。
でも自分の使用法の場合、不思議と殆ど使わないですね。
そうなんだ。まあそれは人それぞれだけど 「左クリックにドラッグ&ドロップ」の意味がわからない 何にD&Dするのかよくわかんない 単に長押しを検出したいならkeywaitとかマウスの位置を調べればすぐ できると思うが。 サンプルが見つからないんじゃなくて、あまりにも簡単すぎて サンプルを作るまでもないような問題じゃないかと
899 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 13:57:31 ID:NbxhIbBU0
>>898 ヒントをありがとうございます。
そうなんですか?それ程簡単な事なんですか・・・。
左クリックにドラッグ&ドロップの表現は失礼しました。
左ALTキーでドラッグ&ドロップを実現して、
普通のマウスの左ボタンと全く同じ機能を持たせたいです。
長押しとマウスの位置ですか・・・。
具体的にどうやりたいのかちゃんと書いて。 マウス使わないでALTキーだけでどうやってモノつかんだり マウスポインタ動かしたりするつもりなの? ポインタは矢印キーで動かして、とか何かほかのアクションが必要でしょ 方法が決まっていれば、「やり方」のコードは提示できるかもしれないが 操作アイディア自体も考えて下さいってのはNGな
901 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 14:32:41 ID:NbxhIbBU0
>>900 漠然としていてすみませんでした。
ポインタはマウスで動かします。
マウスの左ボタンの役目を左ALTキーで代替させたいです。
なぜこんな事をやりたいかといいますと、
指でマウスボタンを押す事がなぜか耐え難い程苦痛になってきたからです。
いろいろマウスを買い換えてみましたが、結果的にキーボードをマウスボタンの代わりに使う事が快適だと分かりました。
現在は、
LAlT::Send,{LButton}
RAlT::Send,{RButton}
と設定しています。
>>901 Altを押し下げたときにマウスのボタンを押下したままにして
Altを押し上げたときにマウスのボタンを押上げれば?
LALT::Lbutton RALT::Rbutton ↑でダメなら↓ LALT:: Send, {Lbutton Down} keywait, LALT Send, {Lbutton Up} Return RALT::Rbutton Send, {Rbutton Down} keywait, RALT Send, {Rbutton Up} Return
腱鞘炎になってるのなら左手でマウス操作がオススメ 慣れるのに1〜2週間くらいかかるけど
905 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 14:51:36 ID:NbxhIbBU0
>>903 ありがとうございます!!!!!出来ました!!!
感動しました!!!
また、903より前に書き込んで頂きました全ての皆様にも感謝申し上げます!!!
906 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 15:01:03 ID:NbxhIbBU0
>>904 左手マウス、数年前から何度かチャレンジして来ましたが、
急いでいる時とかどうしても上手く扱えなくて右マウスに戻ってしまってました。
奮発してHHKB Pro2を使っていますので、キーボードクリックは凄く快適です。
>>906 そう、慣れない内は右手に戻るんね
急いでないときは常に左手で操作するとか
毎日必ず30分間は左手で操作するとかやってると1〜2週間で
右手とほぼ同等に操作できるようになるよ。
908 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 15:14:44 ID:NbxhIbBU0
>>907 そうなんですか。
毎日継続する事が大事なんですね(^^;)。
幸い左右どちらでも使えるマウスがありますので、
今回教えていただいたAutoHotKeyと併用してみます。
ありがとうございました。
俺も右利きだけどマウスは左手派 すぐ慣れるかどうかは年齢にもよるし一概に言えないけど、メリット多いからガンガレ
メリット:エロゲをやる時…
メリットは動画と画像見るときかなぁ
ブラウザの住所氏名入力欄とかで、入力ボックスのフォーカスを左マウスで移動させながら 右で優雅にキーを打つ・・・理にかなってすばらしいと思うが俺は馴染めなかった
左手マウス試してみた。 マウス操作はけっこう普通にできた。 いいかも。 でもマウスで選択してCtrl+Cでコピーとかどうすればいいの? ああそっか。右手でCtrl+Cすればいいのか。 いいかも。
914 :
名無しさん@お腹いっぱい。 :2009/09/14(月) 00:00:28 ID:r0WrQkL/0
ときどきALTが押したままの状態になる症状が出てストレスを感じています。 ALTを2回押すとALTが解放されるので、当面はそれで対処してますが、根本的な解決策があると助かるのですが。。 窓使いの憂鬱と併用なので、窓使いの憂鬱の方のカスタマイズ設定の問題である可能性はあります。。 すんません。アドバイスよろしくお願いします。
修飾キー押しっぱなしってのは何度か出てる問題だな 対処法も過去ログにあったはず
AHKじゃ対処療法しかできないよ。
>>914 Setpointを使ってるなら、あきらめるしかない。
俺は、settimerの1秒モードで、altが30秒以上押されていたら
画面にtooltipsの警告を出すコードを常設している。
918 :
914 :2009/09/14(月) 02:19:53 ID:yK/PFntw0
#そのままじゃ動かないよ。考え方の参考に もろもろ初期化 〜 settimer,1000,setpoint_check return ;SetpointでAltが押しっぱなしになる症状を検出 setpoint_check: if pushcheck("Alt") altcount++ else altcount=0 if altcount>30 { msg=ALT押しっぱなし tip(msg,500) } return 関数 tip() pushcheck() は含まれてないからそのままじゃ動かない。 見れば何やってるかわかるだろうから適当に見繕ってくれ
>>912 フォーカス移動ならTABでいいんじゃね
>>914 >>236 のようにチルトボタンを利用しているならSetPointが必須らしいけど
そうでなければ
>>234 のようにマウス設定をAutoHotkeyに任せれば回避出来るかも。
922 :
914 :2009/09/14(月) 21:54:27 ID:yK/PFntw0
923 :
名無しさん@お腹いっぱい。 :2009/09/16(水) 17:29:31 ID:NOXTtfoG0
IE画面上の右クリックメニューをホットキーに割り当てたい場合はどう書けばいいの? 具体的にはIrvineなんだけど、 「IrvineへすべてのURLを送る」というやつにctrl+Qを割り当てたいんだけどさ。 誰か教えてくれよ。
キー送ればいいんじゃないの。 右クリックかShift+F10送って メニュー(ahk_class #32768)がでるのを待ってから メニューのアクセラレータキーを送る って感じで良いでしょ
Irvineのオプションで右クリックに追加すると メニューのアクセラレータキーが無い
別の右クリックいじるソフトでアクセラレータキー付けれるよ
929 :
923 :2009/09/16(水) 21:15:41 ID:NOXTtfoG0
おー、IE8ではできたよ。サンクスメン。 しかしsleipnir上では動かないんだな、オウチ。 Internet ExplorerのところをSleipnirに変えても反応なしさHAHAHA。 もう少しなんだよ、頼むぜ。
>>929 おいおい条件後出しはやめてくれよHAHAHA
IEで動いたんなら、後はちょっと調べて書き換えるだけだぜブラザー
本日の小ネタ成果物 IEで、何かをデスクトップにDLした際、直接開くことをしないでデスクトップの フォルダを開きたいときがある。そのとき「フォルダを開く」を押しても、デスクトップの場合だけ 「指定したリンク先は、デスクトップ上にあります。」 と出て、フォルダを開いてくれない。なんちゅーお節介な機能を実装しやがって。 この動作が気に入らないから、上記ダイアログが出たら、ダイアログを閉じて、 そのあとデスクトップをexplorerで開くようにした。 settimerで1秒ごとに巡回すればOK WinGetTitle, wT, A if wT=リンク先を探す { ControlGetText,var,Static2,A if var=指定したリンク先は、デスクトップ上にあります。 { send,{Enter} run,%A_Desktop% } }
932 :
923 :2009/09/16(水) 21:42:52 ID:NOXTtfoG0
できたぜ 光速でIrvineに突っ込めたぜ サンクスメーん
条件分岐ifにANDを使うときのやり方で質問です 「 if 変数1 in 1,2,3 」 と 「 if (変数2) 」 をANDでつなげようと思ったのですが、 前後をひっくり返したりカッコをつけたりいろいろな形で試してみても 前にある条件しか有効にならず、後ろに置いた条件はコメント状態です この二つの条件分岐をANDでくっつけるにはどうしたらいいでしょうか
コマンドタイプの If と、式タイプの If はつなげられないよ 単純に If のネストをする(1)か、全部「式」にする(2)か、どっちか。 (1) If var1 in values { If (var2) { ; 真のときの処理 } } (2) If (var1==1 || var1==2 || var1==3) && (var2) { ; 真のときの処理 }
>>934 分かりやすい解説ありがとうございます
よーし明日も頑張るぞ
if( IsInValues(var1,"1,2,3") and var2 ) { ; hogehoge } IsInValues(var, list) { If var in %list% Return True Else Return False }
選択文字列をクリップボード経由せず 取得する方法ってありますか? ようは第二クリップボードを作って クリップボードへのコピーに反応する別のプログラムの動作を やり過ごしたいんですが
エディトコントロールなら ControlGet で取得できる それ以外ならば、具体的にアプリ名や状況、取得して何をやりたいのかなどを書けば 誰かが別の解決方法を提示してくれるかも もしくは、そのコピーに反応する別のプログラムとやらをどうにかするという方法もあるだろうし
WinSelectMenuItem や Control、PostMessage で一時停止にしてからコピーするって手もあるよ
特殊な使い方ですが、 F1キーに 文字1 Ctrl+F1キーに文字2 Shift+F1キーに文字3 Alt+F1キーに文字4 を割り振ろうとして F1::1 ^F1::2 +F1::3 !F1::4 と定義したが、Ctrl,Shift,Altで修飾した定義は うまく動作しませんでした。 設定まちがってますかね?
Sendコマンドを使う F1:: Send 1 ^F1:: Send 2 (省略) リマップ a::bは下記と等価だから、修飾キーも判断されてしまう *a:: SetKeyDelay -1 Send {Blind}{b DownTemp} return *a up:: SetKeyDelay -1 Send {Blind}{b Up} return
>>941 できました!
ありがとうございました!!
アイコン表示をしたいahkのアイコンを変えてみたけど、探すのが大変。 デフォルトアイコンの偉大さを思い知るわ。
GUIコマンドで引数に応じたテキストを表示するかっこいい通知ウィンドウを作りたいと思ってます 考えてるのは背景に画像を表示してその背景上に通知文字を表示するといったものです まずスプラッシュイメージを表示して、その上から透過したGUIで文字表示という 方法でやろうかとおもっているのですが 背景が透明で文字だけ表示するGUIの作り方がわかりません WinSet, Transparent, 0で設定すると文字まで消えちゃう・・・
Region & TransColor でどうにか汁
普通にBackgroundTransでいいんじゃね 文字と画像で別々の透過度を指定したいなら、2つGUIを重ねるとか Gui +LastFound -Border ToolWindow Gui Margin, 0, 0 Gui Add, Picture, , C:\Windows\しゃくなげ.bmp Gui Add, Text, xm+20 ym+20 cFFFFFF BackgroundTrans, TextString WinSet, Region, 3-3 w128 h128 Gui Show
SplashImage 使わないでも1つのGUIでどうにかなるけどね。 背景画像は透過PNGなどで予め透過画像にしておけばいい。 TransColor = 000001 Gui, +LastFound +ToolWindow -Caption -Border +AlwaysOnTop Gui, Color, %TransColor%, %TransColor% Gui, Margin, 0, 0 Gui, Font, s16, あくあフォント Gui, Font, q3 ; AutoHotkey_L ならこれが効いてアンチエイリアスをオフに出来る Gui, Add, Picture, x0 y0 , 背景画像.png Gui, Add, Text, x50 y70 BackgroundTrans cBlack, サンプルスクリプトの予感!! WinSet, TransColor, %TransColor% Gui, Show
GUIだけでそのまま出来たんですか 知りませんでした Gui, Show, NAにすればフォーカスも奪われずに表示できますね 使わせてもらいます
HDUSのリモコンなんですが ^F16::Send, Shift または ^F16::Shift としてもShift単独でなく修飾キーも押されたことになってしまいます。 なんとかなりませんか?
^F16::Send, {Shift}
入力結果を^Shift^ではなくShiftにしたいということです
次のテンプレに↓いれようぜ Q:「^1::Esc」とリマップ定義したけど [Ctrl]+[1] を押したらスタートメニューが出ちゃうけどどうすればいいの? A:リマップは修飾キー(Ctrl,Shift,Alt,Win)の押下状態を引き継いでキー発行するので、[Ctrl]+[Esc] がキー送信されるため。 これを避けるには、「Send」コマンドを利用して明示的に修飾キーなしのキーを発行をすればよい。 ^1::Send, {Esc}
^F16::Send, {Shift} の入力結果は +^ でした。 私の目的はキーリピートが発生しなければ良さそうです。
^F16:: Keywait, Ctrl Send, {Shift} Return
ということで当初よりのキーリピートの発生しない ^F16::Shift を妥協して使います。 出来ないということがわかりました。本当にありがとうございました。
つか[F16]ってのが気になってんだけど、そういう実キーがある拡張キーボードなのか、 SetPointとかで仮想キー発行させてんのかで動作って変わったりするんじゃね? ちなみに $^F12::Send, {Shift} とかやった場合はどうなる? やっぱりCtrl発行されんのかい?
>>958 質問者の情報提供が少なすぎるのがそもそもの大問題なんだが、
>HDUSのリモコンなんですが
これを部外者が補足説明すると、地デジチューナー。
リモコンが付属してて、HIDで認識する。
ボタンを押すとF16〜F24やCTRL+F16などが押された状態になる。
そもそも、地デジと全然関係ないスレで「HDUSなんですが」って書いて
相手に正確に伝わるかどうかとか考えないことが、俺的に不思議。
>>959 ググりゃわかるだろ。
そもそも、地デジと全然関係ないスレで補足説明って書いて
相手にくどいと思われるかどうかとか考えないことが、俺的に不思議。
なに逆切れしてんのよ 最初から説明しとけば済む話でしょ
autohotkey と qtclipの最新版を併用することができません autohotkeyの方で ^v を設定してqtclipを使ってみました そしたら文字の出力のところで、autohotkeyの ^v が貼り付けの動作を奪い取ってしまいます そこで^v の設定で qtclipから ^v が送られてきたときは素直に ^v を出し、 それ以外の時は test を送信するということをしたいです GetKeyState("ctrl")を使ってどうにかできないかと考えたのですが、 qtclipから ^v が送られてきたことを判定する方法がいまいち思いつきません どう修正すればいいでしょうか #NoEnv SendMode Input #InstallKeybdHook #UseHook ^v:: ; msgbox,% GetKeyState("ctrl") send,test return
Pオプション付けて物理的な押下状態を取得してみれば、といい加減にレス
IMEがオンの時のキーアサインを 一か所に記述する方法ってないよね? 各アプリごとにif imeがオンなら的に記述するのは可能っぽいけど そんな面倒なことはさすがにやりたくない。
>>959 ああ、リモコンの押下情報を拾いたいって話だったのか。補足サンクス
自分はてっきり、リモコン「に」何かをさせるためのコマンドをAHKから
投げたいのかと思ってたんだわ。
>ググりゃわかる
ググってもらうこと前提での質問はさすがにどうかと思うが。
実機触ったことない奴は最初から及びじゃないって話だったら謝るが
特殊デバイスとの明記があっても実際はそこは関係なく
AHKの基本的な挙動部分のアドバイスで解決してるパターンも多い品
>>964 LoopかSetTimerでIME状態を定期チェックして
HotkeyコマンドをまとめてON/OFFしたら?
>>964 AutoHotkey_Lを使うとか、関数でラッパーを作るとか。
どのくらいの数のキーアサインがあって、どれくらい複雑なのを書いてるのかにもよるだろうけど、
関数やサブルーチン化すれば何とでもなる気がする。
キーアサインの見た目をスッキリさせたいだけなら、
定義ファイルを読んで動的にHotkeyコマンドでアサインするスクリプトにすればいいと思うよ。
以下、ラッパーの例:
F12:: SwitchByIMEStatus( "IME_ON_" . A_ThisHotKey, "aaa" )
SwitchByIMEStatus( IME_OnKey, IME_OffKey )
{
KeyOrLabel := IME_GET() ? IME_OnKey : IME_OffKey
if( isLabel( KeyOrLabel ) ) {
gosub %KeyOrLabel%
}
else {
Send %KeyOrLabel%
}
}
;
IME_ON_F12:
MsgBox IME_ON_%A_ThisHotKey%
return
>>949 俺もユーザーだけどそれリモコン側の仕様だから諦めれ
>>963 ありがとうございます
それならなんとかなりそうです
IMEがONだったらOFFにするという処理じゃなくて それ自体をONにならないようにする事は可能ですか?
・On/Offを制御するキーを無効化@AHK ・On/Offを制御するキーを無効化@IME設定 ・タイマー監視してOnになったら即座にOffにする@AHK ・IMEを削除@コンパネ
どういう状況でONにしたくないのか具体的に書くべき
IME wo sakujo sitemimasita nihongo kakenai
海外のゲームなのですがゲームの裏でIMEがONになると AHKでキー無効化(自分で設定した)しているのでOFFに出来なくなります。 何個かキーを同時に押すのが原因なのか不明ですがIMEがONになることがあります。 それでIME自体を一時的に無効化出来ないかという発想になりました。
質問者じゃないけど、どういう状況でONにしたくないのか・・・ ブラウザのFirefoxやIEで、URL入力バーにカーソルを置いたときに、 IMEがオンだったら自動的にIMEオフにできると便利かも、と思った。 IEなら #IfWinActive ahk_class IEFrame ~F6 up:: ~Lbutton up:: ControlGetFocus, cgf,A if cgf=Edit1 { ;IMEをオフ send,{vkF3sc029} } return #IfWinActive で、できた。 ただIMEのON/OFFがトグル動作になるのでその対策は誰か頼む Firefoxは、Control関連がほとんど取得できないので厳しいか。 URL入力欄にカーソルがあることを、識別させる方法ないかな
>>973 基本、IMEの状態はアプリ毎に保持してるから、別のアプリでONになったものが、他に影響を与えないはず。
(ATOKなんかは、グローバルに切り替える設定があった気がするけど…)
もしゲームの中で、コンパネの入力言語の切り替えに設定されてるキーを押しちゃってONになるのなら、
そちらの設定を無効にすれば良いと思う。
それでも発生するなら、対症療法的に
>>970 のようにタイマー使う方法が確実かも。
>>974 Firefoxにはその手のアドオンがあったはず。
特定のフィールドで自分の好みでというなら、AHKよりもユーザJavaScriptの方が
onFocusのイベントが使えるので、綺麗に書けると思う。
FirefoxならJavaScript+FlashProxyなどで、IEならJavaScriptのみでいけたと思う
まっとうにやるなら、グローバルフック(AHK単体では無理)する必要があるとおもう。 てか、フォーカスのある場所が変わると指定の関数(orサブルーチン)を呼ぶ機能がAHKに欲しい。 OnFocusChange("HogeFunc") HogeFunc(hwnd, classNN) { WinGetClass, class, ahk_id %hwnd% If (class = "IEFrame" && classNN = "Edit1") IME_Set(0) } dllで作れば何とかなるらしいとは分かるが、作れないw
>>974 >>976 がいうとおり、
send,{vkF3sc029}じゃなくてIME_SET(0)を使うべき
そうすればトグルの問題は解決する
関数組み込まなくても IMEの設定で「IME-オフ」を適当なキーに割り当てて そのキーをSendするという方法もある
>>978 これ一時期使ってたけど、うちの低スペックマシンにはつらすぎた
ちなみに関数を引用すると > IME_GET(WinTitle="") > ;----------------------------------------------------------- > ; IMEの状態の取得 > ; 対象: AHK v1.0.34以降 > ; WinTitle : 対象Window (省略時:アクティブウィンドウ) > ; 戻り値 1:ON 0:OFF > ;----------------------------------------------------------- 俺のAHKは1.0.47.05だったがダメだった
>>983 構造体のメモリを確保してないからだよ。
#Persistent
; 48バイトを確保して初期化しておく
VarSetCapacity(stGTI, 48)
DllCall("RtlFillMemory", "UInt", &stGTI, "UInt", 48, "UChar", 0)
DllCall("RtlFillMemory", "UInt", &stGTI, "UInt", 1, "UChar", 48)
SetTimer, getImeTimer, 500
return
getImeTimer:
tooltip, % IME_GET()
return
>>982 これ試したらいつの間にかIME状態取れなくなってた秀丸8βでも値取れた。
オリジナルの Ime.AhkだとバックグラウンドのIMEステータスも一応見れるので、
GetWindowThreadProcessId でスレッドID取得しするようにしてみたんだけど
アクティブ時は上手くいくのにバックグラウンドだとスレッド情報がうまくとれない(´・ω・`)
(戻り値は1で帰ってくるのでGetGUIThreadInfo関数自体は成功してるみたいなのに
スレッド情報は空になっている)
なんかおまじないが必要なんだろうか
settimer,timer1,200
return
+ESC::ExitApp
988 :
つづき :2009/09/25(金) 19:51:45 ID:j07RXB3U0
Timer1: ;マウス下のウィンドウのスレッドIDを取得 MouseGetPos,mx,my,mhwnd ThreadId := DllCall("GetWindowThreadProcessId",UInt,mhwnd,UInt,0,UInt) ; GUIスレッドの情報を取得 VarSetCapacity(stGTI, 48, 0) NumPut(48, stGTI, 0, "UInt") ; DWORD cbSize; ret:= DllCall("GetGUIThreadInfo", Uint,ThreadId, Uint,&stGTI) cbSize := NumGet(stGTI, 0, "UInt") flags := NumGet(stGTI, 4, "UInt") hwndActive := NumGet(stGTI, 8, "UInt") hwndFocus := NumGet(stGTI, 12, "UInt") hwndCapture := NumGet(stGTI, 16, "UInt") hwndMenuOwner := NumGet(stGTI, 20, "UInt") hwndMoveSize := NumGet(stGTI, 24, "UInt") hwndCaret := NumGet(stGTI, 28, "UInt") rcCaret_l := NumGet(stGTI, 32, "UInt") rcCaret_t := NumGet(stGTI, 36, "UInt") rcCaret_r := NumGet(stGTI, 40, "UInt") rcCaret_b := NumGet(stGTI, 44, "UInt") ;Message:WM_IME_CONTROL wParam:IMC_GETOPENSTATUS imests := DllCall("SendMessage", UInt,DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwndFocus), UInt, 0x0283, Int,0x0005, Int,0) ;↓改行長いって怒られた。下繋げて下さい Tooltip, imests=%imests%`nGetGUIThreadInfo=%ret%`nThreadId=%ThreadId%`nProcessId=%ProcessId%`n`n cbSize=%cbSize%`nflags=%flags%`nhwndActive=%hwndActive%`nhwndFocus=%hwndFocus%`nhwndCapture=%hwndCapture%`n hwndMenuOwner=%hwndMenuOwner%`nhwndMoveSize=%hwndMoveSize%`nhwndCaret=%hwndCaret%`n rcCaret_l=%rcCaret_l%`nrcCaret_t=%rcCaret_t%`nrcCaret_r=%rcCaret_r%`nrcCaret_b=%rcCaret_b% Return
質問しようかと思ったがスレも終了とはついてない。 新スレで質問させていただきます。
>>989 すげー質問がくるんだろうなー(`〜´)y-~~~
まだ、次スレないのか。建てるか。
乙しつつ埋め
梅
埋め
うめー
うめうめ
梅
梅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。