■ リマップ・キー割り当て Q1:[CapsLock(英数)]キーの割り当てがうまくいかないよ A1:OSのローカライズ段階で発生してる問題なので日本語環境だとLock系キーの動作は不定。 OS側がキーUp/Down情報が正しく返してこないのでAHKのみで対処は無理なので、 ドライバレイヤーでのリマップソフト(窓使いの憂鬱など)や、レジストリ変更でリマップを行う(ChangeKeyなど)を利用して [CapsLock]を別の普段使わないキー([F13]〜[F24]など)に割り当ててからAHKで利用すると良い。 Q2:「^1::Esc」とリマップ定義したけど [Ctrl]+[1] を押したらスタートメニューが出ちゃうけどどうすればいいの? A2:リマップは修飾キー(Ctrl,Shift,Alt,Win)の押下状態を引き継いでキー発行するので、[Ctrl]+[Esc] がキー送信されるため。 これを避けるには、「Send」コマンドを利用して明示的に修飾キーなしのキーを発行をすればよい。 ^1::Send, {Esc} Q3:[Shift], [Ctrl], [Alt], [Win]以外を修飾キーとしてキー割り当てしたいよ (例:無変換 + IKJLキーをそれぞれ「↑↓←→」に割り当てたい)など A3:リマップ機能は記述が簡単になる反面、細かい指定がしにくい 流行らせるページのHotkeys, キーリスト, リファレンス→Send, #IfWinActive, GetKeyState()なども参照すること。 なお、例の場合は以下のように記述する。 sc07B & I::Send, {Blind}{Up} sc07B & K::Send, {Blind}{Down} sc07B & J::Send, {Blind}{Left} sc07B & L::Send, {Blind}{Right} Q6:「XX hotkeys have been received in the last XXXXms.」って怒られるんだけど、、、(XXは環境による) A6:多分自分自身のキーを送って無限ループになっている。 例) 「a::Send, a 」 先頭に $ を付ければ回避できる(NT系のみ)。 例) 「$a::Send, a」 キーボードフックを利用する方法でも回避可能。
■ マウス関連 Q1:「RButton & WheelDown::〜」とやったら右ボタンが使えないし、 「~RButton & WHeelDown::〜」とやったらメニューがでてうざい。 A1:決定的な解決策はないけど、メニューが出たら消すって方法なら↓。 ~RButton & WheelUp:: Send, +^{Tab} SetTimer, CancelRMenu, -1 Return ~RButton & WheelDown:: Send, ^{Tab} SetTimer, CancelRMenu, -1 Return CancelRMenu: KeyWait, RButton SetTitleMatchMode, RegEx WinWait, ahk_class #32768|MozillaDropShadowWindowClass,,0.5 If (!ErrorLevel) Send, {ALt} Return Q2::キーリマップを使うとキー押下中に連打するけど、マウスボタンの場合は連打しない・・・ A2::マウスはキーリピートしないので、Loopなどを使って自前でリピートさせてください。
■ IME関連
Q1: IMEのOn/Offの切り替えや、On/Offの状態を得るにはどうすればいいの?
A1:「IME.ahk」を使いましょう。
Q2:IMEが現在文字を入力している、または変換中であるかどうかを得ることはできる?
A2:一部のアプリではできる。(IMEの入力・変換窓がMS-Wordのようにインライン化しているアプリでは無理)
ttp://pc12.2ch.net/test/read.cgi/software/1243005818/99,787 を参照
■ ジョイスティック関連
Q1:ジョイスティックのリマップがうまくいきません!!助けて
A4:ジョイスティックではリマップできないので、「Send」コマンドでキー発行してちょ
× Joy1::Esc
○ Joy1::Send, {Esc}
Q2:ジョイスティックの上下左右にキーを割り当てたいけど、JoyLeft とか JoyUp って仮想キーは無いの?
A2:無いです。AHKのジョイスティックサポートはかなり貧弱なのでプログラマブルにやる必要がある。
Q3:ジョイスティックのボタン1とボタン2の入れ替えなどはどうやってやるの?
A3:AutoHotkeyではできません。
■ 日本語の取り扱い
AuthoHotkeyは英語圏でつくられたソフトでマルチバイト文字列のことを全く考慮していないので以下の問題が起き得る。
Q1:「〜AチЯ`荏柿義形港餐汁秦疏蛋伝覗描冒輿倭兪啻嫣彖拜杼歔」を含む文字列がうまく扱えないよ
A2:これらの文字の2バイト目が、AHKのエスケープ文字である0x60[`]であるために起きる。
回避方法は以下の通り
(1) これらの文字の"直後"に「`」を記述する(例:「線形`代数」)
(2) 外部ファイルに文字列を定義して後から読み込む方式にする(IniRead、FileRead 等)
(3) #EscapeCharでエスケープ文字を別のものに変える(玄人向け)
Q2:IfInString や InStr()、StringReplaceで意図しない結果が出ることがあるんだけど、、、
A2:文字単位ではなくバイト毎に比較するだけなので、以下のような場合は意図せずにマッチしたりする。
回避したい場合は、流行らせるページの「マルチバイト文字列操作関数群」などを使う。
例) 意図しない置換
str = モノ ; 0x83 0x82, 0x83 0x6d,
StringReplace, str, str, c, c, All ; c: 0x82 0x83
MsgBox, %str%
Q2:A_ScriptDir、A_LoopFileName や SplitPath の結果がおかしいことがあるんだけど?
A2:「\」記号を無条件でディレクトリ区切り文字としてファイル/ディレクトリ/拡張子を分割してしまうことによる。
対象となりうる文字:
―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭xx\\
これは、
>>1 にある「駄目文字微対策版」を使うことで回避できる。
■ スクリプト仕様
Q1:「a=abc」と「a:="abc"」って違いがある? / 「If a=1」と「If (a=1)」って違いがある?
A1:意味としては違いは無い。単体では、コマンド形式(共に前者)の方が「式」形式(同後者)より*少し*速い。
複数条件の場合、IfのネストよりはAND(&&)条件で「式」を並べた方が速い。
が、バッチでかなりの回数(数万↑〜)回したりする場合以外は、体感出来るほどの差はない。
Q2:配列変数やハッシュ(仮想配列)は使ええないの?
A2:「式」を使うと配列やハッシュのように変数を参照できる。
Loop, 10
value_%A_Index% := A_Index**2
Q3:テキストエディタでキーワードの色づけなどをしたいんだけど。
A3:「{AutoHotkeyのフォルダ}\Extras\Editor」に各種エディタの定義ファイル及びキーワード一覧あり
Q4:GUI作るのめんどくせ〜〜
A4:公式(
ttp://www.autohotkey.com/download/ )から SmartGUI Creator をDLして使うと楽。
Q5:AHKってマルチスレッドじゃないの?
タイマーやMsgBox, WinWait, KeyWaitを使ってるけど思った通りに動かない。
A5:「擬似マルチスレッド」です。最後に割り込んだスレッドが終わるまで元スレッドは動きません。
MsgBox、WinWait、KeyWait、Process,WaitClose などをタイマーで複数動かす時は注意。
> 要は処理系統が複数同時に走らないってこと。図にするとこんな感じ。
> → 実行中、 …:割り込み終了待ち
> 元スレッド →→→→→→……………………………………→→→→
> ★割込 ↑再開
> 割り込みスレ →→→→…………→→→→→→END
> ◆割込 ↑再開
> 更に割り込み →→→END
Q6:このスレからコピペしたんだけど、うまく動かないよ。どうして?
A6:このスレではインデントに全角スペースを使ってコードを貼り付ける事があるので、
全角スペースをタブや半角スペースに変換してみよう。
■ AutoHoekey_Lって具体的にどう違うの? 本家との違いは以下の通り (1) #If 任意の「式」を用いてキーマップ定義ができる (2) メニューにアイコン表示ができる (3) Exeやトレイアイコン描画の向上 (4) GUIのテキスト表示のレンダリング方法を変更できる(アンチエイリアスOFF等) (5) 正規表現にマッチした文字列を引数にして関数を呼べる (6) Send, {Asc XXXX}のUnicode版が使える 目玉は(1)。 ユーザ定義関数作って #If で使うととても便利。 例1) [Ctrl]+[Alt]+[Space]で On/Off 切り替え。変数がOnの時のみIKJLでカーソル移動可。 ^!Space::KeyMap:=!KeyMap #If (KeyMap=1) I::Up K::Down J::Left L::Right #If 例2) トレイの時計部分でホイールを回すと音量変更 #If MouseOver("ShellTray_Wnd", "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) }
Q:[Ctrl]や[Shift], [Alt]が押されっぱなしになることがあるけど、これってAHKのせい?
もしそうじゃないとしたら、AHKで何か対処できる?
A:報告が多くありますが、よく分かっていません。以下のような報告があります。
・Logicool(Logitec) の "SetPoint" は「クロ」との報告があります。
・窓使いの憂鬱をデュアルコア以上のプロセッサで使っている場合に起きるという報告もあります。
・VMWareが悪さしているという報告もあります。
上記のソフトはAHKより下位(物理層寄り)なので、AHKでは物理的にキーが押されているとしか分かりません。
タイマーでキー押下を監視して一定時間以上押下されていたら警告を出したり、
SetPoint を再起動などで対処していたりするようです。
ttp://pc11.2ch.net/test/read.cgi/software/1219130051/782 782 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/11/27(木) 01:43:58 ID:pOwnMABe0
よく分からんけど、 Ctrl とかが押しっぱなしになる。解決はよく分からんが対処法としてアラートだすようにした。
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
>>1 おつです。
>A2::マウスはキーリピートしないので、Loopなどを使って自前でリピートさせてください。
とのことですが、
XButton1::pgup
XButton2::pgdn
を、キーボードの「PageUp」「PageDown」と同じようにキーリピートさせたいのですが、
どう記述すればいいか教えてください。
11 :
名無しさん@お腹いっぱい。 :2009/09/26(土) 01:23:59 ID:EqdgxjNj0
★ローカルルール★ 1.管理職以上の書き込み禁止 2.退職希望者かOB以外の書き込み禁止 3.会社の為の是正項目は事実のみの記載とする 4.会社の不利益情報は社会通念と法律に大きく反する部分のみ 5.上記項目に該当外はスレに書込み禁止ならびに削除依頼対象とする
一例) ・良点: Sleepを使わないので元キーを高速連打してもOK ・欠点: 単一スレッドなので割り込みスレッドでWait系をされると面倒 XButton1::SendWhileButtonPress("{Down}") ; 送るキー(Sendコマンドで書くヤツと同じ), 押下解除を待つキー, 最初待ち時間 リピートの待ち時間 SendWhileButtonPress(Keys, WaitKey="", FirstDelay="0.7", RepeatDeley="0.03") { KeyDelayBack:=A_KeyDelay WaitKey := (WaitKey=="") ? WaitKey:=A_ThisHotkey : WaitKey SetKeyDelay, 0 Send, %Keys% KeyWait, %WaitKey%, T%FirstDelay% While (ErrorLevel) { Send, %Keys% KeyWait, %WaitKey%, T%RepeatDeley% } SetKeyDelay, %KeyDelayBack% }
いちおつ
★ローカルルール★ 解答できない質問には口をはさまない
16 :
名無しさん@お腹いっぱい。 :2009/09/26(土) 16:23:26 ID:zYxRZ2As0
更新が一気にきたぞ 1.0.48.05 - September 25, 2009 Fixed crash of SendMessage and PostMessage when wParam or lParam is omitted (broken by 1.0.48.04). [thanks Lexikos] 1.0.48.04 - September 25, 2009 Fixed StringSplit to work properly inside functions of compiled scripts (broken by 1.0.35.01). [thanks engunneer & Lexikos] Fixed SendPlay not to wait for the release of the Windows key prior to sending an "L" keystroke (broken by 1.0.48.01). [thanks Lexikos] Fixed A_EndChar to be valid when the B0 option is present, and to be empty when there is no ending character (broken by 1.0.44.09). [thanks Al2000] Fixed FormatTime to yield a valid time of day even when the specified month is out-of-range (broken by 1.0.48.00). [thanks silveredge78] Fixed FileCreateDir to support a leading backslash even when it is the only backslash; e.g. \dir. [thanks jaco0646] Fixed GuiControl/GuiControlGet/Gui/SendMessage to work reliably even when they trigger a callback or OnMessage function. [thanks Lexikos] Fixed RegExMatch() not to produce too few replacements when an empty-string match is followed by a non-empty-string match. Changed "While()" to be recognized as a loop rather than a function. [thanks Crash&Burn] Improved UrlDownloadToFile to support FTP and Gopher. [thanks Lexikos] Improved the stdout/asterisk mode of FileAppend to write immediately rather than lazily to standard output. [thanks Lexikos] Added full support for "if % expression". [thanks kenomby]
AutoHotkey_Lもキテル〜 Revision 32 - September 26, 2009 * Fixed: Send/PostMessage crash when less than three parameters were specified. Revision 31 - September 26, 2009 * Added: Object/array support and numerous minor changes to make this possible. * Added: Support for While(expression) with no delimiting space. * Added: Trim, LTrim, RTrim. * Added: A ~= B; equivalent to RegExMatch(A, B). May be removed in a future revision. * Fixed: An incompatibility with LowLevel. * Changed: Characters [, ] and ? are no longer valid in variable names. Consequently, ? (ternary) no longer requires a space on either side. * Changed: Optional parameters may now be omitted at any position in the parameter list of a non-dynamic function call. Since this works by automatically inserting the parameter's default value at load-time, it is not supported or allowed for dynamic function-calls. * Debugger: Various minor changes to make program flow easier to follow while stepping through code. * Optimization: If DllCall's first parameter is a literal string which identifies a function already present in memory, it is replaced with the actual address of the function. * Updated from v1.0.48.03 to v1.0.48.04. --------- てか、Objectサポートきてる! まだ実験的実装らしいけど、プロパティ持てるからデータの引き回しは楽になりそうだ。
最早、別言語な気がするw ; ここからおまじない "".base.__Get := "Default_Get_PseudoProperty" "".base.is := "Default_is" Default_Get_PseudoProperty(nonobj, key) { if key = length return StrLen(nonobj) } Default_is(nonobj, type) { if nonobj is %type% return true return false } ; ここまでおまじない str = あいうえお int = 100 MsgBox, % """" str """の長さは" str.length "バイト" MsgBox, % """" int """は" (int.is("number") ? "数値" : "数値以外") MsgBox, % """" str """は" (str.is("number") ? "数値" : "数値以外")
形もつけれるみたいだから、継承のない(?)クラスって解釈でいいのかな
Javascriptみたいにプロトタイプベースで、Javaなどとは違い静的なクラス定義はしないで、 インスタンス作ったらガンガンとプロパティとかメソッド増やせる感じ。 あと、現有インスタンスのプロパティなど引き継いで新規インスタンスの生成はできるみたい。 まぁ、あんまり深く分からなくても配列が使えるようになっただけでもデカい。 プロパティだけならMapみたいなもんだから、キーは英数字だけになるけど、だいぶ使いやすいと思う。 (多元配列はオブジェクトの入れ子で実現できなくもない、とのこと) [JS] var obj = new Object(); obj.say = showMsg; obj.say("Hello!"); function showMsg(msg) { WScript.echo(msg); } [AHK_L] obj := Object() obj.say := "ShowMsg" obj.say("Hello!") ShowMsg(msg) { MsgBox, %msg% } メソッド内で this"相当を使うのは結構面倒。
>>18 str.length ってことがAutoHotkeyで出来るようになるとは
想像していなかったw
今回の更新はかなり大がかりなものだったろう
なんかもうここまで追加するなら構文周りも整理して別言語にしたほうが
個人的には完全マルチスレッドにして欲しい
不特定数の戻り値を呼び元のスコープに渡したい時に便利だなぁ。 If (ret := BREGEXP_Match("あいうえおかきくけこさしすせそたちつてと", "/([あ-お]+)[^さ-そ]+([さ-そ]+)/k")) { str := "matched :""" ret.matched Loop, % ret.submatched str .= "`nSubmatch " A_Index " : " ret[A_Index] MsgBox, % str } BREGEXP_Match(target, pattern, offset=1) { hModule:=DllCall("LoadLibrary",Str,"BREGEXP.DLL") offset-- < 1 ? offset:=0 : pRExp=0, VarSetCapacity(msg,256) if DllCall("BREGEXP.DLL\BMatch", "Str",pattern, "UInt",&target+offset, "UInt",&target+StrLen(target), "IntP",pRExp, "Str",msg, "Cdecl Int") { result:=Object() pArray1:=NumGet(pRExp+0, 32, "Int"), pArray2:=NumGet(pRExp+0, 36, "Int") result.submatched:=NumGet(pRExp+0, 40, "Int") start:=NumGet(pArray1+0, 0, "Int"),length:=NumGet(pArray2+0, 0, "Int")-start VarSetCapacity(value, length+1, 0x00) DllCall("RtlMoveMemory", "Str",value, "Int",start, "Int", length) result.matched:=value Loop, % result.submatched { start:=NumGet(pArray1+0, 4*A_Index, "Int") length:=NumGet(pArray2+0, 4*A_Index, "Int")-start VarSetCapacity(value, length+1, 0x00) DllCall("RtlMoveMemory", "Str", value, "Int",Start, "Int",length) result[A_Index]:=value } } DllCall("BREGEXP.DLL\BRegFree", "UInt",pRExp) DllCall("FreeLibrary", "UInt", hModule) Return result }
thisみたいなのを使うとしたら __Call でどうにかしないとだめ? obj.func じゃなく func(obj) みたいにしたほうがいいのか
メソッドの第一引数がthisでしょ。 Pythonだとselfという名称をよく使うけど、それと一緒かと。 Obj := Object("name", "DefaultName") Obj.ShowName := "Obj_ShowName" a := Object("base", Obj, "name", "MyName" ) ; "MyName"の次に"abcd"が表示される a.ShowName() Obj_ShowName( self ) { name := "abcd" MsgBox % self.name MsgBox % name }
ウィンドウ、アプリごとに異なる第二のコンテキストメニューを出す スクリプトをちまちま書いてるんだけど そういうのが設定ファイルだけで済むような フレームワークってすでにあったりしますか?
Objectやら何やら可能にするなら、もういっそrubyとかでのDSLでも 良いんじゃないかって感じがしてきた。
エクスプローラでファイルのパス名を取得してクリップボードに入れたいのですが、 タイトルバーにパス名 の設定にしてそこから…以外に、取得する方法ってあるんでしょうか? Window Spyで >>>>( TitleMatchMode=slow Visible Text )<<<< に 表示されてるトコあたりからゲットできればいい気がするんですが…
>>29 エクスプローラの選択ファイルで何かするときは
Ctrl+Cしたファイル情報を文字列化するのが便利
send, ^c
sleep, 200
clipboard := clipboard . ""
ClipWait使おうぜ… #NoTrayIcon #NoEnv Clipboard= Send, ^c ClipWait Clipboard=%Clipboard%
>>31 ClipWaitなら一応待機時間付けといた方が良い。
無選択でコピーしようとしたときにいつまでも待機しちゃうから。
車輪の再発明にならないようにこの手の情報をまとめたページがほしいな
言い出しっぺの法則と言ってな
おっさんだけが通用するルールだっけ
というかもうあるだろ
とりあえず、テンプレには「困った時は公式フォーラムを検索しろ」を追加しておくべきかと Scripts & Functionsカテゴリの表題をざーっと見るだけでも、 ライブラリやTipsにどんなもんがあるかくらいはだいたい分かるので、 十分まとめサイト的な使い方もできるしね
オブジェクト指向対応わろた 日本語の解説ページはまだない?
Autohotkey_L自体日本語解説を見ないわけだが。
41 :
10 :2009/09/28(月) 22:54:54 ID:58Qn72m30
ヒントだけでも教えてもらえませんか
>A2::マウスはキーリピートしないので、Loopなどを使って自前でリピートさせてください。
オブジェクト指向とは、でググったけどさっぱり。 AHK一筋だと、新世界の出来事だわ。
AHKで閉じた世界だと無理に覚える必要はあまりなんじゃないのかな。 ただ、データの入れ物としては便利。
オブジェクトを何に使おうかなと考えると多すぎてきりがないな。 とりあえず配列っぽいものだけ使っていくか
>>43 気付きませんでした。
>>12 どうもありがとうございます。
「SetKeyDelay, 0」という行がエラーで読み込まれないのですが、
数値を自分で変えて入力すればいいのでしょうか
たぶん全角空白の取り忘れ
>>3 のQ3をやったら
This line does not contain a recognized action.
と怒られるんだが
>>50 ::じゃないか?
8スレ目から変わってるw
7スレまではちゃんと::だったのにねぇ
>>51 それに気づいて半角になおしたが動かなくて
コピペし直して、半角にしたら動いた
レスサンクス
質問があります。 Windows終了時に、Excel 2007の保存確認ダイアログを全部「はい」で閉じたいのですが、よい方法はありませんでしょうか? 現在は、下記のようにしているのですが、 Windows終了時以外も自動で閉じてしまいます。 Windows終了時を検出する(終了を押したことを検出する)ことは可能でしょうか? SetTitleMatchMode, RegEx SetTimer, OnTimer, 1000 return OnTimer: ; Auto save Excel IfWinExist, Microsoft Office Excel ahk_class #32770 { WinActivate Send, {ENTER} } return
>>48 誘導ありがとうございます。このページみて勉強します。
>>49 動きました!
>>12 ありがとうございます!最っ高です!!
>>55 そこのサンプル使ってみた
スタンバイや休止では動くけどシャットダウンは感知しないな
シャットダウン時に処理させるならOnExitがある
俺はSysGet,var,8192をタイマー実行させてシャットダウンを感知させてる
スマートな方法じゃないけど 「事前処理(終了や保存)を済ませてからスタンバイへ移行する」 というスクリプトを書いてデスクトップにおいてる。 スタンバイのみだと寂しいので再起動、電源を切るも同様に置いてる。
発動すると過去8個分のクリップボードの内容を選択するコンテキストメニューを表示して 何か選んだらその内容をカレントのカーソル部分に流し込むスクリプトクレクレ
62 :
54 :2009/09/30(水) 15:16:19 ID:WEPYNDxu0
>>55 >>57 >>59 ありがとう、試してみます。
>>58 いろんな手段でシャットダウンするので(それこそPCの電源ボタン押したりとか)、
シャットダウン用のスクリプト用意して、というのはちょっと無理っぽい
すみませんが少しお尋ねします。連続打鍵で特定のショートカットキーを押 したことにしたいのですが、そういった処理は可能でしょうか。 具体的にどのような使い方をするかと言うと、現在は Crrl+D でクリップボ ード拡張ソフトを呼び出しているのですが、これを Ctrl や Shift や Alt の連続二回押し(もしくは三回押し)で呼び出せるようにしたいのです。
連続打鍵の検出と、それをトリガーとして特定のキー発行もできるよ。 だだ、そのソフトがキーを拾ってくれるかは分からないけど。 ~LCtrl:: KeyCount := (A_ThisHotkey==A_PriorHotkey && A_TimeSincePriorHotkey<300) ? KeyCount+1 : 1 Tooltip, 連打回数 = %KeyCount% KeyWait, LCtrl Tooltip Return キー発行は Tooltip のところを変えれば何とかなるよ
一応、連打ホットキーっていうそのものズバリなソフトはあるけどね
>64,
>>65 どうもありがとうございます。AutoHotkeyは初めてですが何とか頑張ってみます。
AutoHotkey v1.0.48.04.L32 のバグなんだろうけど… 関数内で local 宣言した変数のうちいくつかが何故か static 扱いになってしまっている。 この現象が起きるスクリプトで該当部分を走らせると100%再現する。 本家のものでは再現しないし、以前のAHK_Lでも再現しない。 てかずっと常用しているスクリプトの挙動がおかしくて気づいた。 1000行以上あるスクリプトで該当関数は数十行なんだけど、 関数が関数を呼んで何てことになっているので、再現できる最小コードが上手く割り出せない。 もうチョイ調べてみるけど、それでも分からないなら丸ごとLexikosタソに送るしか無いかねぇ・・・
質問があり、失礼いたします。 AutoHotKeyにてprintfデバッグのような方法はありませんでしょうか? デバッグのような作業をどのようにしたものか?と思いまして
IEのタブを指定して閉じるみたいなことできませんか?
>>68 ListVars コマンドを使う。
ListVars だとアクティブウィンドウが変わって困るなら↓みたいにやる
DllCall("AllocConsole")
Loop, 20 {
StdOut("hoge " . A_Index)
Sleep, 1000
}
msgbox
StdOut( text ) {
static hStdOut=-1
if (hStdOut = -1) {
hStdOut := DllCall("GetStdHandle", "UInt", STD_OUTPUT_HANDLE:=-11)
if ErrorLevel
return -1
}
text .= "`n"
ret := DllCall("WriteFile", "UInt", hStdOut, "UInt", &text, "UInt", StrLen(text), "UIntP", bytesWritten, "UInt", 0)
return bytesWritten
}
>>69 AHKのビルトインコマンドだけじゃ無理。COM操作では何とかなるかもしれない。
URLやタイトルを指定してってのなら出来そうだけど、N番目のタブって指定ならどうだろう…
71 :
68 :2009/10/03(土) 06:46:02 ID:PGN0BmtR0
>>70 ありがとうございます。
なるほど・・・。
より簡易的なら、
MsgBox := DllCall("RegisterWindowMessage", Str,"MetaTrader4_Internal_Message", Int)
MsgBox, UNKOOOOOoooooooo!!!!!!
するとか、ドキュメントを見ていたのですが
OutputDebug Mankooo!!!
とかでDebugViewで監視とかもいけますね。
助かりますた。
OutputDebugStringつかって出力して それトラップするツール作るなり拾ってくるなりすればいいんじゃね。 AHKではやらないけどIDEついてない開発環境ではそれなりに有効。
Autohotkeyでセミコロンにスティッキーシフトの 機能あてるには どうしたらいいんでしょうか
指定ウィンドウをアクティブにならないようしたいんですが このソフトでできませんか?
75 :
68 :2009/10/04(日) 06:34:32 ID:MGN4M+SU0
>>72 APIのOutputDebug がまさにそのようです。
OutputDebugStringを見るには、MS配布のDbgViewがありますので・・・
API使わんでも標準コマンドにあると思うが。
77 :
68 :2009/10/04(日) 15:13:00 ID:MGN4M+SU0
>>76 ごめん、標準ライブラリのコマンドのことをAPIっていったの
78 :
名無しさん@お腹いっぱい。 :2009/10/05(月) 16:22:39 ID:2bmPua6X0
msgbox,% 2 ** 100 これを実行すると、マイナスがつく値が表示されます 桁あふれの症状だと思います ただしい値を表示するにはどうすればよいのでしょうか
・桁あふれした場合を考慮した計算ルーチンを自分で作る ・桁数指定できる数値型を持つプログラム言語やDBを使って計算させて、文字列にキャストしした結果を得る
>>79 2番目の方ならすぐにできますね
どうもありがとう
>>74 ならないようには無理かも。
アクティブなった瞬間に非アクティブにすることなら可能。
settimer なり loop なりで、 アクティブじゃない場合はひたすら winset bottom し続ければいいんじゃね
>>81 ありがとうございます!
窓使いの憂鬱から乗り換えたんですが
色々分からないことが多くて…
スクリプト読んで勉強させてもらいます
>>20 配列が使えるということは分かったけど
配列の逆順ソートとかは出来るのかな?
autohotkey_lの説明を見てもよく分からなかった
定義済みクラスは現状1コしかない。Javaだと java.lang.Object 相当のみ。 ソートさせたいならメソッド作ればおk。
キーボードの任意のキーを2回連続で叩いたときに、2回目以降のキー入力を無効化したいんですが 何かいい方法はないでしょうか? あるソフトで同じキーを叩くとツールがトグル変更されるのを防ぎたいんですが…
A_PriorHotkey と A_TimeSincePriorHotkey で何とかできるんじゃね 間にホットキー割り当てしてないキーが挟まれることを考えると面倒だけど、 連打という条件があればある程度無視できるだろうし
>>74 WS_EX_NOACTIVATE をセットすればいいんじゃないかな。
WinSet, ExStyle, +0x08000000, A
SetTimerでラベルまで飛ばしたあと戻すにはreturnを使うのが一般的なんでしょうか?
>>89 ありがとうございます、できました!
b::
if ( A_PriorHotkey = "b" )
return
else
send, b
return
>>91 タイマーは時限実行(の繰り返し)だから、戻り元なんて無いよ。
強いて言えばスクリプト中に無い AutoHotkey のコア部分が呼んでいる。
それに、その使い方なら、Gosub が適切かと思う。
一定時間後に特定ラベルを実行してそれの終了を待つなら Sleep + Gosub。
>>9 これ解決しないかなぁと思いつつ
使い続けています…
>>9 の問題は日本語環境以外でも発生するのかな
公式forumを見てみてもよくわからない
Ctrl + A にカーソルキー左を割り当てました。 オートリピートがかかると、何回かにいっぺん a が 入力されてしまいます。 これを回避するにはどうすればよいでしょうか?
^a:: Send, {left} KeyWait, a Return
VBやCで作成したプログラムからAHKのスクリプトを起動してある処理を実行させるとします その実行結果を返値としてC等のプログラムが受け取る方法はありませんか?
ExitApp,1 が、Cで言うところの exit(1) に相当する
多重起動できるアプリの各ウィンドウの判別ってどうすればいいんでしょうか? ある動画プレーヤーで判別したいんですが、クラス名は同じだし、タイトル名も 再生ファイルごとに変わっちゃうので判別には使えない… 何か他に方法ありませんでしょうか
あるプレイヤーとか、複数の同一クラスのウィンドウから一つを特定して何をしたいかとか、 重要なことが書いてなくて何とも言えない。 強いて言えば、WinGet, list, List, ahk_class hogehoge で取得したリストの並びは ウィンドウの重なり順のはず。
>>102 Saiなどのペイントソフトを使用中に資料としてプレーヤーを開いてる事があるのですが、
ペイントソフトがアクティブの時に右Winキーなどを押下してる間だけ一つ下のプレーヤーアプリを
アクティブにして早送り・巻き戻しなどの操作ができるようにしたいなと思ってます。
その際、一つ前のプレーヤーアプリのIDのようなものを変数に格納しておけばいいのかな、と思った次第で…
class名やタイトルバーでウィンドウを判別する方法しか知りませんで、
WinGetでとれる個別IDの類の存在を初めて知りました……ど初心者で申し訳ない。勉強になりました。
すみません、もう一つ質問を…
現在アクティブなアプリのウィンドウ並びで一つ下のアプリをWinActiveなどでアクティブ化する方法は
ありませんでしょうか?
ペイントソフトをアクティブにする直前に使っていたプレーヤー、画像ロダ、ブラウザなどをアクティブ化できれば
IDをいちいち格納・指定しなくてもいい気がしました。
VistaでUAEオンにするとSendPlayが効かなくなる問題って 何か解決する方法無いんでしょうか?
ぶっちゃけ、Alt+Tabでいいんじゃないの。 (RWinないからLWinで書いてる) LWin:: Send, !{Tab} KeyWait, %A_ThisHotkey% Send, !{Tab} Return
firefoxのアドオンの 「auto copy(テキスト選択で自動コピー、マウスホイールクリックでペースト)」が 大変便利なんですが、 autohotkeyを使用して、すべてのアプリケーションでこの機能を実現できますか?
109 :
101 :2009/10/13(火) 17:36:58 ID:9Du/ZfOf0
110 :
名無しさん@お腹いっぱい。 :2009/10/13(火) 22:54:45 ID:KYqq6xvI0
ある操作を自動化するのにスクリプトを組んでいるんですが どっかで間違えているらしく正常に動かないのでゆっくり動かして 確かめたいんですが、各コマンドの間にsleepを挟む以外に方法って ないでしょうか?
やる内容によるなぁ。 変数に値が入っているかどうかなら、ListVars とか MsgBox などで変数内容が妥当かを見る。 Send コマンドでメニュー操作してるなら、アクセラレータキーを1個ずつ増やしてきちんと選択されているかを見る。 マウス操作などでは、マウス直下の座標とかクラスとか見たりする。 操作対象にきちんとフォーカスが当たっているかで、ControlGetFocus したりとかする。 場合によっては、Return とか Exit で処理をぶつ切りにするのも手だ。(処理中断後の状態で判断) 簡単なものなら一気に書いて実行でいいけど、1コマンドずつ実行結果が妥当かどうかを見るしかないと思う。
というか、操作対象が無いとか、操作失敗した時に分かるしんで、ErrorLevel 活用するのがいいと思うよ。
どうしてもわからなかったので質問させてください 例としてJaneを表示させたり非表示にさせたりするスクリプトです。 #Persistent Menu, TRAY, add,hide,hide Menu, TRAY, add,show,show start: loop { sleep,10000 winshow,Jane } hide: winhide,Jane goto,start show: winshow,Jane goto,start タスクトレイアイコンから右クリックで表示、非表示を何度か繰り返すと その後トレイからの操作ができなくなるんですが、なぜでしょうか?
・Auto-executeセクション(start:以下のループ)が無限ループになってる ・各メニュー操作後goto,startで戻るから、メニューによって起動されたスレッドは永遠に終了しない #MaxThreadsで指定しないとスレッドの最大数は10だから、 9回メニューを操作すると、起動時のスレッドを含めて最大値の10に達する 各メニューの処理は、goto,startではなく return で終了させる Auto-executeセクションの処理の最後には明示的にreturnを書いて、他のホットキーラベルなどの処理に突入しないようにすべき それからstart:の下の無限ループが少しひっかかるけど、 あくまで例だと思うので、きっとそこは何か意味があるんだろうね
いろいろと間違ってたみたいですね。 ありがとうございました。
対象の優先度を取得して条件に合わせて変更するというの作れないかなあ ただ変更するだけの項目は見つけられたのだけど
質問です。 Autohotkeyスクリプトを複数常駐させる一括起動スクリプトを作っているのですが、 その中のいくつかを残して一括終了させるにはどうすればいいのでしょうか? できれば、その常駐するスクリプトはコマンドラインで終了コマンドを受け取ってという方法を使わない方法で考えているのですが思いつきません。 ご教授下さい。
色々やり方はあるね 1) メインウィンドウを閉じてしまう、残す側のスクリプトに仕込んで何らかのトリガで実行。 終了させられる側は何もしない。 DetectHiddenWindows, On WinClose, A.ahk ahk_class AutoHotkey WinClose, B.ahk ahk_class AutoHotkey WinClose, C.ahk ahk_class AutoHotkey 2) 一括終了対象のスクリプト全部で同一ホットキーで終了させるようにする ホットキーには ~ をつけて入力を奪わないようにする 残す側は何もしない。 3) OnMessage と PostMessage で終了命令のやりとりをする 両方に仕込みが必要。
>>117 コピペレベルの能力じゃうまく使い方わからなくて挫折した
>>120 ありがとうございます。
ですが、表現言葉足らずです。ごめんなさい。
終了させる側のスクリプトに仕込まない方法を知りたかったのです。
>>2 にある1 Hour Softwareをたくさん使っていまして、絵を描くときや文字を書くときなどそのときどきにそのとき必要なスクリプトを起動させときたいと思い立ったのです。
いくら便利だからといって全部常駐させるのはあまりに数が多いし、干渉してしまうのもあるので。
タイトルバー持つモノなら起動後のタイトルバーを記憶してで可能なのですが、
常駐しての水面下で動くモノだとどのようにして特定すればよいかわからないのです。
idやpidも試みたのですが、できたりできなかったりでした。
このような複数常駐する単体ソフトも珍しいので検索しても思うようなのが引っかかりませんでした。
>>122 こんなのでいい?
#NoEnv
#NoTrayIcon
#SingleInstance, Force
DetectHiddenWindows, On
Gui, Add, ListView, Grid Checked w400 r10, Path|PID|hwnd
Gui, Add, Button,, &Close Selected
Gui, Add, Button, x+10 yp+0, &Refresh
Gui, Show,, Ahk Killer
Gosub, ButtonRefresh
Return
GuiClose:
ExitApp
ButtonCloseSelected:
row:=0
While (row:=LV_GetNext(row, "C")) {
LV_GetText(hwnd, row, 3)
WinClose, ahk_id %hwnd%
}
ButtonRefresh:
Process,Exist
MyPid:=ErrorLevel,LV_Delete()
WinGet, list, List, ahk_class AutoHotkey
Loop, % list
{
WinGetTitle, title, % "ahk_id " list%A_Index%
WinGet, PID, PID, % "ahk_id " list%A_Index%
If (pid!=MyPid)
LV_Add("Check", RegExReplace(title, " - AutoHotkey v1(\.\d+)+(\.L\d+)*",""), PID, list%A_Index%)
}
LV_ModifyCol(1),LV_ModifyCol(2),LV_ModifyCol(3)
Return
124 :
名無しさん@お腹いっぱい。 :2009/10/14(水) 22:59:10 ID:Pmlqip040
>>111 >>112 ありがとうございます。いろいろ方法があるのが分かったので
いろいろ試してみます。
>>123 すごい
WinGet, list, List, ahk_class AutoHotkey以降の列挙の仕方が目からうろこでした。
ほんとにありがとうございます。
特定のウィンドウを決められた位置で表示したいのですが
途中で送信してしまいました。すみません 特定のウィンドウを決められた位置で表示したいのですが どういった方法が良いのか模索しています。 例えば Jane Style のビューアのウィンドウはデュアルディスプレイ環境で サブの画面に表示させておいてもこれを閉じて開き直すとメインの方で 表示されてしまいます。いつもサブの方で開いておきたいという希望です。 Loop 内で WinWait でウィンドウが現れるのを待ち現れたら SetTimer を 仕掛けて 1秒おきに移動させるというスクリプトを作りました。 WinWaitClose でウィンドウがいなくなったらタイマーを オフにするようにしました 動作は概ね期待通りなんですがウィンドウが現れた後 1秒ごとに 移動を実行しているのは無駄な処理であるような気がします。 ウィンドウが特定の場所にいるときは何もしないようにした方がよいかなと 思うのですがあるウィンドウの位置を知る方法ってありますか? 1秒おきに移動させるようなことをしておいても別に問題ないでしょうか?
128 :
127 :2009/10/15(木) 01:42:35 ID:NEBUo+kH0
127 に追加です。 サブの画面に表示されるようにしたいウィンドウは 他にも幾つかあります。Loop の中で WinWait で特定の ウィンドウを待っているとそこから先に進まなくなります そこで 1つのスクリプトの中で複数のループを同時に動かすことってできますか? 似たようなスクリプトを作って複数走らせるようにするしかないですかね
ウィンドウが指定位置と指定サイズになければ移動するって関数を作って それをタイマーで回すとかは? 多分もっといい方法はあると思うけど
130 :
127 :2009/10/15(木) 02:50:44 ID:NEBUo+kH0
ちょっと長くて申し訳ないのですがスクリプトを貼り付けます。
最初
>>127 は次のようにしていました。
#Persistent
Loop
{
WinWait, ahk_class TImageForm
SetTimer, move_jane_viewer, 1000
WinWaitClose, ahk_class TImageForm
SetTimer, move_jane_viewer, Off
}
move_jane_viewer:
WinMove, ahk_class TImageForm,, 1600, 0
return
これだとまずはループの最初で WinWait で止まりますが
他のウィンドウが現れたときはそちらも移動させたいので困っています
131 :
127 :2009/10/15(木) 02:52:39 ID:NEBUo+kH0
自分が考えた案では SetTimer は負の値にすると 1度だけ実行されると あるので次のようにしてみました #Persistent SetTimer, move_jane_viewer, -1000 SetTimer, move_notepad, -1000 move_jane_viewer: Loop { WinWait, ahk_class TImageForm WinMove, ahk_class TImageForm,, 1600, 0 WinWaitClose, ahk_class TImageForm } return move_notepad: (上と同じで ahk_class Notepad とする) 期待に反してそれぞれのループが独立して動いてくれません 動かしてみると Notepad の WinWaitClose で止まってしまい そのときに Jane のビューアを開き直してみても移動しません これは「A5:「擬似マルチスレッド」です」が原因なのかなと思いますが 良い解決策が思いつかなくて相談しに来ました ちなみにそもそも行いたいのはウィンドウが現れたときに特定の位置に 移動させたいのであって、ウィンドウが存在するときはいつも特定の位置に あるようにしておきたいということではありません…… 最悪それでも良いのですが無駄に移動するのも鬱陶しいなぁと思いました
132 :
127 :2009/10/15(木) 02:58:32 ID:NEBUo+kH0
>>129 調べてきました。WinGetPos ってのが使えそうですね!
ウィンドウが存在するか & 指定位置にあるかを確認して
必要なら移動して (その後何かを待たずにすぐ終わる) 関数を作り
それをタイマーで呼ぶというのは良さそうです
よく考えると WinWait で待たないといけない訳じゃないですね
タイマーの使い方をよく分かってない気がしました
勉強し直してきます。スレ汚しすみませn
>>128 >7のQ5参照
LoopからタイマーをON/OFFするのではなく、タイマを常にONにして
通常はチェックだけして抜けるようにするようにすればいい
大事なのはWaitやSleepなど時間のかかる処理を入れないこと。
Timer1:
IfWinExist, ウィンドウ名
{
WinGetPos, X,Y,W,H
If (ウィンドウポジションがサブディスプレイにいない時)
WinMove 任意の位置へ移動
}
return
あと、127の挙動だとメインディスプレイへの移動を常に禁止してるけど
起動時に一発だけ位置調整するのではだめなん?
それだったらアプリ呼んで自分はすぐ死ぬ起動用スクリプト作ればいい。
Run, hoge.exe
WinWait, hoge
WinMove 任意位置
ExitApp
すまんリロってなかった
カーソルを画面右隅に持ってきたら指定ウィンドウを右隅から出して カーソルが領域から出たら右隅に隠して見えなくしたいんですが カーソルが右隅にくるまで待つようなことできないでしょうか?
タイマーとMouseGetPosでいけるでしょ
ポップアップメニュー(ahk_class #32768)のメニュー項目のテキストをどうにかして取得できないもんだろうか。
138 :
名無しさん@お腹いっぱい。 :2009/10/16(金) 02:12:00 ID:XZ2GC7uQ0
ただランダムに数を生成するだけではなく、一回生成した数は生成しない または生成した数があったら、もう一度生成し直す繰り返しの文って どう書けばいいんでしょうか? どうやって生成した事があるかを確かめばいいのかが分かれば、 一歩進めると思うんですが
最初に作っちゃえばいいんじゃないの Loop, 10 Random_List .= A_Index "`n" Sort, Random_List, Random MsgBox, 乱数リスト`n--------`n%Random_List% Loop, 11 { firstDelim:=InStr(Random_List, "`n") rnd := SubStr(Random_List, 1, firstDelim-1) StringTrimLeft, Random_List, Random_List, % firstDelim MsgBox, % A_Index "個目 : " rnd }
141 :
137 :2009/10/17(土) 00:38:08 ID:yQ2wv/5r0
>>140 おぉ、ありがと。
これでメニューの誤爆を回避できそうだ。
ウィンドウ移動させる場合、瞬時にその座標に移動させるのではなく マウスでドラッグしたときのように徐々にその座標に移動していくようにできませんか?
firefoxで RButton::Send,{Enter down}{Enter up} ってやるとメニューが開いちゃうんだけどプロの皆さん何とかなりませんか?
いちいち多重キー設定がめんどくさくて、 スペースキー1発とかでアプリ別に動作割り当てしたいんだが、 #IfWinActive ahk_class XXX space:: Send,{○○} return #IfWinNotActive ahk_class XXX とかで、全然ほかの動作に影響を与えず、とあるアプリの動作時だけ 1つのキー押下でアプリごとにいくらでも別動作できますね。
こんな激しく便利なものがあるなんて、全然知らんかった。 アプリごとにいっちいちahkファイルまるごと置き換えてたわ。
ホットキーラベル内でIfWinActiveで分岐している方が補ほど建設的だ。
タスクマネージャ見るとAHKが5個くらい起動してるときあるんですが どういう原因が考えられますか?
>>147 俺もその現象に悩んでる。
スタートメニューからメモ帳を2つ起動したら、
タスクマネージャにnotepad.exeが2個あるんだよね…
なんでだろ…
俺のところもペイントを2つ起動したら、mspaint.exeが2つできる 不思議だな
Hotstringの終了文字をAlt+Enterに限定したいんだが どう書いたらよいだろうか。 #Hotstring EndChars NewChars!`n この書き方だと'!'が修飾キーとはならず、'!'と'Enter'でそれぞれ発動してしまう。
150だが、*オプションつけとけば何ら問題が生じない事に気づいたよ。 スレ汚しスマソ
ファイルを開く/閉じるダイアログ上で ホットキーで 新しいフォルダ作成しようと思ったら 右上のアイコンのクリックエミュするしかないのかな。 エクスプローラ上では↓でできているんだけど ~^K:: WinGetClass,cls,A if (cls=CabinetWClass || cls=ExploreWClass) Send,!fwf return
>>152 WM_COMMAND で何とかするのもありかな。コマンドID は inspect_toolbar_ids.ahk で調べる。
#IfWinActive, ahk_class #32770, FolderView
^k::
ControlGet, hwnd, HWND,, ToolbarWindow321
PostMessage, 0x111, 40962, hwnd
Return
裏技ってw スクリプトの通る行数(Loopを展開した分も含める)が多い場合は、 SetBatchLinesで自動挿入されるスリープの間隔と長さを変更すると、 かなり実行速度は変わる。 〜Delay も大量にウィンドウやキー・マウス操作をするなら短くした方が速くなる。 ファイル操作とかだけで、AHKだけで完結するならスリープの間隔は無くても構わないけど、 他アプリを操作す場合、息つく暇もなくマンドを送ってもそれを処理する暇がないかもしれない。
>>156 SetBatchLinesの設定を忘れていました
ありがとうございます
そういえば、ヒアドキュメントつかえば
>>6 の Q1 は割と簡単に回避できるよな。
`nとか使えないけど
MsgBox,
(LTrim `
〜AチЯ`荏柿義形港餐汁秦疏蛋伝覗描冒輿倭兪啻嫣彖拜杼歔
)
便乗ですが、
>>140 で取得したコンテキストメニューで、全項目の取得はできました。
この取得をさらに拡張して、取得中にsettimerで定期巡回して、
いまフォーカスが合っている(選択されている)メニュー項目を取得する方法ってありますか?
やりたい動作は、たとえば2ch専ブラJaneStyle等の書き込み欄でCtrl+Spaceを押すと
AA呼び出し が出ますが、これに近いインターフェースを汎用的に作りたいです。
コンテキストメニューの項目にカーソルを合わせると、その項目に合った本文を
コンテキストメニューの右側にtooltipsで表示させたいです。
tooltipsで表示する部分は作り終えましたが、コンテキストメニューの
フォーカスを取得する方法で難儀しています。
AHKのMenuコマンドでメニュー選択待ち中はスクリプトがストップするようなので、
別プロセスで監視&表示支援を行う方法で考えています。
自前でメニュー出して、更にタイマーでツールチップ出すってことなら、その方式が無理。 自前のメニュー表示中はホットキーとかタイマー動かないから。 SetTimer, Timer1, On Menu, X, Add, ああああ, Dummy Menu, X, Add, いいいい, Dummy Return ^Space::Menu, X, Show Timer1: Tooltip, %A_Now% Dummy: Return
↑のが面倒なんで、俺はクリップボード履歴とか入力補助はツールチップでやってる。 これだと他にツールチップ出せないけどw #NoEnv SendMode Input text_1 = ああああああああああああ text_2 = いいい`n`nいいいいいいいいいいい text_3 = ううううう`nううううううう`nううううううう text_count = 3 Process, Exist GroupAdd, MyTips, ahk_class tooltips_class32 ^Space:: text_no:=1 Goto, ShowTip #IfWinExist, ahk_group MyTips Up:: text_no := (text_no==1) ? text_count : text_no-1 Goto, ShowTip Down:: text_no := (text_no>=text_count) ? 1 : text_no+1 ShowTip: Tooltip, % text_%text_no%, %A_CaretX%, %A_CaretY%, 1 Return Enter:: Send, % SendConv(text_%text_no%) Esc:: HideTip: Tooltip,,,,1 Return
AutoHotkey_L - Revision 33 - October 3, 2009 * Fixed: Local variables were not automatically freed for functions which return objects or pure numbers. * Fixed: Two separate reference-counting errors related to ternary operator and Object(). * Fixed: If a string returned by a scripted object function was assigned directly to a variable, the variable's length was set incorrectly. * Fixed: If the last operation in an expression retrieved a string from a temporary object, the object and string were freed prematurely. * Fixed: Numeric strings with special formatting were not preserved when returned from a function via a variable or passed to a recursive function. * Fixed: If the final result of an expression (other than for Return) is an object, correctly yield an empty string instead of silently aborting the thread. * Fixed: __Delete meta-functions sometimes overwrote temporary values in the deref buffer. * Added: An address retrieved via &object may be cast back into an object reference by using Object(address).
AutoHotkey_L - Revision 34 - October 24, 2009
* Changed: Setting a value within an object to an empty string now stores the empty string rather than removing the key-value pair from the object. _Remove can still be used to completely remove key-value pairs.
* Changed: Command names must be terminated with a space, tab or comma. The following characters no longer bypass this requirement: <>:+-*/!~&|^[]. For instance, syntax errors such as MsgBox< foo and If!foo are now caught at load-time.
* Fixed: Return now properly handles expressions which result in a variable containing an object. For instance, Return x:=y, Return (x), Return x,... and similar should work now (Return x already worked).
* Fixed: Multi-parameter get/set did not correctly support meta-functions for multiple objects (such as for x and x[y] in the expression x[y,z]).
* Fixed: Cascading object-assignments such as the x[y]:=z in r:=x[y]:=z could not yield numbers or objects - broken by L33.
* Fixed: x._Remove(y) crashed the script or removed the wrong item if x did not contain y.
* Fixed: x.=y, if x.y=... and similar. May affect other expressions.
* Fixed: Standalone ternary expressions no longer requires spaces. For instance, x? F(1) : F(2) is now allowed.
* Debugger: On script exit, disconnect debugger *after* releasing objects to allow debugging of __Delete handlers.
大きな変更はないね。
>>67 は Rev.33 で直ったようだ
と思ったけど、 If(a=b) みたいに分かち書きしてないのが結構跳ねられる。 管理人さんのは結構あるなぁ・・・。まぁ一括置換でやるからいいけど。
>>166 > If(a=b) みたいに分かち書きしてない
ってどういうこと?
ここで言う分かち書きって
If (a=b)
と
If(a = b)
のどっちですか
>>167 前者。存在しない関数を呼ぶな!って怒られる。
一応断っておくけど、本家じゃなくてLexikos版のほうね。
あーなるほど、今まで
>>167 の下みたいに書いてたけどそういう話があったのか
いっちいちややこしい複数キーバインドでアプリごとに使い分けしてたが、 アプリ単位で設定できるんだなー 全然しらなかった。メインのAutohotkeyファイルがクソ長くなったり、 どこに何書いたか分からなくなったり、重複したり、実にアホくさいことしてた。 ;;;;メモ帳開始;;;;;;;;; #IfWinActive ahk_class Notepad #Include メモ帳.ahk #IfWinNotActive ahk_class Notepad ;;;;メモ帳終わり;;;;;;; こんだけで F1::とか単純なキーをアプリごとにいくらでも別挙動にして使えるだな。 アプリ別にアホみたいに割り当てできる>>かつahkファイルが無駄に長くならない。 なんて知らんかった。ifでアプリ別分岐とかもいらねーじゃん。 もっと速くおしえてくれよ。
>>170 HAHAHA!…俺も知らなかったorz
173 :
160 :2009/10/25(日) 15:40:17 ID:iXgpRWpO0
174 :
160 :2009/10/25(日) 16:22:01 ID:bbIN2Plw0
と思って自前で組んだAHKポップアップメニューを読もうとしたら、
IDは読めるものの、文字列が「-1」になってしまって読めませんでした。
余計なカスタマイズが原因かと思って、以下の最小構成でテストしましたが
AHKが出すポップアップメニューは、このままではダメそうです。
たとえばこのスクリプトで
#persistent
#SingleInstance FORCE
Menu, test, add, Item1, MenuHandler
Menu, test,show
return
MenuHandler:
MsgBox You selected %A_ThisMenuItem% from menu %A_ThisMenu%
return
フォーカスを合わせて選択確定前に「Item1」という文字列を、別PIDで実行するAHKで
抜き取りたいのですが、どのへんに手を入れれば読めるようになりそうでしょうか。
なお、
>>173 でリンクを貼ったスクリプトで、ExplorerやIEのポップアップメニューは
IDも文字列も、選択中の文字列がリアルタイムに全部読めています。
Shiftきーを単独で押した時の動作を割り当てたいのですが どのように条件を書けばいいですか? デフォルトのShiftキー+各キーの機能は殺さないままにしたいです。
こんな感じ? #NoEnv ~Shift:: AnyKeyPress:=0 KeyHook(true, 0xA0) KeyWait, vkA0 KeyHook(false) If (!AnyKeyPress) Send, {Space} Return KeyHook(enable, ignoreVKey="") { static hModule, hKeybordLL, hHook, keyInfo:="0000" If (!hKeybordLL) hKeybordLL:=RegisterCallback("KeybordLL", "", 3, &keyInfo), hModule:=DllCall("kernel32.dll\GetModuleHandle", "UInt",0, "UInt") If (!hHook && enable) { NumPut(ignoreVKey, keyInfo, 0, "Int") Return (hHook:=DllCall("user32.dll\SetWindowsHookEx", "Int",0x0D, "UInt",hKeybordLL, "UInt",hModule, "UInt",0, "Int"))>0 } Else If DllCall("user32.dll\UnhookWindowsHookEx", "UInt",hHook, "Int") && !(hHook:=0) Return true } KeybordLL(nCode, wParam, lParam) { global AnyKeyPress vk:=NumGet(lParam+0, 0, 4), ignoreVKey:=NumGet(A_EventInfo+0, 0, "Int"), AnyKeyPress |= (vk != ignoreVKey) Return (wParam==0x100 && vk==ignoreVKey) ? 1 : DllCall("user32.dll\CallNextHookEx", "UInt",0, "Int",nCode, "UInt",wParam, "UInt",lParam, "Int") } キーフック使わないで、任意のキーが押されたかどうかを判定する方法ってあるのかな。
178 :
176 :2009/10/26(月) 13:17:47 ID:aL7f9Ydj0
>>177 おお〜すごい!ありがとうございます。使わせてもらいます。
これだけ沢山スクリプトを書かないと実現できないんですね。
どうりで自分みたいな素人が試行錯誤してもできなかったわけだ。
>>177 横レスで済みませんが
> KeyHook(true, 0xA0)
の0xA0って具体的に何のキーですか?
VKeyの値のようですが……
>>179 キーフックを使って何かキーをおしたらグローバル変数 AnyKeyPress をTRUE(=1)にするんだけど、
今回のように特定のキーを押している間の場合はキーリピートが発生したりするので、
そいつを無視するために無視するVKeyを指定しろって事。
Shift の VKey は 0xA0 なんでそう指定した。
他のキーでやるならメインウィンドウのメニュー>View>KeyHistory で調べる。
OSはXPで、AHKスクリプトの動作状況の把握として、sounbeepでPCの内蔵ビープを鳴らすのが 好きなんだけど、VISTAとWin7は、サウンドチップのデコーダ経由で出てしまうね。 例: soundbeep,2000,100 soundbeep,1000,100 それでも、その音がOS側で完全にエミュレートできてれば何も問題が無いのだけど、 常に0.2秒ほど遅れて(頭切れで)出てくることと、音長や音程もズレてる。 しょうがないからDOS用のビープを鳴らすソフトを探してきて使ってみたら、 なんと、AHKと同じズレた音が出てきた。 どうやらVista以降では、OSそのものがBEEP音を鳴らす機能を廃止してしまったようで。 なにかうまい回避策ないでしょうか。
182 :
名無しさん@お腹いっぱい。 :2009/10/27(火) 11:36:40 ID:JUNZbM8m0
スクリプトのショートカットをクイック起動に登録してメディアプレイヤーの制御などに使っているのですが 押すたびにラグがあるので本体を常駐させたいのですが出来ますか?
出来るよ。 常駐させてキーやマウスで機能実行するなら、ホットキーラベルを追加するだけでいい。 多分1行追加でいける。
>>183 すみません、ググってもやり方がわかりませんでした。
exe化するとクイック起動のボタンの数だけタスクトレイのアイコンが出来そうなのですが・・・
こんな単純なことを、これだけヒントもらってわかんないなら、 もうめんどくさいから具体的にスクリプトをここに書いてみなよ。 だれかが改変してくれるから。
>>185 すいません。
デスクトップを表示するボタンとして
>Send,#m
マイコンピュータを表示するボタンとして
>Run,Shell:DriveFolder
現在は上記の様な一行のスクリプトをクイック起動フォルダに入れて
クイック起動ツールバーから押せるようにしています。
上記の二つのボタンは連打することはないので気にならないのですが
音量調節ボタンなどは押す度に起動と終了を繰り返すためラグが気になってしまいます。
親切だな 久々2chで心がなごんだ
このスレには、環境改善に積極的で優秀な人材がそろってる
ttp://www.autohotkey.net/~Lexikos/AutoHotkey_L/ Revision 35 - October 25, 2009
* Fixed: Standalone expressions beginning with two or more "dots", such as x.y.z(). (Broken by L34.) Note that '(' or '[' or ':=' is still required.
小さなバグfixのみ
クリップボードを介さない文字列の貼り付けをしたいのですがどうやっていいのかわかりません ご教授お願いします
>>191 ・いっきにsendする
・loopで1文字づつsendする
・クリップボードの内容を退避しておき、目的のものを貼り付けて、最初に退避したものを戻す
いろいろあるさ
SendMode, Input #1::Send, % SendConv("ほげ`nホゲ`nHoge") SendConv(str) { Loop, PARSE, str { If isKanji && RegExMatch(A_LoopField, "[\x40-\x7E\x80-\xFC]") isKanji := false, keyStroke .= "{ASC " . (Asc(lastChar)<<8|Asc(A_LoopField)) . "}" else If RegExMatch(A_LoopField, "[\x81-\x9F\xE0-\xFC]") isKanji := true, lastChar := A_LoopField else If RegExMatch(A_LoopField, "[#!\+\^\{\}]") keyStroke .= "{" . A_LoopField . "}" else If (A_LoopField="`n") keyStroke .= "{Enter}" else keyStroke .= A_LoopField } return keyStroke }
ありがとうございます 修行不足でした まだ読み解けてませんがモノします
トラックポイントの弄りすぎで中指人差し指の筋痛めてる者としてはちょっと気になるな Webカメラ持ってないんで試せないが反応速度度かどうなんだろう
#persistent sum:=1 loop, { inputbox,vx sum:=vx+sum } vy:=(sum-1) vy/=25000 msgbox,%vy% というスクリプトのloopからenterキー連打で抜けて、その後の命令に移らせたいんですが どうすればいいでしょうか?
Enter連打ってのが、何も入力しない場合にループ終了、ってのなら↓みたいな感じ? sum := 0 Loop { InputBox, value, Title, Sum = %sum%,,200,120 If (ErrorLevel > 0 || value == "") Break sum += value } MsgBox, Sum = %sum% ---- #Persistent が何で付いているんだろう・・・
199 :
名無しさん@お腹いっぱい。 :2009/10/29(木) 02:56:24 ID:9im39Kx40
>>198 inputboxのウィンドウが出てる時に、何らかの操作をすればloopから抜けられればいいだけでした。
enterだと入力あとの決定と被りますね。
特に考えずに付けてましたが、今のこれだけだと不要ですね> #〜
もう参加してる人いるかもだけど
UNICODE version AutoHotkey (needs your tests and helps)
ttp://www.autohotkey.com/forum/topic50485.html > I just translated the source codes of AutoHotkey to support Unicode, and it can be built now.
> However, it might be considered to be problematic and need your helps.
> Known issues (discussions required):
> 1. Transform, Unicode, * has been disable in the meantime.
> A more complete charset conversion routine has been planed.
> 2. File IO. I'd like to know how FileRead, FileReadLine,
> FileAppend should be implemented.
これはダメ文字がなくなると解釈していいの?
ちょっと試してみた。
■ `系統(
>>6 Q&A1)
・ 直書きでおk。(ソースファイルがUnicodeだから当然か)
■ \系統(
>>6 Q&A2下段)も
・ A_ScriptDir, A_ScriptNameなどの変数は0x5cを含んでいても正常動作。
・ SplitPath は0x5cを含んでいても正常動作。
■ その他
・ StrLen, SubStr, はキャラ単位でやる
・ ListVars に表示されるのはキャラ単位の長さ
・ VerSetCapacity はバイト単位。
・ NumPut/NumGetはバイト単位で動いているように見える。
・ (重要) クリップボードへの代入は文字化けする
>>6 の諸問題は解決できると思う。
>>203 おお、これはかなりの神更新かも。
A_LoopfilefullpathとかSplitPathを使うと正しく処理できず、
抜いたファイル名をifexistでいちいち確認して例外処理面倒だったが、
ようやく解決しそうだ
205 :
202 :2009/11/02(月) 00:11:38 ID:1jfL0zxP0
くそっ、規制解除されてたのか。携帯で入力面倒だったw
>>203 の補足
・ Loop, PARSE の区切り文字なしはキャラ単位。「\」などを区切り文字にしても大丈夫。
・ Loop, (files) も正常動作。 A_LoopFileName 等もおk。
・ クリップボードの件は、内部コードのUTF16LEのデータをCP932のデータとしてクリップボードに渡しているっぽい。
例) Clipboard = あいうえお ; u3042, u3044, u3046, u3048, u304A
で貼り付けると 「B0D0F0H0J0」になってる (0x42 0x30 0x44 0x30 0x46 0x30 0x48 0x30 0x4a 0x30)
あれ、
>>201 のは規制に巻き込まれて書きこめずにいた頃のだからちょっと古いね。
今の
Known issues (discussions required):
は
1. Transform, Unicode, * has been disabled in the meantime. Use "Transfrom, FromCodePage|ToCodePage" instead.
2. "AStr" data type can not receive the changes of DllCall().
になってますね。
他になにかあれば今のうち参加した方がいいんでしょうねぇ……。
英語できる方々 〜
A_LoopFileFullPath や A_ScriptDir は現状のでも大丈夫なはずだけど。 駄目なのは SplitPath や A_LoopFileDir、A_LoopFileName あたり UNICODE版だとRegEx周りも対応されるのかな もういちいち頭に [^\x80-\x9F\xE0-\xFC] とか付けなくても良くなるのだろうか。
test
私はcに近い形で書いているが、 autohotkeyのコーディング規則はどうしてる?
>>209 参考までにサンプルを書いてみてもらえると面白いかも。
人それぞれ違いはあると思うが、俺はDOSのバッチから以降組なので1行1命令を徹底
アプリを再起動するAutoHotKeyの関数を書いてみたんですが、上手くいかんとです… 2chブラウザのJaneとか終了が重いアプリだと、終了はするんですが再起動してくれなす。 うまい書き方ないでしょうか? ;;; restart app RestartActiveApp() { WinGet, name,ProcessName,A WinGet, pid,PID,A FullPath :=GetModuleFileNameEx(pid) WinClose , A WinWaitClose, A ;Process, Close,%pid% Run,%FullPath% ShowSplashText("restart @ " . name) } ;;; show splash text ShowSplashText(Text, Time = 600) { SplashTextOn,,, %Text% Sleep, %Time% SplashTextOff } (続く)
(続いた) GetModuleFileNameEx(ProcessID) ; modified version of shimanov's function { ; #define PROCESS_VM_READ (0x0010) ; #define PROCESS_QUERY_INFORMATION (0x0400) hProcess := DllCall( "OpenProcess", "UInt", 0x10|0x400, "Int", False, "UInt", ProcessID) if (ErrorLevel or hProcess = 0) Return FileNameSize := 260 VarSetCapacity(ModuleFileName, FileNameSize, 0) CallResult := DllCall("Psapi.dll\GetModuleFileNameExA", "UInt", hProcess, "UInt", 0, "Str", ModuleFileName, "UInt", FileNameSize) DllCall("CloseHandle", hProcess) Return ModuleFileName } 使用例: !^r:: RestartActiveApp() return みたいに使います。 終わり
Janeとかは、ウインドウが消滅しても、裏でいろいろ処理してて 20秒後くらいに終わる場合がある。 なのでWinwaitcloseで息災起動するんじゃなくて process,existで監視して、かつ数秒時間を置けば問題ないかと 俺がそういう関数を作るなら、1分1秒急ぐ仕事じゃなければ processが居なくなった後もsleep,3000とか適当にはさんで どんなアプリでも正常に動くように安全運転するようにしてる
× 息災起動 ○ 即、再起動 win7IMEの馬鹿野郎
Process ならWaitCloseがあるじゃまいか
216 :
211 :2009/11/03(火) 17:40:54 ID:CXVHGrFd0
>>213 なるほど…メインウインドウ終了しても、プロセスが残っているせいなんですね。
>>215 それだ!
Processは試したのに、マニュアルちゃんと読んでなかったwww WaitCloseあったのか
これで今の所、Janeの再起動が上手く行くようになりました。
;;; restart app
RestartActiveApp()
{
WinGet, name,ProcessName,A
WinGet, pid,PID,A
FullPath :=GetModuleFileNameEx(pid)
WinClose , A
;WinWaitClose, A
Process, WaitClose,%pid%
Run,%FullPath%
ShowSplashText("restart @ " . name)
}
起動時のコマンドライン引数は無視しているとか、細かい不都合がありますが、
どうしても困った時に対処することにます。
ありがとうございました!
流行らせるページのマウスジェスチャに、引数を取得する処理があった記憶
218 :
211 :2009/11/03(火) 18:28:18 ID:CXVHGrFd0
少しつまりました。
Firefoxの再起動はFirefoxアドオンのQuick Restart(ショートカットCtrl+Alt+R)を使いたいのですが、
Firefoxの場合だけ、グローバルのCtrl+Alt+Rを無視してウインドウにCtrl+Alt+Rを送るにはどうしたものでしょうか?
#IfWinActive, Mozilla Firefox ahk_class MozillaUIWindowClass
!^r::Send, !^r
#IfWinActive
だと、無限ループするし、
!^r::!^r
だと、グローバルのCtrl+Alt+Rが反応してしまいます orz
このような場合どうしたものでしょうか?
>>217 MG_CommandLine(pid=0)
ですね。今度試してみます。
自分の「閉じて開きなおす」はこんな感じ Path2_ProcessExeNameNT()は GetModuleFileNameEx() と同内容 Janeのリスタート率が異常に高いw restart: WinGet, PID, PID, A dir := Path_RemoveFileSpec(Path2_ProcessExeNameNT(PID)) cmd := Path2_GetCommandLine(PID) WinClose,ahk_id %hWnd%,,120000 DetectHiddenWindows,ON Process,Exist,%PID% If (ErrorLevel) && !WinExist("ahk_id " hWnd) { WinGet,l,List,ahk_pid %PID% Loop,%l% WinClose, ahk_id l%A_index%,,60000 } Process,WaitClose,%PID% Run,% cmd, % dir return ; フルパス名からディレクトリを取出す Path_RemoveFileSpec(path) { VarSetCapacity(t,260,0) DllCall("msvcrt.dll\_mbscpy",UInt,&t,Str,path) DllCall("SHLWAPI.DLL\PathRemoveFileSpecA", Str, t) return t }
; コマンドラインを取得 MouseGesture2 MG_CommandLine()改 Path2_GetCommandLine(pid=0){ 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) 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 }
>>218 リロードしてなかった
再帰イベント防止なら #UseHookか、$を使う
222 :
211 :2009/11/03(火) 18:57:24 ID:CXVHGrFd0
>>218 の件ですが、
ウインドウに直接送ればいいか、ということで、
!^r::ControlSend,, !^r
としたら上手くいきました。
また、
>>221 のように、
グローバルなキー定義を$で定義して、
#IfWinActive, Mozilla Firefox ahk_class MozillaUIWindowClass
$!^r::Send !^r
#IfWinActive
のようにしたところ、大丈夫でした。
いろいろやり方ありますね。
ありがとうございました。
>>119-120 うはわざわざコードまで。ありがとうございます。
せっかくなので参考にして組み込んでみます。
DLLCallを使える人はうやらましいなあ
この手のスクリプトだと仕方ないことだろうけど 車輪の再発明率の高さがすさまじいな
DllCallの類を使えるようになれば便利だとは思うけど 実際のところよくわからない どういうもので勉強すればよいのでしょう
Path_Relative(p1,p2) { Loop, 2 { q%A_Index% := 0 If (RegExMatch(p%A_Index%, "\\$") > 0) { q%A_Index% := 16 } } VarSetCapacity(p0, 256) DllCall("shlwapi\PathRelativePathToA", Str,p0, Str,p1,Int,q1, Str,p2,Int,q2) Return p0 } /* ------------------------------------------------------------------------------ shlwapi.dll ------------------------------------------------------------------------------ PathRelativePathToA(lpszPath, lpszFrom, dwAttrFrom, lpszTo, dwAttrTo) lpszPath : 相対化されたlpszToのパス lpszFrom : lpszToのパスが相対の基準とする絶対パス dwAttrFrom: lpszFromのパスがディレクトリの場合は16、ファイルの場合は0を指定 lpszTo : lpszFromのパスに対して相対化される絶対パス dwAttrTo : lpszToのパスがディレクトリの場合は16、ファイルの場合は0を指定 */ DllCall使い始めてまだ間もないんだけどこんな感じ これは自作の相対パス生成関数なんだけど なんか新しく出来るっぽいのはVarSetCapacityで空間作ってやる 文字列っぽいのはstr 整数っぽいのはintって感じでやると結構うまくいくよ winapi検索して→PathRelativePathToA(lpszPath, lpszFrom, dwAttrFrom, lpszTo, dwAttrTo)みたいな情報を仕入れていじってみるので勉強中
クリップボード履歴をとりたいです 使えるサンプルスクリプトはどこかにありませんか?
DllCallは構造体入るものは途端に敷居が高くなるよね。
Path関係は Shell Utility API を一通り関数化しておくと大抵何とかなる。
>201でUNICODE版の話題が出る直前に作った ダメ文字対応 SplitPath関数
SplitPath(path, byref OutFileName="", byref OutDir="", byref OutExtension="", byref OutNameNoExt="", byref OutDrive=""){
;URL処理は本家に任せる
If(Instr(path,"://")) {
SplitPath,path,OutFileName,OutDir,OutExtension,OutNameNoExt,OutDrive
return
}
;フォルダパスを除いたファイル名 フォルダパスのみの場合は、空になる
OutFileName := DllCall("SHLWAPI.DLL\PathFindFileNameA", Str,path, Str)
If (RegExMatch(OutFileName,"(?:^|[^\x80-\x9F\xE0-\xFC])\\"))
OutFileName := ""
;フォルダパス(最後の「\」を含まない) ファイル名のみの場合は、空になる。
VarSetCapacity(OutDir,260,0)
DllCall("msvcrt.dll\_mbscpy",UInt,&OutDir,Str,path)
DllCall("SHLWAPI.DLL\PathRemoveFileSpecA", Str, OutDir)
OutDir := RegExReplace(OutDir,"(?<=[^\x80-\x9F\xE0-\xFC])\\$")
;ファイルの拡張子(「.」は含まない)
OutExtension := RegExReplace(DllCall("SHLWAPI.DLL\PathFindExtensionA",Str,path, Str),"^\.")
;拡張子を除いた名前部分を格納する
OutNameNoExt :=RegExReplace(OutFileName,"\..*$")
;ドライブ文字(「:」付き)やネットワーク上のパスのマシン名を格納する
OutDrive:=SubStr(path,2,1)=":" ? SubStr(path,1,2) : SubStr(path,1,2)="\\" ? RegExReplace(path
,"(?<=[^\x80-\x9F\xE0-\xFC])\\.*$","","",-1,3) : ""
}
>>227 このあたりとか?
http://lukewarm.s101.xrea.com/myscripts/Clipboard.zip 管理人さんのコードは定義関連の値を直値で入れてる場合が多くて逆引き解読はけっこう困難
DllCallてWin32 APIとか使わないと出来ないとか、使った方が楽てときに使うものでしょ
toolipsで表示する際に見やすくするため、日本語の全角と半角の混じった文章を、 指定文字数ごとに改行をつけたいのですが、 日本語の2バイト文字の1バイト目が分割点になると文字化けしてしまいます。 そこで末尾が日本語の場合は1バイト増えることを許容するとして、 文字化けが無いように分割するような方法または関数は無いでしょうか。
IsDBCSLeadByte
space & d:: Send, a これでaが入力されずにdになってしまいます 何がいけないのでしょうか?
ちゃんとaが入力されるよ?
>>234 まじかー
どんだけ基本的なものを書いても実行できないんだよね
しかたなくコピペをいじる程度しか出来ない
絶望した!
ちゃんと起動できていないんじゃ・・・
PC持ってないんじゃ…
まさかとは思いますが、この「AutoHotKey」とは、あなたの想像上の存在にすぎないのではないでしょうか。 もしそうだとすれば、あなた自身が統合失調症であることにほぼ間違いないと思います。
>>233 全角文字記号空白が混入している、
改行コードが win,dos 系じゃない
?
解決しました ctrl+Eで編集ではなく、.ahkを編集する必要があったんですね 1年悩みました
1年って、どんだけw
Alt+Ctrl+Spaceを押しながらマウスの左クリックした時のみ、 左ボタンを押し下げた直後に左ボタンを強制的に押し上げた状態にする…ってできませんでしょうか? コミックスタジオというお絵描きソフトで、Alt+Ctrl+Space+左クリック(押し下げ時点)で「キャンパスの縮小」ができるのですが、 先にAltキーを離してから左ボタンを押し上げると「キャンパスの拡大」を併発してしまうというバグがありまして、 それをAHKのお力で回避できないものかと思ってるんですが…
できるよ。面倒だけど。 3キー同時押し+マウスボタンなんてひどいキーアサインだなぁ。 そのキーストロークの発行を別のキーのアサインした方がよっぽど楽だと思う。
>>243 グラフィックソフトではよくあるものなんです
スペースキー押しながらドラッグで「キャンパスの移動」を基準として、
Ctrlつけると拡大、Ctrl+Altで縮小、Alt付けて回転、とか
ほんとは上記の問題も左ボタン押し下げ前にAltを離さないように気をつければ
いいの話なんですが、作業が手馴れてスピードアップしていくとどうしても
頻発してしまうもので…
まずは何をやってみて、どうダメだったのかを書いてみては? まさかとは思うが、何の努力もしないでやり方だけ貼ってくれなんて言ってないよね?
XPからWin7に乗り換えたのだけど、ウインドウ描画をAeroにしたら PixelGetColor で 画面内のRGBカラーを取得するコマンドが、1回当たり30msec位かかるようになってしまった。 ウインドウデザインをClassicにすると、ほぼ0msecで取得できる。AHKのバージョンは1.0.48.03 うちだけの現象かもしれないので、Aero使ってる人いたら下記の検証スクリプトを ClassicとAeroで走らせて、結果を教えてもらえませんか? 以下、動作検証用スクリプト(動作確認済み。走らせると結果がクリップボードに入ります) −−−−− before:=A_Tickcount count=1000 loop,%count% { PixelGetColor, color, 1,1, RGB } after:=A_Tickcount dif:=after-before msg=PixelGetColor %count%回取得テスト OS=%A_OSVersion% 結果=%dif% msec msgbox,%msg%`n`nOKを押すと、結果をクリップボードにコピーします Clipboard=%msg% return −−−−− 当方PCスペック C2Q9550 4GB G45オンボ Aeroは不透明で使っている ウインドウデザインがClassicだとスクリプトは31msecで終わる Aeroだと20秒〜30秒で不定 XPのサブPCは60msec #PixelGetColorをつかって、動画再生ソフトのシークバーがどの位置にあるかを検出していたのだけど、 #これだけ遅いと使い物にならないから別の方法を考えねば・・・。
247 :
242 :2009/11/05(木) 05:15:37 ID:SJ1FY5NTO
すみません、以前作って失敗したスクリプトを再建中に思いついた やり方を試してみたらうまくいってしまいました… ~^!Lbutton:: { GetKeyState, state, Space, P if ( state = "D" ) MouseClick, Left }return 以前は~Lbottunの中で、GetKeyStateでCtrl、Alt、Spaceの押し下げ状態を それぞれバラで取得して、if文で見る…ってやり方やってました お騒がせしてすみません
http://www.autohotkey.net/~Lexikos/AutoHotkey_L/ Revision 36 - November 4, 2009
* Changed: If x.y or similar is immediately followed by an open-bracket ([),
the right-most identifier preceding the bracket is treated as the first parameter of the operation.
For instance, a.b.c[d] is equivalent to ObjGet(a.b,"c",d) and x.y[z]:=v is equivalent to ObjSet(x,"y",z,v).
Previously each sub-expression preceding a bracket was evaluated separately.
* Changed: If a method-call such as x.y() is followed immediately by an assignment,
the parentheses are treated as brackets. For instance, x.y(z):=v is now equivalent to ObjSet(x,"y",z,v).
* Fixed: If(expr) and While(expr) with no delimiting space or comma.
>>166-168 の件はスペース入れなくてもいいようになったみたい。
249 :
名無しさん@お腹いっぱい。 :2009/11/06(金) 21:15:27 ID:ZGdYJVFo0
>>247 そんなわけ分からんキーバインドより
>>144 でアプリ単位でF1からF12,Pause,insert,その他もろもろの
キー単体に動作割り当てしとけよ。
どんなキーアサインにしようが、人の勝手
251 :
名無しさん@お腹いっぱい。 :2009/11/07(土) 08:30:19 ID:Qv+bHEOc0
よくそんな変態キーバインドを無数のアプリごとにつけられるな。ahkファイルも膨大な行なんだろうな。 記憶力がすごいんだね。俺はバカで記憶力もないので簡単なキーバインドにするわ。
もともとの話は、標準のキーバインドの誤爆を回避するためであって、
別に独自に変態仕様にしてるわけじゃないんじゃね
別に
>>249 みたいな考えもあって当然だとは思うけど、既に単純なキーは埋まってるとか、
利用頻度が低いとか、慣れの問題とか、PC、職場環境云々で、人には色々事情があるだろう
何だか勝手に
>>251 みたいな想像する方がよほど気持ち悪いわ
>>251 よく箸みたいなめんどくさいもん使うよなww
フォークとスプーンのが遥かに簡単なのにwww
って言ってるようなもん
254 :
名無しさん@お腹いっぱい。 :2009/11/07(土) 10:19:54 ID:Qv+bHEOc0
いや、単純にahkファイルを分割しないとAutoHotkey.ahkファイルが 長くなりまくってぐちゃぐちゃになるだろ。 分割するならアプリ単位でした方が編集も容易ってだけ。 単独ahkで簡単に編集できますかね? 大量にキー登録してるやつ、苦労してないの?
255 :
名無しさん@お腹いっぱい。 :2009/11/07(土) 10:30:24 ID:Qv+bHEOc0
AutoHotkey.ahkには #IfWinActive ahk_class ● #Include ●.ahk #IfWinNotActive ahk_class ● を書いてくだけなので、すっきりする。 ;GoogleChrome #IfWinActive ahk_class Chrome_WidgetWin_0 #Include GoogleChrome.ahk #IfWinNotActive ahk_class Chrome_WidgetWin_0 とかだけ htmlだってページごとに分割してあるから呼び出しとか編集しやすいんだろ。 巨大な1つのhtmlファイルに全部のHP情報を書いて、更新してるHPサイトないだろ。 いたらすごいがw ティム・バーナース・リーがhtml作ったのも分散させたほうが管理と更新が楽だと思ったから。
>>254 別に苦労しないんだが。長くなってきてもアウトライン使えば良いし
まあそれはそれでスッキリしそうだけど趣味の範囲だと思う
>>255 どうせなら
#IfWinActive ahk_class ●
をIncludeするahkファイルに移動させて
AutoHotkey.ahk には
#Include ●.ahk だけをずらーっと並べてもいいんじゃね
まぁ、好みなんだろうけど
どういう経緯で長いファイルの分割方法の話になったのが理解できないんだけど、
(どうみても勝手に自分で話膨らませてるだけだよね?w)
管理の話をするのなら、自分も
>>257 のようにahk_class何たらの部分もinclude内に含めるかな。
クラス名のような変わりやすい定数は、複数のファイルに分散させない方が良いと思うので。
それから、htmlを作った理由は、もっと別に有意義な目的があったと思うけど…
管理と更新程度の話なら、普通にincludeやライブラリ、makeなどで既に解決されてたし。
>>258 定数で思い出したんだけど
autohotkeyの場合、定数の呼び出しと変数の呼び出しでは
ほかの言語のように実行速度と処理が違うのかな
よくよく読んでみると ID:Qv+bHEOc0 が物凄い勢いで話し曲げてるのか
#IfWinActive サポート以前からAHK使ってるんで今さら整理すんのマンドクサ っつーのは個人的な私見だが、ホント余計なお世話だと思う。 細かくahk分割することが必ずしも有効だとも思わんし 「わけ分からんキーバインド」だってCG系アプリの常識に則ってるって書いてあるじゃん フォトショ等の他のデファクトスタンダードアプリのキーバインドを踏襲してんだろうから 変えたらかえって分かりにくくなるんだろ。
>>144 発見した俺スゲェ天才
って思いきや反応が薄かったので
わざわざ蒸し返してみました
ソース分割の方法なんて好きにするといいよ。それぞれメリットデメリットがある。 #IfWinNotActive, 〜 は不要というか、 #IfWinActive の方がいい。 複雑な条件こそ AutoHotkey_L の #If が有用なんだけどな。 #If WinActive("hogehoge") && GetKeyState("Space") ^!LButton::Send, {Blind}{LButton} とかでいいはず。
少し質問があります。 NetBeansという統合環境のエディタでCtrl+Sを押した時に、 背後に開いているGoogle Chromeを同時に更新しようとしています。 以下のように書いたのですが、一度更新したらChromeを一度アクティブにしないと 更新ができません(以前はできていたような木がするのですが、何故かできなくなってしまいました orz) こういった場合にどのようにしたものでしょうか? ; NetBeans IDE #IfWinActive, NetBeans IDE ahk_class SunAwtFrame $^s:: Send, ^s ControlSend,, {F5}, . ahk_class Chrome_WindowImpl_0 return #IfWinActive
265 :
264 :2009/11/07(土) 16:18:43 ID:4beMFbgn0
Chromeの代わりにFirefoxだと問題ありませんでした。 ControlSend,, {F5}, Firefox ahk_class MozillaUIWindowClass
769 751 sage 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プログラミングに詳しくない人が作ったものですので
そのあたりの不備があればご指摘いただけると助かります
いろんなレベルのヤツが混在してるなw
>>266 こんなソフトありませんかスレでそれ書いたの俺だわww
dat落ちのリンクだってことをすっかり失念してた
上も下も落ちてるんだよなorz
低レベルの奴ですみません 特定のスレッドでのみ、キーの入力間隔を一定時間開けるようにするにはどうすればいいの? SetKeyDelayだとスクリプト全体にかかっちゃうよね 毎行Sleepで間隔開けるしか思いつかないんですが…
Loop, Parse, Var Send, %A_LoopField% Sleep, *** とか
>SetKeyDelay >この設定の基本値は、スクリプトの最初のAutoExecuteセクションで設定する。 >ホットキーなどで新たに起動されたスレッドでは、設定は基本値に設定される。 だから基本値はAutoExecuteで指定して 特定のスレッドのみ送信前にSetKeyDelayし直してやればいいんでない? それか不安だったら save := A_KeyDelay SetKeyDelay, 50 send,hoge SetKeyDelay, %save% てやるとか。
275 :
名無しさん@お腹いっぱい。 :2009/11/08(日) 19:06:39 ID:JUXohyv80
上の方ででているunicode版のautohotkeyを使っているひとはいますか ついにautohotkey_lの機能をそのまま移植したらしいのです 日本語ユーザーにとってはunicode版を使うデメリットってないのでしょうか
他人の作ったスクリプトが、期待した通りに動作しない可能性がある (スクリプトの文字コードの問題、文字列の扱いなど) お節介かもしらんけど、フォーラムの該当POSTを読んだ上でこういう質問をしているのなら、 両者の違いや変更点を正しく認識できていないのだと思う その辺を理解して自分で臨機応変にコードの修正などが出来ると確信するならば、使っても良いとは思うけどね
dllcall の質問です。
autohotkeyのgetkeystate を使わずに win32api のgetkeystate を使って
capslockの状態を取得できるか試しました。
そうしたらcapslockの状態を取得できないのです。
このスクリプトがどこか誤っているならば教えてください。お願いします。
sc03a & f::
;GetKeyState Function ()
;
http://msdn.microsoft.com/en-us/library/ms646301 (VS.85).aspx
; SHORT GetKeyState(
; int nVirtKey
; );
nVirtKey:="0x3A"
msgbox,% DllCall("GetKeyState", "int", nVirtKey)
return
最近AHKを使い始めましたが、
>>9 の症状が起こり困っております。
報告にあるようなソフトは使っておりませんが、Ctrl、Alt、Shiftが時々押しっぱなしになります。
非常に厄介なので、押し下げ状態を感知して押し上げ状態にするような事はAHKスクリプトで
対処できるでしょうか?
今のところ、AHKはキーリマップ、ランチャ程度の使い方しかしていなく、スクリプトなど書いた事が
ないので、対処法がありましたら貼っていただけるとありがたいのですが。。。
>>279 >>9 に書かれているのはあくまで例であって他カスタマイズ系ソフトでも
起こり得る可能性は十分にある。(マウスやキーボード付属の専用ドライバ&ユーティリティを含む)
また、カスタマイズ系では無くても特定のアプリケーション操作時に発生するのであれば
最新Verに更新したり、以前のVerに戻すことで(1〜5つ前のVerに順に戻してみるとか)
改善されることもある。
282 :
279 :2009/11/10(火) 01:04:26 ID:gJzKcghB0
>>280 参考サイトまで書いてくださりありがとうございます。
そのサイトとリファレンスを読みながら奮闘中です。
とりあえず
>>9 のスクリプトを理解することから始めないと。。。
>>281 なるほど。色々な要因がありうると言う事ですね。
マウスやキーボード専用ソフトは入れておりません。
どの状況においても発生するので、他の何か(常駐ソフトなど)が原因かもしれません。
自分の分かるところから調べてみようと思います。
言われて気づいたが俺も
>>9 けっこうしょっちゅう起こってるわ
・窓使いの憂鬱入れてる
・Vista SP2 32bit
・CPU Quad Core Q6600
・Logicoolのマウスではない
・vmwareは入れてない(coLinuxは入れてる)
参考まで
窓使いの憂鬱を入れてたときは結構あったけど、 使うのやめてからは起きなくなったなー。 Logicool は常用してる。
うちのノートじゃ 右Ctrlと左CTrlで挙動が違ってて あれこれ苦労したもんだ
うむ、モディファイキーの〜up downをアサインしたり自分でSendしたりすると、 たいてい右と左の扱いで面倒になることが多い ちゃんと検証すれば法則はあるんだろうけど、面倒だからいつも別の方法に逃げてるなw
永久規制やっと解除。
Unicode版の件。
作成日2009/11/06のバイナリ(SHA-1: 1b7b154deba87b78fea164ca4884f8c7f9170a08)で試行
クリップボードの件は直ってる感じ。
正規表現はちょっと微妙。でも大幅に便利
・ SJIS で 0x5c を含む文字が \ にマッチしなくなっている。
例: RegExMatch("表示", "\\") は False
・ [a-z], [あ-お] などは通る。(文字コード範囲なので [あ-お] だと ぃ,ぅ,ぇ,ぉ もマッチ)
・ 文字クラス( [:alpha:] とか) が通らない。\w, \W, \s, \S, \d, \D などは大丈夫。
・ 名前付き後方参照すると落ちる。今のところ再現性100%。今のところ、名前付きじゃなければ平気。
例: RegExMatch("abcdef", "(?P<hoge>[a-z]+)", $) → 強制終了
>>275 ・ メモリ使用量は確実に増える。
・ 直接メモリいじるヤツは改変が必須
・ Shift_JIS でスクリプトが書けない。
てか、まだバグ出し切ってない感じ。
永久じゃないじゃん
>>287 どうもありがとうございます。
正規表現がより正確につかえるようになりつつあることはわかりました
ただ、名前付き後方参照のその処理はひどいですね
>>288 永久規制という名の規制がここ数日大規模に行われていたんですよ
Parsing Loop について質問させて下さい。 data := "a`nb`nc`n" Loop, Parse, data, `n { data .= A_Index = 2 ? "hogehoge`n" : "" msgbox, % A_LoopField } msgbox, % data 上記例のように、パーシングされる文字列をループ内で更新しても、ループそのものは影響を受けません。 このような変更をループに反映させるにはどのような方法があるでしょうか。
data := "a`nb`nc`n" p := 1 Loop { data .= A_Index = 2 ? "hogehoge`n" : "" if( RegExMatch(data, "m`n)^.*$", a, p)=0 ) { break } MsgBox % a p += StrLen(a) + 1 } MsgBox % data
292 :
290 :2009/11/12(木) 15:15:37 ID:uPPFfRhS0
>>291 すばらしいです。大変参考になりました。
こんな感じでやってみようと思います。
data := "ab`ncd`nef`n"
p := 1
While, RegExMatch(data, "m`n)^.*$", a, p)
{
data .= A_Index = 2 ? "hogehoge`n" : ""
MsgBox, % a
p += StrLen(a) + 1
}
MsgBox, % data
すまん、ものすごい低レベルな質問させてくれ
if A_PriorHotkey = %A_ThisHotkey%
こう書くと真になるのに、カッコ閉じて
if ( A_PriorHotkey = %A_ThisHotkey% )
とすると偽になっちゃうのはなんで?
テンプレの
>>7 では意味同じって書いてあるけどならないんです…
()の中は式として評価される 式の中では%%による変数展開は不要なので、変数名そのままで参照する if ( A_PriorHotkey = A_ThisHotkey )
なるほどなっとく ありがとう できましたー
AHKで作られたNewtonPadというソフトで、 タッチパッドに触れた状態で指定のキーを押す事で マウスのミドルクリックと同じ動作をさせることが出来るようなのですが キープッシュではなく、タッチパッドに触れた状態で左クリックをする事で マウスのミドルクリックを再現することってAHKの技術的に可能なんでしょうか? キーボードだと少し遠いのと、他の機能は特に使わないので 可能ならば自分に合うものを作ってみたいなと思っているのですが
ミドルクリックエミュ自体は可能 でもボタンの入れ替えは操作体系がややこしくなるんで、 思ってたほど使い勝手良くならないのが実状だったりする。 つかキー入れ替えなんて調べればすぐわかるAHKのいろは部分だよ それすら自分で確認できず人に聞いてるような状態で組み込みできるのか? 見た感じNewtonPadのソースは公開されていないみたいだし ThumbRemapあたりを弄ってどうにかする必要があると思うが
298 :
296 :2009/11/14(土) 02:43:43 ID:2lmQfpvK0
>>297 ありがとうございます
1から覚えるつもりでいじくりながらやってみたいと思います
#c:: DetectHiddenWindows,On Process, Close, example.exe return 常駐プログラムをホットキーで停止させるために、上記のような方法を使っているのですが、 この方法だとアイコンが残ったままになってしまいます 消す方法を教えていただけると助かります なお、traycmdと言うソフトを用いて右クリック→終了を自動化する方法は、 一瞬メニューが出てしまい都合が悪いです(フルスクリーン状態だと勝手に画面が切り替わってしまう為) それ以外の方法でお願いします
>>299 強制終了になるからアイコン残ったままになるのかな
WM_CLOSEを投げてやればうまくいかな?
・WinCloseを使う ・終了のショートカットキーを送る ・リソース覗いたりして終了Msg#を調べて、SendMessageする
>>299 トレイアイコンだけでも非表示のウィンドウがあって大抵はそれを閉じてしまえば終了できる。
で、手っ取り早いのが、プロセスに紐付くウィンドウを非表示のものも含め片っ端から閉じてしまう方法。
#c::
DetectHiddenWindows, On
Process, Exist, sample.exe
pid := ErrorLevel
WinGet, list, List, ahk_pid %pid%
Loop, % list
WinClose, % "ahk_id " list%A_Index%
Return
だけど、未保存のデータがあって保存するか、などのダイアログが出るタイプだとうまくいかない。
(新たにダイアログウィンドウがでるため)
うまくいかないなら、アプリ固有の操作で終了させてやる必要があるね。
303 :
名無しさん@お腹いっぱい。 :2009/11/14(土) 21:39:14 ID:Jb0IhbLW0
2ストロークキーについて教えてください。 以下のようなスクリプトを作りました。 ~space:: Input,InputChar,I L1 T2,{Esc},WheelUp,WheelDown if ErrorLevel=Match { if InputChar=WheelUp MouseClick, left, 500, 500 if InputChar=WheelDown Send,l } return spaceキー(down up)の次に、マウスWheelUp、WheelDown以外の信号(キー入力・マウスクリックなど)があった場合、 直ちにInputの呪縛を解除し、入力信号通りの命令を実行したいのですが・・・ 何とかなりますでしょうか? よろしくお願いします。
よくわからんがフラグ立てるか Hotkey ON/OFF でやるほうが楽じゃない?
Input は InputBox で文字入力しているもんだと思った方がいい
a := 条件式 ? b : c ? d : e 上記の三項演算子の式をif文でどう表せるか教えて下さい。
慣れないと分かりづらい罠 If (expression) a := b Else If (c) a := d Else a := e Switch〜Case みたく書いた方が分かりやすい。(※演算子で始まる行は前の行と結合する) a := (式1) ? value1 : (式2) ? value2 : (式3) ? value3 : defaultValue
AHKってNHKとどう違うんですか?
309 :
306 :2009/11/15(日) 09:33:24 ID:tWLAnLzs0
>>307 さん、ありがとうございました。
教えていただいたのを参考にして
>>9 の三項演算子をif文でどう表せるか試しているのですが、動きません。
どこが間違っているか教えて下さい。
if !GetKeyState(A_LoopField)
{
%A_LoopField% := 0
}
else if !%A_LoopField%
{
%A_LoopField% := A_TickCount
}
else
{
%A_LoopField% := %A_LoopField%
}
if (%A_LoopField% && (A_TickCount - %A_LoopField%) > alertDur)
{
alert := "[" A_LoopField ": " (A_TickCount - %A_LoopField%) "ms]"
}
else
{
alert := ""
}
alert := じゃなくて、 alert .= じゃないの あと、三項演算子の構文上必要だから書いている部分は削っても良いとは思う ( %A_LoopField% := %A_LoopField% とか、alert .= "" とか)
311 :
306 :2009/11/15(日) 10:40:57 ID:tWLAnLzs0
alert:=をalert.=置き換えで、動きました。
>>310 さん、ありがとうございました。
キー入力フォーカスが変更された時に任意の関数を呼び出す。
ttp://www.autohotkey.com/forum/viewtopic.php?t=19367 にある wineventhook.dll を
AHKまたはスクリプトのあるフォルダに置いて利用。
FocusHook("HookHandler")
FocusHook(function, hook_dll="wineventhook.dll", event=0x00008005, msg=0x550) {
adhw := A_DetectHiddenWindows
DetectHiddenWindows, On
If IsFunc(function)
&& DllCall("LoadLibrary", "Str", hook_dll)
&& DllCall(hook_dll . "\reghook", "UInt", WinExist("ahk_class AutoHotkey ahk_pid " . DllCall("GetCurrentProcessId","UInt")), "UInt", msg, "UInt", event, "UInt", event, "UInt", 0)
OnMessage(msg, function)
DetectHiddenWindows, %adhw%
}
HookHandler(wParam, lParam) {
global hFocus, focus_info
CoordMode, Tooltip, Screen
SetWinDelay, 0
SetFormat, Integer, Hex
hFocus := hwnd := NumGet(lParam+8, 0, "UInt")
WinGetTitle, Title, A
WinGet, exe, ProcessName, ahk_id %hwnd%
While (hwnd) {
WinGetClass, c, ahk_id %hwnd%
str := ":" . c . str
hwnd := DllCall("GetParent", "UInt", hwnd, "UInt")
}
focus_info = %exe%:%title%%str%
Tooltip, %focus_info%, 0, 0
}
>>312 の補足
・ フォーカス取得にAttachThreadInputを利用しないのでダブルクリックが効かない問題はない。
・ フォーカスが変更されたときの通知なのでタイマー等と違い無駄な処理がない。
AutoHotkey_L と組み合わせれば、コントロールの重なりを窓使いの憂鬱のように扱うことが可能。
#If RegExMatch(focus_info, "SysListView32:Edit$")
Pause::MsgBox, Edit@ListView
#If RegExMatch(focus_info, "ComboBox:Edit$")
Pause::MsgBox, Edit@ComboBox
#If RegExMatch(focus_info, ":Edit$")
Pause::MsgBox, Edit@Other or Normal
例えば,同じ拡張子のtxtでも, txtの前が20091116のような数字の羅列の場合は「秀丸」で, そうでないないら「メモ帳」で開く というようなラッパーのような動作をするahkは既にどこかにあったりしないでしょうか。 メニューが出るようなものは見つけたのですが, メニュー選択は必要としていません。 どうぞよろしくお願いします。
そういうのは自分で作るのが早いし融通も利くよ。
サンプルを拾うまでも無いレベルで作れるから。
数字の羅列を判別したければ、この辺を参考に。
If var is [not] type
http://lukewarm.s101.xrea.com/commands/IfIs.html ファイル名といえば俺は、携帯電話から抜き取る撮影動画ファイルが
いつも同じ名前になって管理が面倒なので、ahkをつかって更新時刻でリネームさせてる。
リネームのついでに携帯電話の専用形式を一般的な形式にトランスコードさせて、
さらについでに、デバイスがUSBで刺されたら勝手にファイルを抜き取って
HDDに保存したのを確認したら、デバイスを取り出す動作まで自動化させた。
AHKってほんと便利だなぁ。
>ラッパーのような動作をするahk ルール決め打ちで作って自分専用で使ってる人はいるんじゃない? でも ファイル名判別のための分岐条件は314の希望とは違うだろうし あるかないかわからないものを探すより自分で書いた方がはやいと思うよ。 設定ルールをiniで指定してどんな条件にも対応可能な汎用的なものなら 無理にAHKで苦労して作らなくても、ポチエスの「名称による関連付け専用版」 があるし。 >メニューが出るようなもの もしこれ ポチエスのこと言ってるんだったら設定でメニュー出ないようにもできるよ。 readme熟読してみ
既製品ならポチエスだわな。ルールが記述がなじめなくて使ってないけど。 ファイル内容をある程度(数行)パースしてから振り分け先を決めるとか、 引数起動できないアプリの窓(無いなら起動して)にドロップをエミュレートするとか、 画像や動画だったら開いているビューワにドロップするとか、 ZIPだったら特定の拡張子がはいっているなら解凍して実行するとか、 変態的なことはやってる。
特定のキーをCtrl+Shiftに置き換えようと思って+^とか+CtrlとかCtrlShiftとかやって奮闘してたんだけど もしかしてただではできない感じ?
アイドルタイムを定期的にクリアするにはどうしたらいいのかしら 動画サイトの長いの見てたりするときにモニタが省電力モードに移るのを キー入力やマウス操作をすることなく阻止したい
>>318 修飾キーとして使いたいならリマップじゃ無理。
例)
Pause::Send, {Ctrl Down}{Shift Down}
Pause Up::Send, {Shift Up}{Ctrl Up}
>>319 タイマーで最前面ウィンドウ監視。
特定のタイトルやクラスで(
>>312 をつかってもいいかも)、
かつアイドル時間が一定値を越えていたら何も起きそうもない{F24}とかを送る。
または、HKEY_CURRENT_USER\Control Panel\PowerCfg\CurrentPowerPolicy を一時的に書き換える。
321 :
名無しさん@お腹いっぱい。 :2009/11/17(火) 08:52:31 ID:vUwgbnqJ0
最近この手の話に興味があって参考にしているのですが bluetooth機器はGlovePIEがなくてもautohotkeyだけで制御できるものなのでしょうか? GlovePIEもスクリプトがあるのですがDLLの使用などを考える場合は autohotkeyのほうがいいのかと思うのですが まだ調べ始めて日が浅いのでよろしくお願いします。
ひとくちにBluetooth機器と言っても色々あるけど、GlovePIEの名が出てきているので、 ジョイスティック(コントローラ)の話だと思って話を進める。 AutoHotkeyでは、ジョイスティックの入力をもとに、マウスやキー入力イベントを発生させることはできるけど、 その逆に、AutoHotkey側からジョイスティックの入力イベントを発生させることはできない。 つまり、ジョイスティックでOSを操作したりする場合には問題ないけど、 ゲームでのマクロのように、ゲームアプリに対して一連のジョイスティックの入力イベントを発行するような用途には使えない。 (AutoHotkeyからGlopePIEのスクリプトを起動すれば出来ないこともないけど) どういう機器を使って何をどう制御したいのかを書けば、もっと具体的な回答が得られると思う
BDリモコン → PC受信 → [XBMC制御] or [PC-OP-RS1で発信] という流れなのかな 確認手順としては以下のような流れだと思うけど、こればかりは自分で確認するしかないのでは。 (1) BDリモコンの入力を全てahkで扱えるか(Joy1〜32とかCtrl+F13〜などで来るなら出来るのだろう) (2) ahkでXBMCを制御できるか(GlovePIEで出来るのならOKなのだと思う) (3) ahkで、PC-OP-RS1制御DLLを使えるか(API自身は簡単に見えるけど、やってみないと分からない)
>>324 了解です。確認してみます
私が妄想していることはautohotkeyで実現できる可能性はあると理解してよいのですよね?
そもそもまだautohotkeyがどのようなソフトか完全に理解できていませんので
ひとつのスクリプトに、流行らせるページの TaskTrayIcon.ahk ProcessMem.ahk SystemMonitor.ahk をIncludeしたらファンクション定義が重複してると怒られた(´・ω・`)
管理人さんのスクリプトはミドルクリックをトリガにしたものが結構多い 一度に複数組み込むなら交通整理が必要
ホットキーじゃなくて関数重複か AllocとRtlMoveMemoryあたりだな
〜ProcessHandleと〜Allocだったかな 適当に整理して一つのahkに纏めた
>>201 のUnicode版を使おうと思ったのですが、起動しません。
Windows7上でexeを叩くと「サンプルスクリプト作るかい?」と出て、Noとすると終了。YesとするとMy documentのアクセス許可が無くて無理、といわれ終了。
管理者として実行、XP互換などやっても起動しませんでした。
WndowsXPの別のPCで起動してみても、一瞬CPU使用率80%くらいまでAHKが持っていって、その直後に終了してしまいます。
本家・ダメ文字版AutohotkeyLともに問題なく動いてるのですが、なにか根本的なインストール方法が悪いのでしょうか。
>>320 ありがとう
F12までしかないキーボード使ってるけど送れるのかな
試してみる
332 :
323 :2009/11/17(火) 15:50:15 ID:vUwgbnqJ0
>>330 スクリプトのパス渡さないと何もせずに終了する。スクリプト渡すと動く@XP SP3 32bit
>>331 キーボードになくても平気
>>332 APIリファレンスの通りだよ。バッファ確保してそのポインタ(メモリ上のアドレス)を渡す。
(以下は
>>7 Q6 で)
#NoEnv
dll = pc-op-rs1-control.dll
hModule := DllCall("LoadLibrary", "Str", dll)
If !(hModule) {
MsgBox, %dll% のロードに失敗
ExitApp
}
VarSetCapacity(pMajVar, 4, 0x00) ; バッファ確保
VarSetCapacity(pMinVer, 4, 0x00)
If (DllCall(dll . "\GetModuleVersion", "UInt", &pMajVar, "UInt", &pMinVer, "Int") == 0) { ; 0:PCOPRS1CONTROL_RET_OK
MejVer := NumGet(pMajVar, 0, "UInt")
MinVer := NumGet(pMinVer, 0, "UInt")
MsgBox, , %Dll% のバージョン情報, Major Version%A_Tab%%MejVer%`nMinor Version%A_Tab%%MinVer%
} else {
MsgBox, バージョン取得失敗
}
334 :
323 :2009/11/17(火) 17:56:21 ID:vUwgbnqJ0
>>333 ありがとうございます。
できました。
全部できたらまとめてみます
以前慣性スクロールの話があったので作ってみました。 連続でホイール回すと加速して慣性が働きます ~WheelUp:: ~WheelDown:: If(A_PriorHotkey=A_ThisHotKey && A_TimeSincePriorHotkey<100) ;大きくすると感度が上がる buf++ Else buf=0 SetTimer,Slip,30 Return Slip: If(buf>1) { StringTrimLeft,Key,A_PriorHotkey,1 Send,{%key% %buf%} buf-=0.2 ;小さくするとホイール加速と慣性増加。0.4くらいがちょうど良いかも } Else SetTimer,Slip,Off Return
336 :
名無しさん@お腹いっぱい。 :2009/11/18(水) 01:05:41 ID:UfZDh6jC0
>>314 便乗ですが、
メモ帳トラッパー
のようなものをAutoHotkeyで実現するにはどうしたらいいですか?
コマンドライン引数を解釈して、適宜振り分けしろとしか言えんなぁ 引数の文字列だけみるのなら AutoHotkey である理由はあまりないけど
あ、振り分けは要らんのか。 なら、貰った引数を他のアプリにそのまま引き渡すように書いてコンパイル。 アプリの指定はスクリプトに直に書いたり、INIやレジストリから読んだりする。
>>335 ホイール加速スクリプトを自作して使ってたけど、
それに替えてみたらものすごく調子が良くなった
自分のはタイマーを使ってなかったから、
大量にキーを送ると逆スクロールしたりしてたよw
載せてくれてありがとう
340 :
名無しさん@お腹いっぱい。 :2009/11/18(水) 02:37:42 ID:UfZDh6jC0
>>337 ありがとうございます。
ahkはexeにしてテキストファイルに関連付けするのでしょうか?
AutoHotkey.iniに書いてnotepad.exeが呼ばれたということを監視して,
それを違うエディタにすり替えるということは難しいでしょうか。
341 :
名無しさん@お腹いっぱい。 :2009/11/18(水) 02:44:21 ID:5bLsGb7l0
k
>>340 メモ帳トラッパーもnotepad.exeをすり替えてるだけみたいだけど?
コンパイルするよりArghelperを使うほうが楽 問題はノートパッドがシステムで保護されてるので セーフモードで置き換えないととか言う話だった希ガス ノートパッドの出現を監視して タイトルバーなりDLLCALLなりからファイルパス引っ張ってきて 即座にノートパッドはクローズして他のエディタで開くってな スクリプトなら出来そうだが
XP移行はシステムファイル保護の対象だから置き換えは厳しいよ。 起動監視はできる。COM で WMI をごにょごにょすりゃいい。 ただAHKでやるのはかなり面倒。 ぶっちゃけ関連付け変えた方がいいとおもう。
>>333 ありがとう、Unicode版動きました。
でも、現状では「つかえねー」の一言。
Msgbox,Answer is あいうえお
という命令の結果が「Answer is ??????????」
変数名に日本語使えなくなってるし、全然ダメじゃん。
フォーラムに要望出してくるか。
autohotkeyでFFolderと同じ動作って実現可能でしょうか? 最近64bitのOSに変えて使えなくて困ってます。
>>345 CP932をUTF8として読むとそうなる
何でそうなるかは注意書きを読んでないから
>>346 コマンドいくつかの組み合わせで出来るか?というならば、No
ガリガリ頑張ってやって最終的にできるかと言われれば、おそらく Yes
ダブルクリック検知して、マウスが今どこにいるかで適宜処理分岐ってのを書く
SmartResiseってのは苦行・荒行になりそうな感じ
入れてないけど多分このあたりかね >287 >・ Shift_JIS でスクリプトが書けない。 ていうか 345は>275-276あたり読んで出直してこい 自力でインスコもできない上、すぐ「つかえねー」とか安易に結論出す奴は テスト版さわんなよ
349 :
名無しさん@お腹いっぱい。 :2009/11/18(水) 16:31:10 ID:o+zRHPa80
基本的なことをお聞きします。 文字列のHEX値をバイナリに変換して変数に入れる命令はありますか? 逆にバイナリを文字列のHEX値にすることはできますか? よろしくお願いします。
両方できる。 AHKは変数は文字列型のみと思っていい。 値の文字列が数値を表したものなら、10進/16進に関わらず数、値計算のときは数値として扱われる。 計算結果の数値も、変数に格納される場合は文字列に変換される で、変数に格納される時に10進/16進のどっちに変換するかをしていするコマンドが SetFormat。 ; 文字列として格納される a = 0x1234 MsgBox, %a% ; 計算結果を再代入することで指定形式になる ; 未指定の場合はデフォルトで10進表記 a += 0 MsgBox, %a% ; 16進数にする場合はコマンドで切り替える SetFormat, Integer, Hex a += 0 MsgBox, %a%
ttp://www.autohotkey.net/~Lexikos/AutoHotkey_L/ Revision 37 - November 7, 2009
* Added: Support for obj[method_name](params) object-call syntax.
Revision 38 - November 17, 2009
* Added: #MenuMaskKey directive to change which key is used to mask Alt/Win keyup events.
See this thread for background information.
* Changed: If x[1,2]:=3 creates an object for x[1], it's base is no longer automatically set to x.base.
See the documentation for a method of controlling this behaviour.
#MenuMaskKey は
「通常、Alt と Win みたくキー押下時は何も起こらないけど、押下解除時にメニューがアクティブになる。
AHKのホットキー機能では押下解除時にCtrlを送ることでこれを隠蔽している。
このCtrlを送ることが一部のアプリではウマくないらしいので、キーを変更できるようにしたぜ。」
とのこと。
>>351 え?それってもしかして「かな」キーを押し上げたときに
なぜか挿入されてしまう ctrl をスクリプトの初期設定で
修正できるということですか?
そんなことあんの? これで発行する Ctrl はキー棋歴にでるけど、ひらがな(vkF2sc070)だと出ないよ。 Alt と Win で確認する方法は↓ #UseHook #Space:: !Space:: KeyWait, LWin KeyWait, RWin KeyWait, Alt KeyHistory return
以前このスレで、既定のサウンドデバイスを変更するスクリプトを見かけた気がするのですが、もしどなたか持っていたら張ってもらえないでしょうか
これVista 7 のサウンドデバイスでも使えるかな?
>>355 おお、過去スレでこんな便利なスクリプトを書いてくれた人がいたのか。
BTヘッドホンとスピーカを毎回切り替えるのが面倒で、ジャストタイミングだ。
>>356 Win7Ult32bitで、とりあえず取得は動いた。
ただ、文字化け&右端が切れてる。正常時の動作がどうなるのかを
まだ把握して無いけど、動きそうな予感
SoundDevice_GetDeviceList("wave","out")
結果
> Xs[J[ (2- High Definition
> fW^ I[fBI (S/PDIF) (2
> Bluetooth Audio Renderer (Bluet
> Bluetooth Hands-free Audio (Blu
>>350 ほーAHKってかわった発想をするんですね
ありがとうございます。
awk と同じ
無変換キーに、「-」 Shift+無変換キーに、「無変換」 を割り当てたいのだけど vk1Csc079:: - +vk1Csc079:: vk1Csc079 としてみても、Shift+無変換で「=」になってしまうのですが どう割り当てればいいのでしょうか?
補足すると、
>>3 の Q6 も関係する
そのスクリプトだと、[Shift] + [無変換] を押した時、[無変換] を発行。
それを更にAHKが拾って、押下中のシフトを加味して [Shift] + [-] を発行するから。
ありがとうございました。両方ともキーを送るようにすることで思い通りに動かす事が出来ました。 あとなぜか何度も無変換と書きましたが変換キーの間違いでした・・・
364 :
名無しさん@お腹いっぱい。 :2009/11/20(金) 10:16:04 ID:4p8pkoxp0
変数の中にキーの文字列が入っていて eval関数のようなもので実行して割り当てるようなことはできますか?
コマンドのHotkeyで可
>>365 おんぶにだっこで申し訳ありません
Hotkeyコマンドを使う場合ラベルを使用しないといけないようなのですが
処理も動的に自動生成して変更したいと思っています。
できればラベルでなく直接命令を書く方法か
関数に引数を渡す方法があればよいのですが
そういったことはできませんか
ファイルにコード掃き出してRunするとか 一応フォーラムにも動的実行のライブラリがいくつかあるので、探してみてはいかが (かなり使い方が限定されるだろうけど)
369 :
名無しさん@お腹いっぱい。 :2009/11/20(金) 20:35:56 ID:wChuSKGP0
k
>>367 何を以て動的処理といってるか知らんけど、
AHKでは全てのホットキー処理は(::で定義するモノも含めて)全てサブルーチンだよ。
直接命令をかくとか関数とか書いてるけど、
処理開始のトリガで行う処理の塊(サブルーチンラベルからReturnまで)が
どこかを明示しなきゃ逝けなんだから。
予め定義した処理をいくつかサブルーチンとして定義しておいて、
何らかの判断でHotkeyコマンドで切り替えるなり、
処理分岐の専用のサブルーチンをHotkeyコマンドで割り当てておいて、
実体しょりは定義済みサブルーチンに飛ばすとか、
いくらでもやりようがあると思う。
あと、書き捨ての短いスクリプトを一時的に実行したいなら
>>2 のACConsole(or類似品)を使うといいよ。
で、有用だなとおもったらメインスクリプトに昇格させて、
適当なサブルーチンで貼り付けて動的にラベル呼び出しすればいい。
; 任意のホットキーに任意のサブルーチンを割り当て(割り当て対象は1つ) ; ComboBoxにサブルーチン名をキー入力すれば定義済みの任意の処理を割り当てられる Menu, Tray, Add Menu, Tray, Add, Hotkey Config, GuiSHow Gui, Add, Hotkey, vKey Gui, Add, ComboBox, vSubName, Sub1||Sub2|Sub3 Gui, Add, Button,, OK GuiShow: Gui, Show Return ButtonOK: Gui, Submit If (Key && KeyAssigned && Key!=KeyAssigned) Hotkey, %KeyAssigned%, Off If (Key) { Hotkey, %Key%, %SubName%, UseErrorLevel If (ErrorLevel) MsgBox,,割り当て失敗, エラーコード:%ErrorLevel% Else KeyAssigned:=Key, SubAssigned:=SubName } Return Sub1: Sub2: Sub3: MsgBox, ホットキー "%A_ThisHotkey%" で 処理 "%A_ThisLabel%"を実行 Return
>>370 >あと、書き捨ての短いスクリプトを一時的に実行したいなら
>>2 のACConsole(or類似品)を使うといいよ。
>The topic or post you requested does not exist
oh...
373 :
367 :2009/11/21(土) 09:01:49 ID:t89Jr1em0
>>368-371 ん〜なかなか
ラベルの飛んだ先でA_ThisHotkeyかA_ThisLabelを利用して
分岐するようなものを考えてみます。
同じ処理で渡したいパラメータがたくさん(100個くらい)でてきそうなので
それだけキーを割り当てをする記述は避けたいと思っています
できればループ処理でパラメータだけ代えれるようなものを考えたいです。
とりあえず固定ラベルに飛んでから、%FuncName%() したらいいんじゃね? Sub1: Sub2: Sub3: %A_ThisLabel%(A_ThisHotkey) Return とか
375 :
367 :2009/11/21(土) 14:57:20 ID:t89Jr1em0
こんな感じにしてみました。 #a = 000 #b = 111 Keys = #a,#b StringSplit, KeyArray, Keys, `, Loop, %KeyArray0% { Hotkey,% KeyArray%a_index%, MyLabel } return MyLabel: MsgBox,% %A_ThisHotkey% return しかしよくよく考えるとこの方法で 100個もホットキーって用意できないですよね キー3つはだめなようですし
モディファイアキー付ければいくらでもできるでしょ というか、適切なアドバイスを得たいなら、本来やりたい事をもっと具体的に書いた方が良いと思う 山ほど動的にキーマクロを定義・生成したいとかそんな感じなのかね
>>375 lexikos版の#if使ったほうがいいかもしれん
2つ質問です。 1つ目 >123に Loop, % list の様に、変数を%で囲んでない物と囲んでいる物があるのですが、理由と使い分け方を教えて下さい。 2つ目 AHKのウインドウで変数をみた時の [1 of 3] 等の数字の意味を教えて下さい。
Loop, % list AutoHotkeyは % 以降(行末まで)を式として扱うので、 %で囲まなくてもその変数(List)を参照する。 a = 1 b = 2 c := a + b d = % a + b msgbox, c = %c%`nd = %d% AutoHoekey Help の ListVars からのコピペ Each line in the list consists of: 1) The name of the variable. 2) The length of the variable's contents and the variable's capacity. For example: [50 of 63] 3) The first 60 characters of the variable's contents. エキサイトさんによる上記の翻訳 リストの各線は以下から成ります。 1) 変数の名前。 2) 変数のコンテンツと変数の容量の長さ。 例えば: 63の50 3) 変数のコンテンツの最初の60のキャラクタ。
ありがとうございます。 解説の式の所に書いてあるんですね。 書いてもらった例が分かり易かったんで納得しました。
以前autohotkeyスレで拾ったime操作のスクリプトがうまく動きません ime_funk.ahkというものです。 skkimeで半角英数やひらがなに切り替えたいのですが、うんともすんともいいません そもそも状態を取得できないようです skkimeのソースに入っている ddskimic\btmncmode.cpp にて それらの状態を保持している変数が宣言されていることはわかりました これをもとにして上のことをautohotkeyで成功させるにはどうすればいいのでしょうか
382 :
290 :2009/11/22(日) 02:38:08 ID:iFRQw8Wx0
>>381 これ動きますか?
#1:: Ime(1) ; Win + 1 で On
#2:: Ime(0) ; Win = 2 で Off
Ime(value)
{
DetectHiddenWindows, On
SendMessage, 0x283,0x006, value,, % "ahk_id "DllCall("imm32\ImmGetDefaultIMEWnd", UInt, WinActive("A"), UInt)
DetectHiddenWindows, Off
}
>>381 ウチの環境(XP SP3 SP3, SMMIME1.5)ではWM_IME_CONTROL(0x283)で制御、取得できているから
呼び方の問題なのでは。
どのime_funck.ahkなのか分からないけど、ウィンドウタイトルを引数に渡す関数のやつなら、
問答無用でアクティブウィンドウ("A")を指定してやればいいかも
Unicode版いい感じに進んでるなぁ。良さげな更新を抜粋。 [Tue, 10 Nov 2009 05:34:38 +0000] - Changed: "Transform, HTML" now take an addtitional parameter to decide how to convert the non-ASCII chararters. [Fri, 13 Nov 2009 02:01:25 +0000] - Added: Abstract IO layer for reading and writing text is constructed, the files without BOM is read with system code page. This layer may also be used in compiled scripts. [Sun, 15 Nov 2009 13:49:51 +0000] - Added: Advanced file IO supports. (experimental) [Mon, 16 Nov 2009 07:27:12 +0000] - Fixed: RegEx named subpatterns. [Mon, 16 Nov 2009 09:02:42 +0000] - Added: Comments of class TextFile. [Tue, 17 Nov 2009 02:30:48 +0000] - Added: New command FileEncoding to set default file encoding. - Fixed: RegEx sub-patterns. - Changed: A_EventInfo is available in RegEx callouts, but the users must be noted that the offsets are not converted. [Wed, 18 Nov 2009 15:02:33 +0000] - Changed: "SetFormat, Integer" can now format hex numbers in uppercase letters. (H and h are different) - Changed: Added a workaround for "WindowsForms10.SysListView32". (reported by Sean) [Fri, 20 Nov 2009 14:18:14 +0000] - Fixed: Try to send Unicode characters by SendInput(). [Sat, 21 Nov 2009 15:16:58 +0000] - Added: Use VarSetCapacity(var, -2) to update the internal length of "var" which contains ANSI string.
誰か言語仕様一から見直してくれねえかなーマジで・・・
一から変えてもいいけど、ユーザは減ると思うな。 それに、俺は慣れてしまったw あと、関数とかオブジェクトバリバリだと、他の言語を知らない人はかなり苦労すると思う。
質問します。 キャプションバーのマウス中クリックで、ウインドウの最小化をしたいのですが、 以下のようなコードでは左側のサブモニタで正しく動作しません。 Firefoxではどこでクリックしても最小化したり、他のウインドウでは最小化すらされません。 修正したいのですがどのようにしたものでしょうか? ; push middle button on title bar, then minimize window ~MButton:: CoordMode, Mouse, Screen MouseGetPos,x,y,hwnd SendMessage, 0x84, 0, x|y<<16,, ahk_id %hwnd% ; WM_NCHITTEST If (ErrorLevel==2) ; HC_CAPTION ; ShowSplashText(x) PostMessage, 0x112, 0xF020,,, ahk_id %hwnd% ; WM_SYSCOMMAND / SC_MINIMIZE Return
389 :
388 :2009/11/22(日) 13:40:23 ID:vIbnTNjg0
なんか、サブディスプレイ側だとx座標がマイナスになるけど、 x | y <<16 で負の符号が消えるせいかもしれない。xを16bit int にすることってできないんでしょうか?
SendMessageの前に以下の2行を追加、でいけるかな。 x += x < 0 ? 0xFFFF : 0 y += y < 0 ? 0xFFFF : 0
392 :
388 :2009/11/22(日) 14:21:31 ID:vIbnTNjg0
POINT構造体を意識したら上手く行きました!!お騒がせしました。ありがとうございました。 ; push middle button on title bar, then minimize window ~MButton:: CoordMode, Mouse, Screen MouseGetPos,x,y,hwnd VarSetCapacity(point,4) NumPut(x, point, 0, "Short") NumPut(y, point, 2, "Short") SendMessage, 0x84, 0, NumGet(point, 0, "UInt"),, ahk_id %hwnd% ; WM_NCHITTEST ;ShowSplashText(NumGet(point, 0, "UInt")) ;ShowSplashText(x . ", ". y) ; ShowSplashText(NumGet(point, 0, "Short") . ", " . NumGet(point, 2, "Short")) If (ErrorLevel==2) ; HC_CAPTION ; ShowSplashText("Minimize!") PostMessage, 0x112, 0xF020,,, ahk_id %hwnd% ; WM_SYSCOMMAND / SC_MINIMIZE Return
393 :
388 :2009/11/22(日) 14:25:13 ID:vIbnTNjg0
ついでなのですが、
>>390 はどういう意味合いなんでしょうか?
正の時はそのままで、負の時は32bit全部立っているのを足す?うーん?
ああやっとわかった。16bitの負の符号のbitを立てるってことかw 俺頭悪いなー
>>384 >- Fixed: RegEx sub-patterns.
上の方で出ていた正規表現がらみのバグがつぶされたのかな
そうだとしたらかなりよさげ
>>382 ありがとうございます。
環境をきちんと書いていませんでした。
skkime 1.5 最新版を vista sp2 32bit で使っています。
そのスクリプトでは skkime のon/off をうまく操作できませんでした
skkime とともに入れているatok 2009 でそのスクリプトを動かしたら、
atok 2009 ならon/off を切り替えれることがわかりました
>>383 xp で問題ないのであれば、vista の環境に依存する問題ですかね
398 :
397 :2009/11/23(月) 01:27:56 ID:Si0ROsa40
追記です 試したime_func.ahkは AutoHotkeyを流行らせるページのアップローダの 029.zip に入ってます
>>396 ちょっと試したけど直ってる。サブマッチ名に日本語つかってもきっちり怒ってくれた。
MsgBox, % RegExMatch("abcdef1234", "(?P<ほげ>[a-z]+)", $) ? $ : ErrorLevel
→ 「Compile error 42 at offset 4: syntax error in subpattern name (missing terminator)」
----
bregexp.dll(正規表現), shlwapi.dll(パス操作), msvcrt.dll(マルチバイト文字列操作), nkf32.dll(文字コード変換)
等はもう使わなくていいようになるのも近いなぁ。
でも、JIS(CP50220), EUC-JP(CP51932) は読み込みはOKだけど、書き込みはうまくいかないなぁ…
以下のスクリプトで、out.txt が0バイト。無い時は作られるし、CP932だと正常出力される。
SetWorkingDir, %A_ScriptDir%
FileEncoding, CP50220 ; JIS
FileRead, str, test.eml
MsgBox, % str
FileEncoding, CP51932 ; EUC-JP
FileAppend, %str%, out.txt
まともにつかえるようになるのは、もうちょいだな。
>>397 ime_func.ahkの名称がついてるのはかなり古いものだと思います
といってもやってることは >382 と同じなのでそれでダメならちょっとわからないですね。
SKKIMEはアンインストールしてしまったので今検証できませんが
XPでは動いていたと思います。
---
基本は変わらないですが、一応新しいののリンク貼っときますね。
IME.ahk (2009.07.02)
・hogeさんとこの IME_IsConverting() 入れ込み
・ソース整理、DetectHiddenWindowsのOn/Off廃止
http://www6.atwiki.jp/eamat/pub/MyScript/IME_20090703.zip
401 :
名無しさん@お腹いっぱい。 :2009/11/23(月) 21:29:35 ID:tMcdP+HH0
AHKのポップアップメニューを出すときに、ポップアップメニューがアクティブになってしまうのですが 下のウィンドウからアクティブ状態を奪わないで表示することって出来ないのでしょうか? エクスプローラでファイル名を変更中にポップアップメニューを出した場合に 名前の変更をそのまま続けたままの状態にしたいのですが
無理じゃないのかなぁ ちなみにアクティブ状態もキーフォーカスも元ウィンドウのままなはずだけど (キーだけは奪う) メニュー出しながら名前を変える意味がよく分からないけど、 右クリすると画像のサムネイルがでる拡張でもいれてんのかね
gui使ってメニュー代わりのウィンドウを表示するしかないのかな
405 :
367 :2009/11/24(火) 15:17:40 ID:C1ieN64O0
>>376 激しく遅レスすみません
>>323 をしようとしています。
すでにPC-OP-RS1の制御はできるところまで来ています。
家電の赤外線も大量に調べました。
現在使いたいホットキーの数は155です。
エクセルで整理中ですが使用できるホットキー一覧のようなものってありませんでしょうか
406 :
405 :2009/11/24(火) 16:47:10 ID:C1ieN64O0
とりあえずHotKeyDefineちゃんというのを使って調べてみます。 足りるかな
>>323 =
>>367 なのか。何で
>>367 でそう書かないかないんだろ?
キー一覧は
http://lukewarm.s101.xrea.com/KeyList.html キートップが155あるわけじゃないだろうから、
もし機器切り替えボタンとか設置するなら、AutoHoekey_L 使うほうが圧倒的に楽。
機器が5個。^F13〜^F17を割り付けたボタンを機器切り替え、HogeFunc()が制御要の関数だと仮定。
DeviceId = 1
^F13::DeviceId:=1
; (中略)
^F17::DeviceId:=5
#If (DeviceId = 1) ; デバイス1用の割り当て
^F18::HogeFunc(param1, param2, param3, ・・・・)
^F19::HogeFunc(param1, param2, param3, ・・・・)
^F20::HogeFunc(param1, param2, param3, ・・・・)
#If (DeviceId = 2)
; (中略)
#If (DeviceId = 5)
^F18::HogeFunc(param1, param2, param3, ・・・・)
^F19::HogeFunc(param1, param2, param3, ・・・・)
^F20::HogeFunc(param1, param2, param3, ・・・・)
>>407 ありがとうございます。
AutoHoekey自体、まだ慣れていないもので
AutoHoekey_Lというのがあるのを知りませんでした。
GlovePIEのほうだけで機器モード切換をしようと考えていましたが
AutoHoekey_Lを使えばさらに実用的になりそうですね
>>400 ありがとうございます。
xpで確認したら、きちんと動作しました。
早速それを使わせていただきます。
うまく動かなかったのはやっぱりvistaのせいだと思います。
AutoHoekey_L #if を使ってキー割り当てを動的に変更したかったんだけど それをアプリ毎に適応する方法が分からなくてずっと悩んでたんだが 英文だから忌避してたリファレンス読んでやっと分かったよ・・・ #If WinActive("ahk_class xxx") and (xxxflag = 1) XButton1::Ctrl XButton2::Shift #If WinActive("ahk_class xxx") and (xxxflag = 2) XButton1::1 XButton2::Alt みたいに書けばアプリ毎に条件つきでショートカット切り替えられたんだね こんな独り言残しとけば誰かの役に立つんだろうか
windowsキーを押すためにはどうしたらいいんでしょうか? ^z::# ^z::{LWIN} もだめでした
訂正 ^z::Send, # ^z::Send, {LWIN}
^z::Send, {Ctrl Up}{LWin}{Ctrl Down}
>>415 ありがとうございます。できましたが
なぜそのような指定になるのでしょうか?
Winキーだけですか?
正直よく分からんw
Ctrl押下解除を待てば動くんで
>>415 みたくしたんだけど、
^z::
KeyWait, Ctrl
Send, {LWin}
Return
↓が動かない。不思議。
^z::
Send, {Ctrl Up}
Send, {LWin}
Send, {Ctrl Down}
Return
YYYYMMDD形式の日付で、その日付の曜日を調べるにはどうしたらいいでしょうか。 A_WDayは今現在の曜日を調べられますが、これと逆のことがやりたいです。
× これと逆のこと ○ 任意の日付を与えて、その日の曜日を調べたい 自己レスです。
Date := "20091127" FormatTime DayOfWeek, %Date%, WDay
Unicode版の件 [Thu, 26 Nov 2009 09:51:33 +0000] - Added: Find the library in the sub-directory "Lib" of the directory contains the main script (A_ScriptDir). これいいなぁ、便利だ。 "Lib"サブフォルダにある関数ライブラリスクリプトの自動検索機能。 拾ったライブラリを"Lib"フォルダにぶち込めばいいだけなんでかなり楽。 以下の構成で、"test.ahk" を実行すれば自動で関数 "Hoge_fuga()" 探して "Hoge.ahk" をインクルードしてくれる。 + [A_ScriptDir] + test.ahk +[Lib] + Hoge.ahk ----- test. ahk ----- Hoge_fuga() ------------------ ----- Hoge.ahk ----- Hoge_fuga() { MsgBox, %A_LineFile% } ------------------
>>423 これって通常バージョンにも無かったっけ?
「%A_MyDocuments%\AutoHotkey\lib」 か 「{AutoHotkey.exeのフォルダ}\lib」 のものだけが対象。
Lib\_作りかけ や Lib\_NotUse とかのサブフォルダ掘ってる身としては困るがな(;´Д`) 個人的にはIncludeは明示的にやりたい派 自動Includeよりディレクトリパスを省略できるLIBフォルダが欲しい。 cの #include <hoge.h> みたいなの それか #Include %ScriptDir%\Hoge.ahk ってやったら LIB\Hoge.ahk は無視してくれるとかl。 先に見つかった方を優先してDuplicationエラーにしないとか。 汎用関数含んだスクリプトを 配布するときいつも面倒臭い
あなんか勘違いしてた。 >426のLIB以下のサブフォルダ、じゃなくて %A_ScriptDir%\Lib の自動検索機能なのか。 Duplicationエラーさえおこらなきゃ配布時の問題は解決できそうだね
だよなぁ。>配布時に面倒 俺は配布物を配るとき、コンパイルしたあとに自分で逆コンパイルしてみて、 Libフォルダの中のどれがインクルードされてるのか、毎回確認してる。 やべぇこれは恥ずかしい・・・と思うようなコードが含まれていたら、 それをはずす作業で別コードを作ってるうちに疲れて公開を挫折する。 最初から配布しても恥ずかしく無いレベルに仕上げておけば問題ないのだろうけどね。 性格的にムリだ
検索順序は↓の通りなんで、ごちゃ混ぜのライブラリじゃなきゃ重複は起きにくいと思う。 (本家 及び lexikos版は (2),(3)のみ) (1) %A_ScriptDir%\Lib (2) %A_MyDocuments%\AutoHotkey\lib (3) {AutoHotkey.exeのフォルダ}\lib
>>430 これなら通常の用途でもautohotkeyのunicode版を使う価値がありそうだね
それにしてもこのスレではunicode版やlexikos版の情報が早くて
とても参考になるわ
コマンドプロンプトの画面で入力するときに IMEのon/offを知りたいのですが どうすれば取得出来ますか? 何かライブラリはあるでしょうか。
1KB程度の短いテキストファイルを読んだ後、重複読み込みを防止するためにファイルを 削除したいのですが、下記のように、微妙なタイミングで挙動が異なります。 これだと変数に代入されず、期待した動作にならない file=C:\test.txt fileread,ret_data,%file% filedelete,%file% あいだにウエイトを入れると OK になる file=C:\test.txt fileread,ret_data,%file% sleep,1000 filedelete,%file% sleep,1000 で、とりあえず動いていますが、 万が一高負荷で読み取れなかったりしたら困るので、 もうすこし確実に動作させる方法を知りたいです。 ファイルを読んで、変数として読み込まれたことを確認した後で削除するには、 どう書くのがよいでしょうか。
file=C:\test.txt fileread,ret_data,%file% IfEqual, Errorlevel, 0, filedelete,%file%
>>434 ありがとうございます・・・が!読めなかった原因は別にあったことが判明しました。
test.txtに格納された内容の文字コードがUnicodeのときに、
結果が正しく読み取れない状態になる、というオチでした。
エディタがUnicode対応で自動で変換して表示していたおかげで、
テストメッセージの内容を差し替えるまでまったく気づきませんでした。
これもUnicode版のリリースとともに、意識しないですむようになるのかな。
まだ開発版だけど、現状でも動くよ。 ただし、文字エンコードを明示しないと駄目。 SetWorkingDir, %A_ScriptDir% FileEncoding, UTF-16 ; コマンドで扱うコードを明示 FileRead, data, data.txt MsgBox, % data
sciteのフォントが全然変わらないんだけど、どうして?これではダメなの?デフォは小さすぎて目が痛くなります。 code.page=932 character.set=128 if PLAT_WIN ffont.base=font:MS ゴシック,size:18 font.small=font:MS ゴシック,size:18 font.comment=font:MS ゴシック,size:18 font.code.comment.box=$(font.comment) font.code.comment.line=$(font.comment) font.code.comment.doc=$(font.comment) font.text=font:MS ゴシック,size:18 font.text.comment=font:MS ゴシック,size:18 font.embedded.base=font:MS ゴシック,size18 font.embedded.comment=font:MS ゴシック,size:18 font.monospace=font:MS ゴシック,size:18 font.vbs=font:Lucida Sans Unicode,size:18
唐突になにいってんの? 変数定義しただけで、いったいなにがやりたいんだか・・・
>>439 で、そのリンク先のソフトとAHKとで、何の関係があるんだ?
関連は無くはないだろうけど、誰もがつかってるわけじゃない。 きちんとネタ振りしないと。 データ定義だけ見せられても、エスパースレでもこれじゃ無理だよ。
アナタは知らなくても、他の誰かが知っていることもあるんだし、即レスで否定しないでも、
しばらく待って、誰もコメントできない状態になってから、そのようにアドバイスすればいい話
それじゃ、無知を晒してるだけだよ。
ところで、話題はsciteに戻るんだけど、
sciteって、
>>437 みたいな定義を設定ファイルに書くんだよね。
if PLAT_WINの下の行が ffont になってるからじゃない?
>>ffont.base=font:MS ゴシック,size:18
^^^^^^
それでもダメなら、その設定を貼り付けている設定ファイル(通常はGlobal Optionだと思うけど)、貼り付ける場所が間違っているとか。
先頭に貼り付けても、後続の設定で上書きされちゃうから、
既存の設定を消去するか、もしくは最後に貼り付けないとダメ。
SciTEスレでも立ててそっちでやりなよ AHKのみに関連する話題でもないし、ここでやるには無駄が多すぎる
日本じゃマイナーでスレも無いし、フォーラムでscite for ahk(
>>442 )配布してるんだから、少しくらい大目にみてくれよw
あなた方が無駄にレスしなきゃ、数レスで終わるんだし
だからこそ話題があるならスレを立てとけば、あとから試す奴が助かるじゃないか このスレでやって流れたらそれで終わり、無駄過ぎる
淡々と答えだけ書けばいいのに
>>439 ahk.style.properties
の
# Base (background, base font) を
サイズ指定こみで変更してみて下さい。
どうやらこっちのプロパティファイルが優先されるみたいです。
>>447 別スレでやれという指摘はごもっともだと思います。
大切なスレを汚してしまい大変申し訳ありませんでした。
これで終了とさせてください。
ですが、最後に
>>448 さんにだけ一言。
あなたが
>>443 で排他的な態度を取らなかったならば、私も答だけを書いていたと思います。
「淡々と答だけを」という点では、お互い様です。 あなたにだけは言われたくありませんでしたね。
何を憤っているか知らんけど、質問内容が唐突すぎないようにしろよって書いただけじゃん ぶっちゃけね、「秀丸やEmEditorの使い方押しえれ!」っていってるのと変わらんのよ。 それを自覚して慎ましくやりゃ誰も文句いわんよ。
>>450 scite じゃなくて SciTE4AutoHotkey についての質問ならそれほど問題にはならなかったような気が。
それから
>>449 は SciTE4AutoHotkeyの日本語化パック使用で
>>444 のタイポなしでのものでした。
- このレスも邪魔だって言われるかもしれないけど。とりあえず自分のレスはこれで終わります。
このスレでSciTEと言われたら普通SciTE4AHKのことじゃね 秀丸やEmの話題と同じと言ってるヤツはモグリ
454 :
452 :2009/11/28(土) 10:57:22 ID:46oJSxCE0
SciTEもSciTE4AutoHotkeyも存在は知ってたけど、いきなりsciteて書かれても分からんよ 常用してないエディタの正式名称やスペルなんて覚えてないし 字面のイメージでしか認識してないから せめて小文字じゃなくてSciTE て書いてくれてたらそんなエディタあったなって思い至るけど
分からなかったら、とりあえずスルーしてればいいんじゃね そりゃ詳しく書くにこしたことはないけど、 一方で実際にSciTEのことだと分かって回答してる人もいるわけだし SciTEのことを知らなかった、気付かなかった人が一方的に騒いでるようにしか見えないんだけど
… 分からないAHKネタなら「スルーしろ」でいいけど、そもそもAHKとの関連性が 見いだせなかったのが今回の問題点だろ。質問主自身も非を認めてる。 見当違い(に思われても仕方ない)書き込みに、「スレ違い」って指摘が出るのは普通だし それを「SciTE4AHK知らないなんてモグリ」なんて煽られた連中が哀れだって話だよ。 このスレ、以前から必要以上に住人にエスパーやスルー能力を求める人がいるけどさ 質問する側にきちんと趣旨が分かるように書けって言うのは普通のことだろが。
たしかに俺はそのソフトの存在を知らなかったが、一番の問題は、
>>437 が、ソフトの質問なのか、AHKの質問なのか、はてや単にソフトに対する愚痴なのか、
第三者から見て、まったく意味のわからない文章だということ。
しかも 「どうして?」 とか 「ダメなの?」 とか感情ばっかりで質問の内容が不明確で、
そのあとでフォローすべきタイミング(
>>439 )があったのに、相変わらず感情に任せている。
最低限、AHKスクリプトを編集する**というソフトの設定で困った と書いておけばよかった。
このスレは、もうずっと前から、スクリプトのテクや使い方で情報交流している流れだから、
そこへAHK以外の設定ファイルを唐突に書かれても、意味が通じない人がほとんどだろう。
多数の人が見ている中で、質問と回答で成り立っている当スレでは、
わかりやすい質問と、汎用的に応用できる回答を目指すことで、うまく機能する。
ちなみに、AHK以外のソフトであっても、困ってることを最初にちゃんと書けば、
「その困りごとを、いかにしてAHKで解決するのか」 という趣旨に変わるため、
ほとんどの場合はスレ違いにはならない。
例。このスレのちょっと前に、特定の絵描きソフトのショートカットの話があったが、
質問者が 「こういう状況で困っているから回避策は無いか」 と宣言していた。
だからそのソフトを知らない人でも混乱しなかったし、わからない人はスルーした。
興味のある人は回避策をレスした。
見ていただけの人は 「ふーん、絵描きソフトって癖があるのだな」 と記憶に残った。
これが本来の正常な流れでしょ。
今回の該当者は、質問の仕方がひどすぎて他人を混乱させた。これは反省すべきだろう。
最早掘り下げる話題でもない、誰が悪かろうが何だろうが既に事は終わった
質問したものです。こんなに紛糾するとは思いませんでした。すんませんでした。 一般のSciTE用の単独スレ自体ない状態なので、当面はこのスレでSciTE4AutoHotKey関連の質問をさせていただけると助かりますがいかがでしょうか?
つまり 質問者 ID:Ni8ykrbR0 = ID:U0lXYIo+0(賛同者がいないからID変えて煽り+今頃お詫び)
さらには
P2をつかって別人を装って、質問の回答を得ようとする+煽り(ID:zT6qWBdLP)
ID変わったのを忘れたのか、そのままP2のIDで
>>450 で詫びてるチョンボ
ということか。
>あなた方が無駄にレスしなきゃ、数レスで終わるんだし
を返すなら、おまえが感情任せのクソ文章を書かなければ、誰も不愉快にならなかった
>>461 俺は事務所で質問したときにID:Ni8ykrbR0だった。家に帰ってからID:U0lXYIo+0だ。
あとは別人。社会人だから別人を装うほど暇じゃないぞ。
流れを読まずに。俺的Unicode版のまとめ(1 of 2)
■ スクリプトファイル
Unicode(UTF-8 or UTF-16LE with BOM)または、OSの標準コードページのどちらでも記述可能。
実行ファイル名を変更することでスクリプト読み込み時のコードページを変更できる。
(a) "AutoHotkeyU.exe" : UTF-8 で読み込み
(b) "AutoHotkey.exe" : システムのコードページで読み込み(日本語WinだとシフトJIS)
※1 BOMがある場合は UTF-16 LE と見なす
※2 (b)の場合従来の「`(0x60)」をエスケープした形式は不要となる。
表記どおりのままとなるので
>>6 のQ1 の対処法は外す必要がある。
■ スクリプト内での文字の扱い
全角・半角を問わず全ての文字は同等に文字単位で評価される。
・文字列長 (※1)
StringLen, StrLen()
・文字位置/文字区切り
StringGetPos, SubStr(), StringSplit, Loop,PARSE(※2), String(Trim)Left/Right
・マッチング・置換
IfInString, If var in 〜, StringReplace, RegExMatch, RegExReplace
・文字コードはユニコード
Asc(), Chr()
・ コードページを指定して変数内の文字コードを変更可能に
TransForm
※1 全/半角混在文字列のバイト長を得ることで、「見た目上の長さ」を取得しているときは注意
また、メインウィンドウで開いた変数表示(ListVars)での表記も文字単位となる
> hoge[5 of 63]: あいうえお
※2 Loop, PARSE で区切り文字無しの場合は、文字毎にループが回る
俺的Unicode版のまとめ(2 of 2) ■ ファイルの取扱い テキストファイルは特に指定をしなければOSのコードページ(シフトJIS)で読み込み可能(従来通り)。 "FileEncoding"(新設) コマンドを利用することで読み書き時のエンコーディングを指定可能に。(※1) オブジェクト(クラス) "File" が追加された。 アクセスモード(読専、追記、BOMの取扱など)を指定してファイルを開く事が出来る。 ファイルオブジェクトに対して、読み書き、シーク、EOF検知などができる。 バイナリ読み書きが可能になった。 ※1 読み込まれた段階で内部ではユニコードになっているので注意。 ■ DllCall ・ user32/kernel32/comctl32/gdi32内の関数ででANSI版とUnicde版があるもので コール時に末尾の指定が無い時はUnicode版を利用する。 DllCall("DeleteFile", "UInt", &filename) → "DeleteFileW"をコール(従来版から変更しなくていい) ・ 文字型 "Str" はユニコード扱い。ANSI文字列を扱いたい場合は、新設の "AStr" を使う。 明示的にユニコードにしたい場合は新設の "WStr" を使う。 ■ 64ビット対応 ・ ポインタで使う整数精度が何バイトかを知ることが出来る PtrSize() 関数を新設。 ・ DllCall で扱うポインタ(従来はUIntで代用)の授受に "IntPtr" 型を新設。 ■ その他 ・ 16進数の出力内容で、大文字/小文字を選択可能に ・ ビルトイン変数 "A_OSVersion" で Win7 対応 ・ ビルトイン変数 "A_IsUnicode"(新設) でユニコード版かどうかを知ることが可能に
連投スマソ。もうちょっと追加。
■ 正規表現
・内部処理がユニコードになったので、シフトJISで0x5cを含む文字(
>>6 Q2下段)であっても
正規表現のエスケープ記号(\)にはマッチしなくなった。
・文字コードの範囲指定で(ひらがな→/[ぁ-ゞー]+/)などのマッチングが可能に
■ その他2
・(新設)「%A_ScriptDir%\Lib」にある関数ライブラリスクリプトの自動検索(
>>423-431 )
・AutoHotkey_Lの機能(
>>8 )
----
新機能で色々遊んでみたスクリプト
; 文字列を現キャレット位置に流し込む(Clipboardを介さない)
#UseHook
#1::StrSendr("ほげほげ")
StrSendr(str) {
tmp := A_FormatInteger
SetFormat, Integer, Hex
Loop, PARSE, str
Send, % "{U+" . Asc(A_LoopField) . "}"
SetFormat, Integer, %tmp%
}
; AutoHotkey_L の Regular expression callouts と併用
RegExMatch(address, "^(.+?)([都道府県])[\s ]*(.+?)([市区町村])(.+)$(?CFunc1)")
Func1(m) {
MsgBox,%m1% %m2%`n%m3% %m4%`n%m5%
}
ウィンドウサイズや位置を固定させるコマンドありませんか?
>>467 「ウィンドウサイズや位置を固定させる」ってのは以下のどっちだろうか
(A) あるソフトを起動した時にいつも同じ位置・サイズで表示したい
ショートカットの代わりにAutoHotkey経由で起動させて、
ウィンドウが出たら位置を移動する、って方法で擬似的に可能
; 例) メモ帳を起動したら指定位置・サイズに移動
Run, notepad.exe,,, pid
WinWait, ahk_class Notepad ahk_pid %pid%
WinMove,,, 100, 100, 600, 400
(B)ソフト起動後のウィンドウをマウスやキーボードで操作してもウィンドウが動かないようにしたい
元々あるコマンドをいくつか組み合わせるだけでは無理。
・ グローバルフックを行って、ウィンドウ移動のメッセージを全部捨てれば可能
→ 完璧に動作するだろうけど、外部DLLが必要など凄くめんどう
・ タイトルバーを掴んでのマウスで移動を何とか避けられればい
→ WM_NCHITTESTをマウス直下に送ってHTCAPTION(0x02)の場合にLButtonを殺す
もう1個。 (C) もし移動してしまっても、所定位置にすぐ戻ればいい タイマーで該当ウィンドウを所定位置・サイズにし続けるコマンドを発行し続ける #Persistent SetTimer, Timer1, On Return Timer1: IfWInExist, ahk_class Notepad WinMove,,, 100, 100, 600, 400 Return
俺は自作自演扱いになってるようだね。質問者の方には大変申し訳ないことをしたと思う。
>>450 をちゃんと読んでもらえれば、その中に
>>444 で回答を書いていることに言及しているのが分かると思う。
口調を丁寧にしたのは、スレ違いの指摘は正当なものだと思ったので、ちゃんと謝罪すべきと思ったから。
質問は分かりやすく、詳細に書けというあなた方の指摘は正しいし、それに文句を言うつもりは全く無い。
だが、俺には当の質問はそれほど意味不明なものだとは思えなかったし、
「詳しく書け」と「何の関係がある」と言うほどのものでもないと思った。
分かる人には分かるだろうし、何のことか分からないなら黙っていればいいのに、とも思った。
かえって質問者への敷居を高くしてるだけにしか見えなかった。
>あなた方が無駄にレスしなきゃ、数レスで終わるんだし
これは感情まかせでも何でもない。
あなた方が「何のことか分からない」と無駄にレスをつけなければ、普通に誰かが回答して終わってたと思う。
もはや見解の相違としか思えないので、これ以上の議論は不毛だと思う。
だが、質問者が誤解されたままというのは申し訳ないので、本当の最後として書かせてもらった。
なげーよ。スレ違い。
>>462 ならなぜ
>>442 で別人を装ったんだ?
>>442 で「IDちがいますがこのリンク先に書いてあるソフトです」とでも
書けば誤解が無かったし、ここまでスレを混乱させずに済んだはずだろ。
というか通常はそんなことをわざわざ書かなくても話は通じるし問題も無いが、
あたかも別人であるかのような書き方で「これを知らないやつがいて驚いた」
みたいに質問者を擁護する文を、自分自身で書いた理由が不明。
この理由が明確にならない限り、悪意に満ちた自演と捕らえられても仕方ない。
自分の犯した失態を、自演してまでスレを混乱させてごまかす気なら、
もうそれは立派な妨害行為だから、もう二度と参加するな。
Unicode版とL版そのうち統合するのかな?
>>473 もうしてる。
ファイルオブジェクトとか作ってるし、もう切り離せないんじゃないかな。
俺が「Autohotkey_ひまわり」作るから少し待て
>>469 ありがとうございます。
Bを試してみます。
使い始めたばかりでテンプレにある症状と同じかはわかりませんが Ctrlキーが押しっぱなしになる原因が自分の場合ですがわかりました ~RCtrl:: a ;文字は特に何でも良い ~Ctrl:: a 上のどちらかををキーマップをしてるときに 外部のアプリケーションからCtrlキーが送られるとCtrlキーが押しっぱなしになるみたいです 自分の場合では、マウ筋からウィドウを閉じるCtrl+Wキーを送ったり CLCLからCtrl+Vでの貼り付けを行うと必ず再現します RCtrlキーを押すと直ります
教えてください MouseGesture.ahkを使っています ホイール回転↓で「その場スクロール」モードに入り ホイール回転↑か他のボタン押下で「その場スクロール」から抜けたいのですが どのように設定したら良いでしょうか?
>>478 Loop{
If GetKeyState("Lbutton","P")
Break
MG_InstantScroll()
}
これだと左クリックでスクロール解除
>>477 うお、長年マウ筋にCLCLと一緒に使ってたんだが気付かなかった
これでたまにctrlが押しっぱなしになるっていう長年の疑問が解けたよ!教えてくれてありがとう!
481 :
478 :2009/11/29(日) 14:47:19 ID:bawCMB8i0
>>479 早速のレスありがとうございました。
希望通りの動作になりました!
ただ、マウ筋のフリースクロールの代わりにしようと思っていたのですが
意外とその場スクロールが適用できるアプリって少ないんですね・・・
フリースクロールだけのためにマウ筋起動しておくのも何だし、
その場スクロールを幅広く適用できる何か良い方法はないでしょうか?
SC.binって何?
ポップアップメニュー形のランチャを作ってみたいのですが、 一例を示していただけないでしょうか?
AHKのメニューでランチャ作るのはめんどいよ ポチエスかShorterあたり使うほうが楽
>>486 ちょーてきとーだけど。
スクリプトあるフォルダに"App"フォルダを作ってメニューに表示したいショートカットをぶち込む
Pauseでメニュー表示
#NoEnv
#SingleInstance, Force
App_Dir = %A_ScriptDir%\App
Menu, M1, Add ;
Pause::
Menu, M1, DeleteAll
Loop, %App_Dir%\*.lnk
{
SplitPath, A_LoopFileName,,,, name
Menu, M1, Add, %name%, LaunchApp
}
Menu, M1, Show
Return
LaunchApp:
Run, open %App_Dir%\%A_ThisMenuItem%.lnk
Return
>>487 コメントどうもです。
shorter使ってるんですが、64bit非対応なんで今のうちに移行すべきと思いまして。
>>488 ありがとうございます。今から試してみます。
>>488 無事動きました!
内容は自分には高度なんで、勉強して自分なりに改造してみます。
ありがとうございました。
shorterもどきなら流行らせるページの掲示板かどこかに完成品があったはず
AHKのメニューは同じ名前を使うと怒られるから ショーターの代わりにはなんなかったな 階層を再現するのも面倒くさかったし…(つーかできなかった)
オブジェクトがサポートされたんだから そのうち無名関数とかも無茶な文体で追加してくれるはず
階層化は関数の再帰呼び出しでできた。 1レスに納めるのの無理やり感は否めない。 #NoTrayIcon Menu, % CreateMenu(A_Programs , "M1"), Show Return CreateMenu(dir, menu_name) { local name, count count:=0 Loop, %dir%\*.*, 2 { count++ SplitPath, A_LoopFileName,,,,name Menu, %menu_name%, Add, %name%, % ":" CreateMenu(A_LoopFileFullPath, menu_name . "_" . count) } Loop, %dir%\*.lnk, 0, 0 { count++ %menu_name%_%count% := A_LoopFileFullPath SplitPath, A_LoopFileName,,,,name Menu, %menu_name%, Add, %name%, ExecLink } If (count<1) { Menu, %menu_name%, Add, (none), Dummy Menu, %menu_name%, Disable, (none) } return menu_name } ExecLink: Run, % %A_ThisMenu%_%A_ThisMenuItemPos% Dummy: Return
return と Return とかがすごく気になる俺ガイル
関数やコマンドは一部を大文字にして、変数は全部小文字 とかは自分で決めるものらしいけども、ある程度決まってた方が 人のを読むとき読みやすいんで、確かにみんなどうしてるんでしょ
>>474 横からだけど、ほんとだ。
プロセス詳細が AutoHotkey_L (Unicode) になってた。
Lexikos版のオブジェクトは結構進化してんのな。 配列は結構便利だ。オブジェクトもキーにできるとは恐れ入った。 でも、キー一覧のオブジェクトを得るメソッドか、イテレータみたいなのが欲しいところ。 自分で実装すればいけるけど、標準で欲しい。 デストラクタみたいなのが使えるから色々解放するのにも便利だ。 スクリプト終了時も有効(global と staticのみ)なんで、 OnExitなしでいけるから利用ライブラリの独自の解放処理を考慮しなくていいのも嬉しい。 objBase := Object("__Delete", "Test_Delete", "__Set", "Test_Set") objGlobal := Object("base", objBase, "name", "ぐろ〜ばる君") hoge(objBase) MsgBox, Press OK to Exit hoge(base) { objLocal := Object("base", base, "name", "ろ〜かる君") } Test_Set(self, name, value) { if (name = "name") MsgBox,, %value%, おぎゃ〜! } Test_Delete(self) { MsgBox,, % self.name, 死にまーす! }
>>502 使いこなせば、かなり便利そうなスクリプトですね。
そのリンク先のMMenu.ahkをいまテストしているのですが、ちょっと質問です。
サンプルスクリプトを走らせるとNetoworkのメニューにチェックが入っていますよね。
http://www.autohotkey.net/~majkinetor/MMenu/Screenshots/Capture_1.gif これを、Networkメニューを押すたびにチェックをつけたり、はずしたりして、
欄外でクリックしたり、メニューを消したとき(MMenu_Show()の直後、Exitappの一歩手前)
で、チェックマークの状況を取り出すことは可能でしょうか。
>MMenu_Add( main, "Network", icn, 0, "c ivNet")
これのcがあるとチェックマークが入り、-cにすると外れるようですが、
サンプルのままだと、一度クリックするとOnMMenuに飛んで、メニューが消えます。
参考になるサンプルを紹介していただけるだけでも助かります。
505 :
486 :2009/11/30(月) 22:49:33 ID:OOZFPPlE0
>>502 情報ありがとうございます。
まだまだ勉強が足りないのでじっくり理解していきます。
他の方もいろいろと情報ありがとうです。
>>505 MMenuだったらAPIMenu.ahk だかそんな名前のファイル無かったっけ?多分そこに色々情報あると思うんだけど。
確かWinAPIのラッパだったと思うから GetMenuItemInfo とかその辺で検索してみればサンプル見付かるんじゃないかな?
無理そうなら機能拡張するか別の方法探すか。
今、別件、野暮用ちう。御免ね。
DllCallで呼び出せるDLLってなんでもOKなんでしょうか? C++で作らせたDLLを読ませようとした場合、読める環境と読めない環境がありました。 読めない環境でVBランタイムや.netのランタイムなどをごちゃごちゃ入れたら 読めるようになりました。どれが効いたのかわかりません。 それが効いたのかも確証はありません
http://pc11.2ch.net/test/read.cgi/software/1219130051/868-870 > 870 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/12/13(土) 22:41:47 ID:JAFWrcS10
>
>>868 > C++で作られてるっぽいので内部名が違うみたい?
> 詳しくないけどとりあえず以下の方法でできたっぽい。
> Dependency Walker等でMiniSmtpMailer.dllを開いて関数名を調べる
> SmtpGetVersionの内部名は"?SmtpGetVersion@@YAKXZ"っぽいとわかるので、
> DllCall("MiniSmtpMailer.dll\?SmtpGetVersion@@YAKXZ")
> 他の関数は試していない。
http://pc12.2ch.net/test/read.cgi/software/1230694774/204-208 > 206 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2009/02/04(水) 21:27:31 ID:Ut7+efCd0
> >204
> 多分呼び出し規約が stdcall になってるので関数名を extracter@4 にすれば呼び出せるかも。
>
> 207 名前:206[sage] 投稿日:2009/02/04(水) 21:38:23 ID:Ut7+efCd0
> 補足。
> dll 側のコードはそのままで、DllCall するときに extracter@4 で呼ぶって意味ね。VC だと _extracter@4 かも。
> @以降の数字は引数に使用するスタックのサイズ。今回は int が 1 つなので 4。
> gcc だと -Wl,-kill-at というオプションを渡すと @ 以降がなくなって extracter で呼べるようになるはず。
> VC 側の同等オプションは知らね。DEF ファイル使えば制御はできると思う。
509 :
ひみつの文字列さん :2024/12/20(金) 17:22:55 ID:MarkedRes
日本国またはアメリカ合衆国、もしくはその両方の著作権法に触れる内容であると疑われることから表示できません。
>>509 俺もおかしくなった。
1回目だけじゃなく2回目以降もたまに短くなる
XPからwin7に乗り換えたら、タスクトレイでバルーン表示をさせると フォアグラウンドのウインドウフォーカスが奪われてしまうようになった。 #ifwinactiveで囲ったホットキー定義で、Processnameを確認せずに、 ウインドウ指定を「A」で済ますような手抜きスクリプトが誤動作するようになった。 ahkのバルーンに限らず、ほかのソフトのバルーンでも発生する模様。 なにか対策ないかな。
Migemo検索しようとすると、ANSI版だと外部ライブラリにデータを引き渡すために 色々やらなきゃならないからあまり速度はでなかったけど、Unicode版だと速いなぁ。 以下はローマ字からmigemoエンジン使って正規表現パターンを作り出すだけの手抜きライブラリ。 migemo:=Migemo_Open("C:\Program Files\cmigemo-1.2-dll\dict\migemo-dict") str = モンキーパンチ If RegExMatch(str, migemo.Query("monkey"), $) msgbox, % $ ;--------"migemo.ahk" start ------------ Migemo_Open(dict) { If DllCall("LoadLibrary", "Str", "migemo.dll", "IntPtr") Return Object("base", Object("__Delete", "Migemo_ObjDelete", "Query", "Migemo_ObjQuery") , "handle", DllCall("migemo.dll\migemo_open", "AStr", dict, "IntPtr")) } Migemo_ObjQuery(self, word) { Transform, query, FromCodePage, 0, DllCall("migemo.dll\migemo_query", "IntPtr", self.handle, "AStr", word, "Str") Return query } Migemo_Close(self) { If DllCall("migemo.dll\migemo_close", "IntPtr", self.handle, "Int") self.hMigemo := 0 } Migemo_ObjDelete(self) { self.close() } ;--------"migemo.ahk" end ------------
Win7(Vista)のExplorerで、現在選択しているファイル名を取得したいです。 XPでは下記の方法で取得できていましたが、Win7だと取得できないようです。 controlget filename, list, selected col1, SysListView321, A Win7で、現在居るフォルダ名は下記で取得できました ControlGetText,cur_dir,ShellTabWindowClass1,A が、ファイル名はどうしても取れず。なにかよい方法はありますでしょうか。
Windows7 64bitで、 104キーボードのWinキーを変換キーに、右ALTキーをWinキーにして、 概ねうまくはいってるものの、 Win+Lだけが、右ALTでは無く、元のWinキーで動作してしまう。 64bitだからかな? スクリプトは、 RWin::vk1Csc079 RAlt::RWin
32, 64に関わらず、Win+L や Ctrl+Alt+Del はフックより先にOSが拾っちゃうんじゃないのかな
会社のパソコンを管理者権限で使わせてくれないため CapsLock<->Control入れ替えができず大変苦労してるのですが、 やっぱりまだAHKでCapsLock入れ替えは無理ですかね。 こうなったら「変換」キーあたりにコントロールを持ってくる 変態配列しかないかと思ってるのですが。
Windowが最大化されたときに、直後に割り込んでリサイズすることで似非ビッグデスクトップ化したいと思ったのだが、 イベントフックしようと思ったらこれはもしや外部DLL必須なのか。 この手の用途だとどんな手法が有るでしょうか。
>>518 >こうなったら「変換」キーあたりにコントロールを持ってくる
>変態配列しかないかと思ってるのですが。
JCtrl?
JBeef
>>520 WinEvent拾うとと結構色々分かるんだけど、最大化のイベントって色々見てる限り分からん。
以下は移動開始/終了の検知。
#NoEnv
#Persistent
#SingleInstance, Force
DllCall("SetWinEventHook"
, "UInt", EVENT_SYSTEM_MOVESIZESTART:=0x0000000a ; event_id from
, "UInt", EVENT_SYSTEM_MOVESIZEEND:= 0x0000000b ;event_id to
, "UInt", 0 ; ModuleHandle
, "UInt", RegisterCallback("WinEventHookProc")
, "UInt", 0 ; All Process
, "UInt", 0 ; All Threads
, "UInt", 0x0003 ; WINEVENT_SKIPOWNTHREAD | WINEVENT_SKIPOWNPROCESS
, "UInt")
WinEventHookProc(hWinEventHook, event, hwnd, idObject, idChild, thread, time)
{
If (hwnd)
{
WinGetClass, class, ahk_id %hwnd%
action := event = 0x0000000b ? "END" : "START"
Tooltip, Move %action% / %class% (%hwnd%)
}
}
ちにみに、イベントは見るだけ(WINEVENT_OUTOFCONTEXT)しかできない、
拾って捨てたりするなら(WINEVENT_INCONTEXT)ばDLLは必要みたい。
>>523 ありがとうございます。確かに最小化などはイベントがありますが、最大化は有りませんね・・・
うーむどうした物やら
うーんダメだ、SetWindowsHookEx と WH_CALLWNDPROC でWindow最大化が取れるのではと期待するのだが、 この辺りの知識が皆無でやり方の見当が付かない。
>>525 ここ(
http://www.autohotkey.com/forum/viewtopic.php?t=19367&start=0 ) にCBTフック用の汎用Dllがあった。
cbthook.rar ってやつ。(トピック1件を表示するURLはよく分かんない)
これに入っている ahkhook.dll 使うと拾えたよ。
DetectHiddenWindows, On
hModule := DllCall("LoadLibrary", "Str", "ahkhook.dll")
hHook:=DllCall("ahkhook.dll\reghook"
, "UInt", 5
, "UInt", WinExist("ahk_class AutoHotkey ahk_pid " . DllCall("GetCurrentProcessId","Uint"))
, "UInt", 0x550
, "UInt", (TRUE << HCBT_MINMAX))
OnMessage(0x550 + HCBT_MINMAX, "CBT_MinMaxHandler")
CBT_MinMaxHandler(wParam, lParam, msg, hwnd) {
DllCall("ReplyMessage", "UInt", 2)
WinGetTitle, title, ahk_id %wParam%
action := (lParam & 0xFFFF) == 3 ? "Maximize" ; SW_MAXIMIZE = 3
: (lParam & 0xFFFF) == 6 ? "Minimize" ; SW_MINIMIZE = 6
: "Restore" ; SW_RESTORE = 9
Tooltip, [%action%] %title%
}
あ、定数が抜けてる… HCBT_MOVESIZE = 0 HCBT_MINMAX = 1 HCBT_QS = 2 HCBT_CREATEWND = 3 HCBT_DESTROYWND = 4 HCBT_ACTIVATE = 5 HCBT_CLICKSKIPPED = 6 HCBT_KEYSKIPPED = 7 HCBT_SYSCOMMAND = 8 HCBT_SETFOCUS = 9
おお、ありがとうございます!! 動作しました! この辺りのフォーラムもざらっと見てはいたのですが、今回はやはり外部DLL必要ってことですかね。 SetWindowsHookで大方のフックが可能なので、取れない最大化だけ情報が希薄にorz そしてSetWindowsHookExはマウス・キーボード用のフック例しか出てこないww とまぁ私の方向性に問題有りでした。動けばOKですよね。 大感謝です。
529 :
Tet :2009/12/06(日) 23:44:02 ID:v3pJ0zej0
SendMessageでWM_GETMINMAXINFO(0x24)を投げたら最大化状態のサイズを弄れるのではと考えているのですが、 lParamのMINMAXINFO構造体を云々のあたりで躓きました。 LONGのPOINT構造体なのでahkのintをstrとして・・・????の辺りでorz この辺りのメッセージ使った例とかあれば教えてもらえないでしょうか。
531 :
507 :2009/12/07(月) 10:03:42 ID:ocCl2pO60
>>507 ですが
DllCallで.NET Frameworkのランタイムを入れないとdllが読み込めないようです。
これはdllのほうの問題なのでしょうかそれともahkのほうが問題なのでしょうか
>>532 独自ではない外部Windowにメッセージを投げる際にparamの構造体をahk側でどのように表現するのか、
というあたりなのですが、前提が間違ってるとか含めて指摘していただけるとありがたく。
>>533 おおお、かなり猛烈に参考になりますと共に手を付けてない範疇すぎて全くアレです。がんばります。精進します。
懸念材料としてはWM_GETMINMAXINFOで1モニタサイズ以上の数値を入れても無視される可能性がw
#
>>520 ですが、ゆるーいビッグデスクトップ化目的なので、最大化されてから希望サイズと異なる場合に一端戻して再度最大化とかで。
主要ソフトは何故か最大化状態でWinMoveで下に引き延ばせるようなので、上下連結モニタの場合は要件に収まる動作ができてます。
左右には伸びてくれません。移動は出来るのですが。最大化を検知して最大化を解除し指定サイズにリサイズなら可能なんですが、
大変使い勝手の悪い巨大Windowになるので、そのあたりなんとかならんかということで最大化時のサイズ指定というところに。
ahkファイルを実行して取得したPIDを他のahkファイルで取得するにはどうしたらいいですか?
PID取得した方から別AHK立ち上げるならコマンドライン引数 両方とも常駐してるなら、PostMessage & OnMessage
>534 WM_GETMINMAXINFO ってシステム側がメッセージ投げてアプリケーション側が値を設定して返す メッセージのはずなので外部から投げても無意味。 よって、>534 みたいにフックという話になるけど SetWindowHookEx では SendMessage 関連の場合は 値を確認できるだけで変更は認められていないはず。 従ってウィンドウプロシージャのすり替え(サブクラス化)が必要なんじゃないかと。 具体的には SetWindowLongPtr で GWLP_WNDPROC を使う。 自分が処理しないメッセージは元のウィンドウプロシージャに渡してやる。 他プロセスの場合メモリ空間が別だというのはそのままなのでそこは対処が必要。 自分はフックを利用して相手側メモリ空間に DLL を読み込ませてすり替えたことはある。
>534 じゃなくて >533 だた。 アプリ側から WM_GETMINMAXINFO の応答が返っているように見せなければならない、ということね。
すんませんうごきました #Include test12_setting.ahk DetectHiddenWindows, On HCBT_MINMAX := 1 hModule := DllCall("LoadLibrary", "Str", "ahkhook.dll") hHook:=DllCall("ahkhook.dll\reghook", "UInt", 5, "UInt" , WinExist("ahk_class AutoHotkey ahk_pid " . DllCall("GetCurrentProcessId","Uint")) , "UInt", 0x550 , "UInt", (TRUE << HCBT_MINMAX)) OnMessage(0x550 + HCBT_MINMAX, "CBT_MinMaxHandler") CBT_MinMaxHandler(wParam, lParam, msg, hwnd) { DllCall("ReplyMessage", "UInt", 2) if (lParam & 0xFFFF) = 3 ; Window Maximize { WinGet, active_id, ID, A WinGetPos, x, y, w, h, ahk_id %active_id% MonitorNum := GetMostOverlapMon(x, y, w, h) GetMonitorSize(MonitorNum, mX, mY, mW, mH) ; SetSize(MonitorNum, set_x, set_y, set_w, set_h) Multiply_X := 2 Multiply_Y := 1 Position_X := -1920 Position_Y := 0 set_x := mX+Position_X set_y := mY+Position_Y set_w := mW*Multiply_X-1 set_h := mH*Multiply_Y-1 WinMove, ahk_id %active_id% ,, set_x , set_y , set_w , set_h ; Tooltip, id:%active_id% | Mon:%MonitorNum% | %mW%x%Multiply_X% %mH%x%Multiply_Y% %mX%+%Position_X% %mY%+%Position_Y% | return } }
>>537 そのあたりのキーワードでごりごりググって見つけたサンプルなんかを動かしてて発見したのですが、
Windowを最大化した後にサイズ変更して成功する場合があるんですよね。で、判ったのは、
モニタ解像度ピッタリ(整数倍とか)に変更使用とするとダメなので、-1しておけば変更できるという・・・
その結果、
>>539 のような実験ahkで動作しました(win7x64Aero)。多数のヒントありがとうございます>諸氏
あちこち端折ってありますが、前半でahkhook.DLLを用いてWindow最大化イベントをフックしてます。
if (lParam & 0xFFFF) = 3{ }の中身で最大化時の処理を書いてますが、
アクティブWindowの位置からモニタNoを割り出し(省略)、予め指定されたサイズに変更してます。
その際に幅と高さを-1しないと動作しなかったというわけですねorz
(削りすぎてイミフなコードになってますが実際はモニタNo毎に倍率やポジションを別途設定してます。)
これでWindowを最大化すると、Windowの場所に応じて最大化後にリサイズされ複数モニタにまたがった最大化Windowになります。
元のサイズに戻すと通常のサイズに戻りますので大変ユーザフレンドリでございます。ほんと助かりました。
動けばいいんですが、細かい疑問点として、
・DllCall("ReplyMessage", "UInt", 2) は何用なんでしょうか。無くても動作してるみたい。
・WinGet, active_id, ID, AでアクティブWindowを拾ってますが、
本来は最大化されたWindowを拾うのが筋だとは思います。でもやり方判らずw
・各モニタNo毎に数種のパラメータを設定しておく、といった類のユーザ設定変数の指定で、お奨めの手法はあるでしょうか。
IniReadが煩雑すぎて#Includeと x := pref_%var1%_%var2% 的な力業でやっつけてあるんですが、見た目が酷いです(10モニタほどあります)。
・Winの画面設定などでモニタNoが変更されてもSysGet, Monitor_numbers , 80で拾うモニタ番号は起動時か何かの状態のままww
とかでしょうか。すんません半分メモになってしまいました。感謝を。
>>534 >ahk側でどのように
もしかして… CreateRemoteThread+あれ でゴニョゴニョする方のですか?
この方法の大変さや危険性とか分った上での話だと思いますが
片方づつのサンプルなら多分、両方ともあちらのフォーラムで見付かると思います。(そこからがまた大変ですけど)
- といってもdll使って動いている様なので今となっては必要無い情報ですね。忘れて下さい。
>>540 分かるところだけで。
>・DllCall("ReplyMessage", "UInt", 2) は何用なんでしょうか。。
cbthoo.rar 内のサンプルに↓の記述
DllCall("ReplyMessage", "UInt", 2) ;reduce possibility of deadlock
>・WinGet, active_id, ID, AでアクティブWindowを拾ってますが、
>>526 でウィンドウタイトルは何で引っ張ってるかを見れば分かる。MSDNでは↓
ttp://msdn.microsoft.com/en-us/library/ms644977%28VS.85%29.aspx >見た目が酷いです
これは好き好きじゃないのかな。
Monitor_1=100,200,300,400,・・・・
Monitor_2=100,200,300,400,・・・・
とかにして、毎度Splitしてもそんなに遅くないと思うけど。
あとはオブジェクトの配列にするのも手。
あるフォルダの中のファイルすべてを 最終更新日(yyyyMMddHHmmss)+拡張子にリネームしたいのですが、 最終更新日が秒まで同じ場合に、何かよい対処方法はないでしょうか? 秒以下の時刻を取得できれば、その値をファイル名に含めればいいのですが、 できないようなので、最終更新日が同じファイルがあれば a,b,c… と添字を付けてファイル名の重複を回避しようと考えています。 このときに、秒以下の時刻順に a,b,c… と付けるためには、 Loop でファイル名順でなくて日付順にファイルを取得する必要があり、 手が止まってしまいました。 具体的には次のようなリネームをしたいのですが、お知恵を拝借願います。 ↓日付順 ファイル.txt → 200912082313.txt ファイル(1).txt → 200912082313a.txt ファイル(2).txt → 200912082313b.txt
>>543 俺はこうやってる
loop内でバッチを作る。そのとき先頭を更新日にする
ソートする。更新日で並ぶ
loop,parseで精査。やばい項目を加工するバッチへ出力する
バッチを実行。ほっとくと終わってる
バッチでやらないで直接filemoveでやってもよいが、バッチでやると
処理が止まったときになにが原因か目で追うことができるので便利
まぁ、Frexible Renamer 使うのが一番手っ取り早いわな。 ファイル名重複時の連番も楽だし。 どうしてもAHKでやる必要があるなら、リネーム前に数えてSuffix付与するくらいじゃないのかね Loop, %target_dir%\*.txt FileMove % A_LoopFileFullPath, % GetNewPath(A_LoopFileFullPath, A_LoopFileTimeModified) GetNewPath(orgPath, newName) { SplitPath, orgPath,, dir, ext, name dir := dir ? dir . "\" : "" count := 0 While FileExist(newPath := dir . newName . countToSuffix(count) . "." . ext) count++ Return newPath } CountToSuffix(count) { Return !count ? "" : (count<=26) ? Chr(Asc("a") + count - 1) : "(" . (count-26) . ")" }
>>546 すげぇw 俺のつかってる自作のやつの5分の1くらいのコード量だ。
>>541 あ、いえ、その時は構造体をahkで作って渡したら動くんじゃないかと思ってたので
>>542 う!? ahk_id %wParam%で行けたのか。試してみたつもりだったのに今やってみたら動くorz ありがとうございます
毎回splitですか、それもそうかも。考えてみます。配列とかハッシュとか使いたいw
>>543 rubyなんかを使えるなら数行で書けると思うんで、ahkは不向きじゃないかなぁ
配列は unicode 版と lexikos 版で使えるみたいだけど ハッシュはどうなんだろう
ハッシュはもう普通に使える key1 := "あいうえお" key2 := "String with Space" hoge := Object(key1, "かきくけこ") hoge[key2] := "fuga fuga" MsgBox, % ObjGet(hoge, key1) "`n" hoge[key2]
うわあ、乗り換えるかどうか迷うなぁ もういっそ本家が消えてくれたら楽なんだがw
>>544-546 ありがとうございます。
>>543 ではコア部分だけを書いたのですが、
実はリネームの前後にAHKでやってる処理があって、
それとの連携からAHKでリネームしたいという要望でした。
AHKからリネームソフトを制御するという手も考えられますが…
>>545 でも秒以下の更新時刻を取得できなければ同じだし、
>>546 でも Loop が名前順に処理するから、下の変更後のようになりますよね?
これが右端のようになってほしいわけです。
更新時刻 元ファイル名 変更後 ↓こうなってほしい
2009-12-09 04:15:28.99 ファイル(0).txt 20091209041528.txt 20091209041528a.txt
2009-12-09 04:15:29.51 ファイル(1).txt 20091209041529.txt 20091209041529.txt
2009-12-09 04:15:28.47 ファイル.txt 20091209041528a.txt 20091209041528.txt
で、考え直してみたのですが、秒以下の更新時刻を取得できない以上、
ファイル.txt と ファイル(0).txt とのどちらが先か後か判別できないから
>>543 では条件不足だったようです。Nを数字として次の条件を利用しないと不可能だと思います。
・(N)が付いていないファイルは、同名の(N)が付いてるファイルより更新時刻が古い
・(N)が付いてるファイルは更新時刻順と名前順が一致する
これで、まず(N)なしのファイルだけ
>>546 でリネームして
そのあとに(N)付きのファイルだけ
>>546 でリネームするというように
2段階で処理すれば右端のようにできそうですが、
(N)なしのファイルだけでLoopを回すことってできるでしょうか?
つ 正規表現
リネームするときに同名ファイルを調べてすでにあったら 重複しないa-zのアルファベットを付加とかじゃだめなのか
>>549-550 配列とハッシュはグローバル変数として扱えますか?
つまり、関数内外で配列とハッシュを使いたいのですが
>>555 どんなスコープでも使えるよ。
global_obj := Object(1, "ほげ", 2, "ふが") ; スクリプトが終わるまで消えない
func1()
func1() {
global global_obj
local_obj := Object() ; 関数が終わる時に消える
local_obj[1] := "hoge"
local_obj[2] := "fuga"
func2(global_obj)
func2(local_obj)
func2(Object(1, "This", 2, "is", 3, "test", 4, "object")) ; この行の式が終わる時に消える
}
func2(obj) {
static static_obj
If !IsObject(static_obj)
static_obj := Object("count", 0) ; スクリプトが終わるまで消えない
static_obj.count := static_obj.count + 1
Loop % obj._MaxIndex()
MsgBox,, % static_obj.count, % obj[A_Index]
}
>>553 ありがとうございます
これで何とかできそうです
>>554 基本的にはそうなんですが
新しいファイルを先にリネームして
古いファイルを後からリネームしてしまうと
時刻順とa-zの順が逆転してしまうのを避けたいんです
サスペンドした時とサスペンド解除した時に音を1回だけ鳴らしたいんだけど サスペンド状態ってどうやって現すの いちいち聞いてたら切りないから、こういう関数?コマンド?を探す時はどこを参照すればいいのか教えてそこのエロガッパ if state suspend = 1 if state = suspend, On if suspend, On if suspend = On if suspend = 1 全部だめ SoundPlay, %A_WinDir%\Media\ding.wav
っ 組み込み変数 (A_IsSuspended)
AutoHotkeyの初心者スレってありませんか?
ここでいいんじゃね。 1レス消費するのに数ヶ月掛かるからわざわざ別けていないと思われ。
>>563 ここで問題ないYO!
質問の仕方に問題なければお兄さんたちが優しくレクチャーしてくれるYO!
>>564 の周りだけ時空が歪んでいるようだNE!
では恐縮ですがここで質問させてもらいます ジョイスティックの十字キーにキーボードのキー入力を割り当てたいんですが可能でしょうか 具体的にはプレステのコントローラをコンバーター経由で繋いでるのですが、 Sendコマンドで他のボタンは認識してくれますがjoyX,Yの反応がありません そして入力信号をキーボードと同じにしたいのです 現状ではボタンを押すとuとdが一回だけログに残ります これをキーボードでキーを押しっぱなしにする、離すという信号と同じにしたいのです なにかヒント頂けると助かります
>>567 ありがとうございますとても参考になります
色々と試してみます
;キーリピートせずにキーを押したままにする場合。
;これが動かないなら
>>7 の Q6
#Persistent
#SingleInstance, force
SetTimer,JoyTimer2,20
return
JoyTimer2:
HoldKyeDownJoy("JoyX", 0, "Left", JoyXLeft) ; コントローラーの左ボタンをキーボードの←にする
HoldKyeDownJoy("JoyX", 100, "Right", JoyXRight) ; 右ボタンを→
HoldKyeDownJoy("JoyY", 0, "Up", JoyXUp) ; 上ボタンを↑
HoldKyeDownJoy("JoyY", 100, "Down", JoyXDown) ; 下ボタンを↓
return
HoldKyeDownJoy(JoyXY, n, key, ByRef JoyXYVar1)
{
JoyStickNumber=2
GetKeyState, JoyXYVar2, %JoyStickNumber%%JoyXY%
if(JoyXYVar2=n) { ;左ボタン
if(!JoyXYVar1)
send, {Blind}{%key% down} ; キーを押し下げる
JoyXYVar1=1
}else{
if(JoyXYVar1)
send, {Blind}{%key% Up} ; キーを開放する
JoyXYVar1=0
}
}
>>569 ありがとうございます
認識されました
十字キーの入力はそれぞれ
JoyY,0(十字キー↑) JoyY,100(十字キー↓) といった風に割り当てられているのでしょうか?
例えば現在spaceが入力キーのプログラムをJoyX,0に置換するとエラーがでます
Joy2ボタンに置換するとちゃんと動くのですがそんな単純なものではないのでしょうか
>JoyX,0に置換 JoyY,0ですすみません
HoldKyeDownJoy(JoyXY, n, key, ByRef JoyXYVar1)
という関数(
>>569 の下半分がそれ)に値を渡して
キーを押したままの状態にしているだけですのでキーリピートはしません。
キーリピートさせたいなら
>>567 のリンク先の699をまるまるコピペで使えます。
HoldKyeDownJoy(JoyXY, n, key, ByRef JoyXYVar1)
の第1引数はコントローラーのX軸(左右)or Y軸(上下)を指定。
第2引数は、左右のどちらか or 上下のどちらかを 0 or 100 で指定。
第3引数はエミュレートするキーボードのキーを指定。
第4引数は第1+第2で指定したボタンの押し下げ状態を格納する変数(押しているなら1、でなければ0)
HoldKyeDownJoy("JoyX", 0, "Left", JoyXLeft)
んで、↑はコントローラーX軸の0(つまりコントローラーの左)で
キーボードのカーソルキー ←(Left)を押したままにする、ということ。
それと
> if(JoyXYVar2=n) { ;左ボタン
の「;左ボタン」というのは全く関係ないので無視してね。
> JoyStickNumber=2
これはテストした私のPC環境のコントローラーIDが2だからです。
適当に修正して使ってください。
それとやりたいことをもっと具体的に書いてください。
自分で書いたスクリプトを載せてもらったほうが解りやすいアドバイスがつきますよ。
AutoHotkeyの基本は
>>1 の「AutoHotkeyを流行らせるページ」に詳しく解説してあります。
単純にキーやボタンにアプリの起動やキーマクロを割り当てたいだけなんだけど 押し心地がよくて場所をとらなくてかつシンプルでかっこいいような キーボードとかテンキーとかジョイスティックとかないかなあ そういう視点で見るといまいちいいのがない。。。
っ 自作
今まで猫まねきでしかキーを変更出来ないアプリがあったんだけど このような恐らくドライバレベルでキーを弄ってると思われる プログラムにAHKでキーを渡せる方法って何かありますか?
ってテンプレみる限りAHK単体では無理っぽいのかなぁ
16進数の数字を10進数にしたいのですがそんな関数ってないでしょうか?
0x付けときゃ勝手に数値になるだろ
Process, Close, AAAexe と書いたのですが 実行しているユーザーが自分であれば終了するのですが SYSTEMが実行しているものが終了されません 何かよい方法はないでしょうか
ビルトインコマンドでやるのはあきらめて、"taskkill"をRunすりゃいいんじゃないのかね
>>582 taskkillで書いたbatファイルを実行と言うことですか?
直接実行でもバッチ経由でもどっちいいんでないの RunAsとかで別ユーザで起動するとATOKのトレイが残るからWinWaitCloseで待ってから Run, taskkill /fi "username eq administrator" /fi "imagename eq atok20mn.exe" とかやってる
autohotkey_lで ハッシュの要素数を数え上げる処理をしたいのですが うまくいきません hoge := Object() key1 := "test" key2 := "hoge" key3 := "bar" hoge[key1] := "あああ" hoge[key2] := "いいい" hoge[key3] := "ううう" msgbox,% hoge._MaxIndex() ;;; => 3 と表示したい どこにミスがあるのでしょうか?
>>584 ありがとうございます。
batだと結局画面が出てきてしまうのでjava script作ってRUNする形で逃げました^^;
>>587 ドキュメントの和訳ですか!ありがとうございます。参考にします
>>587 585じゃないけどすばらしすぎるw
サイト作ってよw
10秒ごとにプロセスを監視して対象があればプロセス終了、再起動というのを作ってコンパイルしたのだけれど 実行すると右下のタスクアイコンに表示されますよね。 これを不可視にしてバックグラウンドで動かすことは可能ですか? 不可視モードで起動するって言うのはauthotkeyはないような。
>>591 ありがとおおおおおお(人-)謝謝(-人)謝謝
>>577 倍率や回転操作がスライダーで細かく出来て面白そうだったので
下記3つの追加/修正したものをそのリンク先に
ファイル(HkSaiSlider_for_JoyStick_0001.zip)としてうpした。
・JoyStickの上下でズーム、JoyStickの左右で回転(上下で回転、左右でズームも可)
・スライダーの位置の記憶(記憶する/しないを選択可)
・角度回転時にループ
エディタのxyzzyにキーを送りたいのですが、うまくいきません。 下記のように F6:: ControlSend,, ^o, xyzzy return のように書いたのですが、^oが送られないみたいです。 他のアプリ(notepadなど)へはOKです。 WinActivateして、Sendする方法ではキーは送れたのですが、そうすると現在のアプリの裏でバックグラウンドでキーがおくれません 多分アプリ自体ではなくアプリウインドウ内に(?)に送らないといけないのですが、どのようにしたものでしょうか?
AutoHotkey_L更新
http://www.autohotkey.net/~Lexikos/AutoHotkey_L/ Revision 39 - December 2, 2009
* Fixed (Debugger): Error in Base64 decoding used by property_set.
Revision 40 - December 13, 2009
* Changed meta-functions and multi-param behaviour to improve flexibility.
Meta-functions are now invoked *before* searching for an appropriate field in each base object;
however, values in x.base will override meta-functions defined in x.base.base.
Chaining meta-functions (inheritence) is now possible by avoiding "Return"
* Improved Default Base functionality to be more consistent with real objects.
* Changed (Debugger): While stepping through code, skip all braces except those which end a function.
* Changed (Debugger): When stepping onto the hidden "Exit" at end of the script,
consider it to be *below* the last physical line to avoid confusion.
baseの継承の仕方がちょっと変わった。
これは仕様が固まるまで手を出さない方がいいかな てかもう何がなんだか・・・
>>593 まさに求めていたのはその動作でした
上下ズームと回転の割り当てができました
ただ残念なことに自分のだと同じ倍率をブルブルと行った来りしてうまく動きません
ブルつきながらもズームはしているようなのですが一定位置で止まってそこから動きませんでした
数値を変えたり色々と試してはいるんですがどれが直接起因しているのかまだ掴めていません
そこで動作している以前のスクリプトにjoy部分を組み込んで見たのですが今度は脱出処理が悪いのか
断続的な入力になってしまいキー入力のようにスムーズになりません
おしいところまでは来ていてあと一歩だと思うのでもう少しサイトで勉強してみます
お手数かけました
>>597 中の説明にも書いてるけど、SAIを起動してからスクリプトを実行しないとそうなるよ。
また、スクリプト実行後にナビゲーターサイズを変更(横幅の変更)すると正常動作しない。
毎回ナビゲーターの幅(スライダーの長さ)をチェックしてもいいんだけど、
ナビゲーターサイズ(スライダーの長さ)を頻繁に変更することはまずないだろうから
前仕様のままにしてる。
>>599 X := W/2
の部分を
X:=x+(w/2) ; SAI Wikiで公開されているもの
に置き換えてみては。
うちの環境は X:=x+(w/2) だと動かないので X := W/2 に置き換えてる。
それが影響してるかも。
>>600 うーん変わらないですね…
なぜかナビゲータのサイズが変わっても動作に影響が出ないです
なんとなくドラッグのループ処理がうまくいってない気がするのでそこら辺から切り崩してみます
PCに搭載されている物理搭載メモリ量を取得したいのですが、何か良い方法ありませんか?
キター!できました! 回転角度のループを止めてSliderAdjSizeを30000ぐらい増やしたら綺麗に動きました さっきまでが信じられないくらい安定してます これもみなさんのおかげです 長々と初歩的な質問に付き合って頂きありがとうございました
>>603 >>600 の部分を変更した場合、下記を変更する必要があった
k=4
Loop
{
; 回転角度をループ
if Ttext=回転角度
nowX := (nowX>=SliderW-k ? k : (nowX<=k ? SliderW-k : nowX))+minADD
else
nowX := (nowX>=SliderW-k ? SliderW-k : (nowX<=k ? k : nowX))+minADD
の部分を
k=4
SliderX2:=SliderX-(SliderW/2)
SliderW2:=SliderX+(SliderW/2)
Loop
{
; 回転角度をループ
if Ttext=回転角度
nowX := (nowX>=SliderW2-k ? SliderX2+k : (nowX<=SliderX2+k ? SliderW2-k : nowX))+minADD
else
nowX := (nowX>=SliderW2-k ? SliderW2-k : (nowX<=SliderX2+k ? SliderX2+k : nowX))+minADD
これで回転がループしないなら、各変数をTooltipやMsgBoxで表示させつつ
動作確認すると問題箇所を見つけやすいよ。
それと、If文は条件に一致したら直ぐしたの行を実行するので、
そこに空行(改行)を入れたらIf文の意味が無い。
{ }で括ってブロック化している内側なら空行(改行のみ)を入れても動くけど。
>>604 重ね重ねすみません
これで完全動作に近づけます
スクリプトがこんな便利で強力なものだとは知りませんでした
ちょっとづつ他の動作にもトライしてみます
vkXXscYYY & Z::Send,^ で^が入力されないんですけどなんでですか?
>>606 なんでXとかYで隠して質問をわかりにくくするの?
Send, {^}
>>606 >>608 が答えているとおり
AutoHotkeyの文字出力でまず躓くのは、
修飾キー(+=Shift,^=Ctrl,!=Alt,#=Win)そのものを出力するには
波括弧でくくらなきゃいけないということ
みなさんありがとうございました。 本当助かりました。
GuiControl,-Redraw と GuiControl,+Redrawについて質問します
ウィンドウ上にTextやCheckboxを沢山配置しています
どうもコントロールを追加するたびにウィンドウを再描写しているようです
そこで、この再描写を停止し、特定のタイミングで一挙に再描写したいのですが、
GuiControl,-Redraw と GuiControl,+Redrawを使えばこれができますか?
Gui,Add
http://lukewarm.s101.xrea.com/commands/Gui_Add.html >リストビューなどで大量の項目を追加・削除・変更する前に
>GuiControl,-Redraw,ControlIDで再描画を停止し、
>終了後に+Redrawで再開させることでパフォーマンスを改善できる。
私がしたい処理でこれを応用できないでしょうか
カタカナひらがなキーでデスクトップを表示、は vkF2sc070::Run, desktop,C:\Users\Username でできるんだけど、 Altキーを押しながらカタカナひらがなでDドライブを表示したい。 でもどうしてもDドライブを指定する書式が分からん。 ご教示してたもれ
613 :
612 :2009/12/17(木) 00:55:34 ID:s3GWqlW60
書き忘れたけどwindows7です。
run,d:\ でいいじゃん
確かにAltキーを修飾しないとそれでいけた。 !vkF2sc070::Run,d:\ だといけない。 vkF2sc070を何かで囲う必要があるのかな?
Shift,Altは駄目だけどCtrlだけは修飾できた。
でもAltに割り当てられんとあんま意味ない。
まあいいや寝る。とりあえず
>>614 ありがと
これでどうだ? !vkF5:: !vkF6:: msgbox, % a_thishotkey return ;!vkF6はIMEがONの場合
ちょっとスレ違いになるかも知れませんが、 CapsLockとctrlキー入れ替えを、ログオフや再起動せずにできるソフトってないですか? ネットカフェや施設のパソコンなどでは 再起動した時点でレジストリなどはデフォルトに戻ってしまって困っています。 なんとかできる方法ないですかね?
>>617 スゲエエエ 成功した
もうなんでうまくいくのかすらわからないけど
っていうかなんでvkf5なのかもわからないけど
ありがとうございます
ちょっとなんでコレで動くのか考えてみます。
たぶんDirectInputを使うゲームでカスタマイズが有効にならないのですが、こんなもんなのでしょうか? 対処法はないものでしょうか? 窓使いの憂鬱で設定したのはドライバレベルのせいか有効みたいです
窓使いの憂鬱とAHK使ってるけど 窓使いの憂鬱とyamy、のどか AHKとAHKL の違いがよく分からない
624 :
621 :2009/12/17(木) 23:23:20 ID:xLXz75DJ0
>>622 おお!これですよ、これ。詳しい解説ですね。すばらしい。ありがとうございます。
のどかが窓使いの憂鬱のVista以降対応版でちゃんと動くのなら個人的にはレジストしていいな。
しかしyamyは存在意義が難しいですね。LLフックならAutoHotKeyの方が自由ききますからね。
>>623 >>622 のリンク先読んだら詳しく書いてあるよ。
結局のところネカフェや余所のPC触る機会が多い人は ・CapsLockとctrlの入れ換えは諦める ・USBマイキーボードを持ち歩く の二択しかないのかね USキーボードなら日本語OS&AHKでも入れ換え効くんだっけ? リアルフォみたいにハードウェア側でキー入替できるタイプなら万能だろうけど
PS/2キーボード持ち歩いて猫まねきのほうがよくね 再起動はいらないだろあれ
いや、PS/2はPC起動中に挿しても認識しないし、下手すると壊れますよ
信心が足りないから認識しないんだよ Plug and Prayだ
しかしPrag and Preyに
なんという恥ずかしいミス Plug and Prey
そういや猫はUSBキーボードでもPS/2変換コネクタ使えば動いたな ロジのワイヤレスのキーボードも動作した Setpointの設定も動作する 流石にロジのG15には通用しなかったが
変換コネクタかました段階でOS側にはPS/2として認識されるのでは? だとしたら結局再起動しないと動かないと思うけど
ハード板のキーボード系スレ覗いているのかと思ったぞ
話題がないからなー 便利Tipsでも晒せば
ゲームのキーカスタマイズに特化した AHK LowLevel作ってくれ
start := A_TickCount Loop, 100000 var_%A_Index% := 1 dur1 := A_TickCount-start start := A_TickCount arr := Object() Loop, 100000 arr[A_Index]:=1 dur2 := A_TickCount-start MsgBox, % dur1 "`n" dur2 意外だ、代入だけやってみたが、objectの方が全然速いなぁ。
>>637 ありがとうございます。
私の環境ではこうでした
515
125
10万回代入を繰り返したら約400ミリ秒の違いがでました
単純に計算すれば、代入250回あたり1ミリ秒の差が生じるのですか
この差は大きいですね
>>637 これって現状は AHK_L のバージョンだけの機能なんだよね?
Unicode版とあわせてメインと統合してくれないかな・・・
属性を取得して表示するということをやってまして FileGetAttrib,Attrib,%SetF% StringReplace,Attrib,Attrib,R,R 読み取り専用`n StringReplace,Attrib,Attrib,A,A アーカイブ`n StringReplace,Attrib,Attrib,S,S システム`n StringReplace,Attrib,Attrib,H,H 隠しファイル`n StringReplace,Attrib,Attrib,N,N 通常`n StringReplace,Attrib,Attrib,D,D ディレクトリ`n StringReplace,Attrib,Attrib,O,O オフライン`n StringReplace,Attrib,Attrib,C,C 圧縮`n StringReplace,Attrib,Attrib,T,T 一時ファイル`n MsgBox,%Attrib% このように分かりやすく付け足してみて Temporary Internet Filesで試してみたところ S システム H 隠しサ 一時ファイル ァイ 圧縮 ル D ディレクトリ このようなおかしな結果になってしまいました 隠し までは正常でしたが隠しフまで置き換えたところでぐちゃぐちゃ どのような対策ができるでしょうか
>>640 たったの1文字を対象にReplaceしてるから、
置換済みの全角日本語の中に1文字が含まれると化けるんだと思う
「フ」 は 0x83 0x74 の2バイトで構成されている。文字コードの0x74は単体では 「t」。 で、AHKは2バイト文字なんか知らないので、 かつ、StringCaseSense がデフォルトの、大文字小文字を同一視になっている(はずな)んで、 >StringReplace,Attrib,Attrib,T,T 一時ファイル`n のところで置換される Unicode版を使えばそのままのコードで大丈夫なんだけど… 本家でやるなら方法を変えて↓みたくするとか str = IfInString, attrib, R str = %str%R 読み取り専用`n IfInString, attrib, A str = %str%A アーカイブ`n : MsgBox, %str%
>>641-642 ありがとう問題が解決しました
本家を使っているので今回の回答は参考になりました
■ AutoHotkey_L 更新
http://www.autohotkey.net/~Lexikos/AutoHotkey_L/ Revision 41 - December 20, 2009
* Fixed: Floating-point numbers were equivalent to an empty string when used as keys in objects.
They are now converted to numeric strings in the current float format, as originally intended.
■ AutoHotkeyU も更新
http://www.autohotkey.com/forum/viewtopic.php?t=50485 http://ku.myftp.org/~jackie/git/?p=autohotkey.git;a=log;h=HEAD Sat, 19 Dec 2009 17:15:48 +0000
* L41 - Fix floating-point keys in objects; code maintenance
* Fixed floating-point keys in objects - convert to string instead of "".
* Changed AutoHotkey output paths to be tidier.
* Changed lib_pcre intermediate and output paths.
* Added .gitignore for files which should not be tracked.
* Fixed PostBuildSC.ahk for SC (minimum size) configuration.
* Removed unused Object::FindField overload.
Sat, 19 Dec 2009 15:46:29 +0000
* Fixed: A mistake when merged with fincs's codes.
* Fixed: Truncated object properties (string type).
* Changed: TRACE() macro doens't require ATL.
* Fixed: The invalid Unicode character (U+FFFD).
Sendで文字を送りたいのですが、常にIMEをオフにして文字列を送るのにいい方法って無いでしょうか? 今はこんな感じで、どうにかやっているのですが うまく切り替えられないことが多く、日本語入力のままで変な風に送られてしまう事があります Send, {vkF2sc070} ;[ひらがなカタカナ]キーで一度IMEをONにする。 Sleep 200 Send, {vkF3sc029} ;[半角/全角]キーでIMEをOFFにする。 Sleep 200 Send, %str%
>>644 >Floating-point numbers were equivalent to an empty string when used as keys in objects.
この意味がいまいち分からない
object のキーとして浮動小数点を使用したときには、
(そのキーに結びつけられる)値を文字列0にするってこと?
>647 使ってないのに推測で答えるけど浮動小数点数だとまともに等値の判別が できなくてキーとして使えないから空文字列として扱うってことだと思う。
キーとして空文字列を指定したとして扱うってことじゃね。
>>648-649 なるほど
empty string って空文字のことか
早とちりしていた
ありがとう
> * L41 - Fix floating-point keys in objects; code maintenance > * Fixed floating-point keys in objects - convert to string instead of "". こっちの方が分かりやすい。
autohotkey_lのサイトにつながらない autohotkey ドメインのほかのページにはつながるのに もしかして閉鎖した?
ちゃんと繋がるけど
そのURLだよ。鯖も生きてるし、内容もちゃんと取れる。 セキュリティソフトのログみるとかするなりして、別の要因を探ってくれ。
656 :
621 :2009/12/23(水) 10:46:15 ID:EMukRKRg0
>>635 ドライバ署名取得で法人化が必要なため、3000円/台のライセンスになr(ry
UAEオンの状態でSendPlay使うのに、自己署名証明書つけてコンパイルし直してるんだけど、 ドライバ署名も自己署名でいけないのかな? 自作のCAをシステムに登録してさ。
アラブ首長国連邦乙。UACでした。
>>9 のCtrlおしっぱでアラートだすスクリプトですが、
単体で(ctrl_alert.ahkとかで保存して)実行すると動くんですが、AutoHotKey.iniに書くとうまく動いてくれません。
うまく動かす方法ないでしょうか?
AutoHotKey.iniで
#include ctrl_alert.ahk
してもうまくいかんです。
どういう風にうまくいかないんだよ・・・ エスパーじゃないんで分からんわ
・サブルーチンラベル「Alerter:」以降はIniの最後に、それより前はAutoexecセクションに貼る。 ・グローバル変数が被ってるなら変更す
関係ないが、
>>9 で使われている三項演算子って書き方が、
ahkを2年ゴリゴリ使っていてもいまだに、ぱっと見ただけではさっぱり理解できないわ。
人のプログラムを順番に読むときなどで、まず上から下へ、
同一行では左端から右端へ読んでいくよね。
左端が命令かと思って読んでいって、行内で「?」マークが登場したとたん、
左端は単なる命令じゃなくて、条件になるんだよね。
俺はifでちゃんと全部バラすのが、他人にも理解しやすい書き方な気がする。
三項演算子ってのは、コードの圧縮以外にどんなメリットがあるの?
コードの圧縮がメリットなだけだろ。 特にこういう所に書くには行数を減らさないといけないし。
If (a > 1) hoge :=10 else hoge := 20 よりは hoge := (a>1) ? 10 : 20 の方が式1個なので速い。 ただし hoge := (a>1) ? 10 : hoge だと If (a>1) hoge :=10 よりは遅い
>>659 AHKファイルの場所指定が間違っているとかいうオチ?
>>665 繋がる
てか繋がらんという奴はプロキシさすとか
他の所から落とすとかは考えないのか?
繋がらないからプロキシ、なんて普通考えないだろ 動画サイトとかならともかく
autohotkeyだけでbigIntを使えますか?
64ビット符号付き整数までサポート
StringReplaceで改行を他の文字に置換できないんですが、仕様ですか?
んなーこたぁない str = ( 1行目 2行目 3行目 ) MsgBox,, Original, %str% StringReplace, str, str, `n, <br>, All MsgBox,, Replaced, %str% 多分 FileRead でテキストモードで読んでないのではないかとエスパー。 AHKでの改行は内部的にはLF(0x0A)なので、SJISのCRLF(0x0D+0x0A)だとCRが残る。 テキストモードで読み込むと、CRLF→LF変換して変数に格納してくれる。 FileRead, str, *t data.txt
>>672 さすがエスパー。FileReadで読んでます。
ちょっと試してみますね。ありがとうございました。
filereadで変数に入ったファイルで、文字コードがEUCのものがあります。 これをAHK内部でShiftJISに変える方法なんて、ありますか? nkfという外部コマンドでためしたところ速度が遅すぎて実用的ではないことと、 できればEUC形式のファイルを読んだ後に、ahk内部で変換をやりたいです。
ConvertINetMultiByteToUnicode
直接変換するときにはConvertINetStringか 日本語のMSDNには載ってないから注意
ファイルをexeにドロップしてIniWriteしたら exeのディレクトリではなくドロップしたファイルの ディレクトリにiniが作成されるんですが 絶対パスを指定せずにexeのディレクトリにiniを作成するには どうすればよいでしょうか?
A_ScriptDir
なるほど ありがとうございました。
他のスクリプトに簡単に切り替える方法はありますか? 今は、一度 ahk を終了し、再度別のスクリプトで起動していますが、やや面倒。
両方に、トレイメニューなり、ホットキーなりをトリガーにして、 Run, %A_AhkPath% "切り替え対象スクリプト.ahk" ExitApp とかにすればいいんじゃないのかな。 もし頻繁に切り替えるようなら、二つのスクリプトを統合して何らかの変数で動作を 切り替えるようにするのも手だと思う。 また、ウィンドウ毎にホットキーを変えたいという理由でスクリプトの切り替えをしているなら、 #IfWinActive を使えばアクティブウィンドウ毎にキー定義を返ることが出来るので検討されたし。
>>682 >Run, %A_AhkPath% "切り替え対象スクリプト.ahk"
>ExitApp
ありがとうございます。やってみます。
#IfWinActive などは、一部使っているのですが、なるべく簡単なスクリプトにしておくほうが
いいと思い、わざわざ手動切り替えしていました。
GUIでコントロールごとにドロップの受付の可否を決めることは出来ないのでしょうか?
標準機能じゃできないかも GuiDropFilesサブルーチンで A_GuiControl を参照してどこにドロップされたかを 判断して処理分岐すれば実質的には変わらない感じになるけどね Gui, Add, Edit,w300 r3 vEdit1 Gui, Add, Edit,w300 r3 vEdit2 Gui, Show, h200 Return GuiClose: ExitApp GuiDropFiles: If (A_GuiControl="Edit1") GuiControl,, Edit1, % A_GuiEvent Return
なんだか基本的な質問で申し訳ないのですが、 Win + WheelDownでWin + {+} という事がしたいのですが、(Win7で拡大鏡操作) LWin & WheelDown::SendInput,{LWINDOWN}{+}{LWIN UP} ;(←いろいろ試したあげく妙な組み合わせ状態) という記述ではアクティブウィンドウに+が送信されてしまったりします。 Win & WheelDown :: run,〜〜;という例は良く見つかるのですが、 既出だとは思いますがヒント頂けないでしょうか。よろしくお願いします。
"ファイル名を指定して実行" の入力内容を得るにはどうしたら良いでしょうか。 au3_spy の "TitleMatchMode=slow Visible Text" の部分だけを取りだしたいのですが、 DetectHiddenText と WinGetText を組み合わせてもうまくいきませんでした。 また入力部分のクラスは "Edit1" らしいのですが、ここからは入力内容は取れませんでした。 宜しくおねがします。
そんなところの文字列を取得して、なにをやりたいのか不明だけど、 win7で ControlGetText,var,ComboBox1,A または ControlGetText,var,Edit1,A で取れたよ。これを0.1秒ごとに連続で監視して、 ウインドウが消滅した時点の文字列を確定にする・・・とかかな
689 :
687 :2009/12/27(日) 06:42:14 ID:Kmr3Y67d0
>>688 できました!!
目的は "ファイル名を指定して実行" をちょびっと便利に使おうというのが目的です。
Windows 7 x64 にしたら、今まで使っていた 32 ビット型コマンドラインランチャーは
System32 内のファイルを直接たたけないことが分かったので、
"ファイル名を指定して実行" を使って、欲しい機能は AHK で実装しようという試みです。
流行らせるページのWheelRedirect.ahk Win7のcmd窓で動作しない気がする。 動作しないというか、アクティブでもスクロールしないw(およそ原因は理解できる)
MouseGetPosでclassNNがとれないからでしょ
うん、その回避方法も知りたかったんだけどw とりあえずctrlは諦めてhwndで代替する例(cmd窓なら問題ないだろう) *WheelDown:: CoordMode,Mouse,Screen MouseGetPos,x,y,hwnd,ctrl,3 wp:=0xFF880000|GetKeyState("LButton")|GetKeyState("RButton")<<1|GetKeyState("Shift")<<2|GetKeyState("Ctrl")<<3|GetKeyState("MButton")<<4|GetKeyState("XButton1")<<5|GetKeyState("XButton2")<<6 lp:=y<<16|x IfWinExist,ahk_id %hwnd% { if ctrl = SendMessage,0x84,0,%lp%,,ahk_id %hwnd% else SendMessage,0x84,0,%lp%,,ahk_id %ctrl% If ErrorLevel=4294967295 MouseGetPos,,,,ctrl,2 Loop,%A_EventInfo% if ctrl = PostMessage,0x020A,%wp%,%lp%,,ahk_id %hwnd% else PostMessage,0x020A,%wp%,%lp%,,ahk_id %ctrl% } return
693 :
名無しさん@お腹いっぱい。 :2009/12/27(日) 20:45:01 ID:00vfL9BD0
前のスレでも幾つかでてきたと思いますが 流行らせるページのサンプルスクリプトのうち うまくうごかないものが一定数でてきているかと思います 簡単なものでもかまいませんから、どなたかまとめてくれませんか
隗より始めよ
環境によって失敗する関数、とかが判ってないと、環境依存したスクリプトが多く投稿されてしまうとは思うね。
Win98系→NT系ほどではないけど、Vista/Win7で随分デスクトップ周りが変更されたみたいだし。
>>686 わからんがsend先を何かいじってみるとか?
関係ないが結構おもしろいなこれw>ルーペ
はやらせるページに載ってた下記のコマンド
Transform,Clipboard,Unicode,%string%
Transform
http://lukewarm.s101.xrea.com/commands/Transform.html Clipboardを経由して、UnicodeをShiftJISに変換してる。
これを、1分に1回の頻度で24時間実行していると、数ヶ月に1回ほどの低頻度で
「Can't open clipboard for reading」
と出てしまう。
このダイアログが出ると、スクリプトが完全に停止してしまうため、困った。
なにか回避方法ないかな?
697 :
687 :2009/12/28(月) 02:10:53 ID:z/Ki7tCx0
Windows 7 上で、AHK のスクリプトを管理者権限で走らせています。 ここから、通常のユーザー権限で別アプリケーションを起動するにはどうしたら良いでしょうか。 RunAs を使ってみましたが、イマイチ期待通りに動作しません。
これを使用したいのですが、どこかに初心者用の導入ページありませんか?
>>8 のように
@使うソフトによってキーマップを切り替えて
Awaitを使って1行の簡単なスクリプトを動かしたいです。(Qのあと15ms秒後Fを押す)
おしえてください。
>>698 >>1 の
AutoHotkeyを流行らせるページ
以外の大きなサイトは多分ない。
初心者には敷居が高いのは事実なので、2,3日悩むのは覚悟した方がよろし。
Aに関してのヒントを書くと、waitに相当するのは主にsleepだよ。
>>699 ご親切にありがとうございます。
初心者向けのサイトみてみたがほんとになさげですね。
覚えらんない人のためのオンラインソフト備忘録さえも
軽くしか触れてないし。
すげー革命的なソフトっぽいのに
キーマップの切り替え、簡単なwaitということなら
窓使いの憂鬱つかえということなんですが、
先を見越して包括的なソフトのAHKに移りたいんですよね。
年末年始全部これに費やしそうで怖い
>>700 繭スレに誤爆してるぞw
繭もAHKもウィンドウ毎にキーマップ定義するのは同じくらいの労力だよ
簡単な例:メモ帳で[Ctrl]+[1]を雄とウィンドウの端で折り返しをトグル
#IfWinActive, ahk_class Notepad
^1::Send, !ow
上の例が分かれば、必要な分だけ似たような構造で書き連ねるだけ。
これ適当な所に記述しとくとスクリプト書くのに楽だよ ;hogehoge.ahkが開いている時は、F5キーで上書き保存後にリロード #IfWinActive,hogehoge.ahk F5:: Send,^s reload #IfWinActive
>>701 うはwwwまじだwww 向こうに訂正レスしてきます。
レスありがとうございます。教えてもらった情報をつかって
ちょっとづつ設定してちゃんと動くようになってます。
過去スレとか教えてもらった情報を抜粋して紙ソフトに残していっています。
なんとか目処が立ちそうです。sleepもちゃんと動いてくれたし。
たどりつきたいところまでははるかに遠いですが前進してるのはわかるのでまだ楽だわ。
ただ疑問が山のようにあるw
>>702 スクリプトを書き直してリロードの際に使わせてもらいます。
いままでクラフトランチでやってました。頻繁にリロードしますし
Win7に以降してから、キーのリピート(と言ったらいいかわかりませんが・・・)で困ってしましました。 XPだと、例えば #IfWinActive,Microsoft Excel ahk_class XLMAIN ^l::Send,^{PgDown} ;右のシートへ移動 と記述したら、Ctrlを離さないでlを押し続けると、さらに次のシートへ移動できたんですが Win7だと機能しません。 他の記述を全部なくしてこれだけにしても、フックを使っても使わなくてもダメでした。 OSの仕様が変わったからなのでしょうか?何か解決策ありませんでしょうか?
うぉWIN7に、シームレスに移動できんのか。
>>704 windows7だが
いくよ?
#IfWinActive,Microsoft Excel ahk_class XLMAIN
^l::send,^{PgDn}
でCtrl離さないでLで次のシートにいける。
707 :
704 :2009/12/29(火) 00:36:33 ID:cVve7R7N0
>>706 すみません、常駐一個一個切っていったらyamyが原因でした。
これでのCtrlとCapsLock入れ替えが怪しいかと。
でもXPではきちんと動いていたので、いろいろ試行錯誤してみます。
yamyとautohotkeyって同じhook を使用していた気がする 競合しやすいのでは?
質問があります. 基本すべてのアプリケーションに同じキーバインドをしようとしてます ただ,一部例外があって,複数の例外アプリを指定したい場合は どうすればいいんでしょう? #IfWinNotActive ahk_class MozillaUIWindowClass #IfWinNotActive ahk_class Notepad とすると,最後に指定したアプリは例外として扱えますが, 最後以外はキーバインドが適用されてしまいます.
初歩的な質問ですが、質問させてください。
特定のウィンドウでのみのリマップに抜け道を作る方法を
教えてください。
別ソフトのグローバルホットキー(Ctrl+Space)を生かしておきたい
一方でとあるソフトにSpace:T を割り当てたいのです。
つまりSpeceオンリーのときはTを割り当てたいのですが、
Ctrl+Spaceのときはいままでどうり別ソフトのグローバルホットキー
を働かせたいのです。
http://lukewarm.s101.xrea.com/remap.html の下から2・3行目に
Hotkey, *a, off
という表記がありますがこの箇所の説明がまったく
わかりません。Hotkey, *space, off では抜け道つくれませんでした。
前後につける文字列が間違っているのかもしれませんが。
~space:: のように記述するとどちらの設定もワークしてしまいます。
以下のように現在記述しております。
#IfWinActive,ahk_class TextEditorWindow
Hotkey, *space, off
Hotkey, *space up, off
Space::t
すいません。よろしくお願いします。
やり方としては、リマップをしないでホットキー定義を行う。
リマップはキー自体を他のキーに置き換えるから。(
>>3 Q&A2参照)
Space::Send, t
とだけしておけば Space 単独押下の時だけのキー割り当てとなる。
※ Hotkey〜はコマンドなので、実行時にその行を通った時しか有効じゃない。
>>712 申し訳ないです。ありがとうございました。テンプレを読み返すべきでした。
sendを一度試してみるべきだとは一度頭をよぎったのですが。
これからは人に聞く度合いのしきい値をあげようと思います。
一部の機能しか使っていませんが、ほんとにいいソフトですよね。
プログラムに若干興味がでてきます。
ありがとうございました
訊ねるしきい値を上げるより、頭を過ぎったことを試す方が先じゃね?
あ、しきい値を上げるのか。スマン。 書き込みのしきい値を上げてくるわ・・・
新規オブジェクト作って、ファイルを1行ずつ読んで格納するだけでしょ。
Numpadに対応した方向移動を行うゲームにおいて (たとえばnum7だと左斜め上、num6だと右といったような) W(上)A(左)S(下)D(右)で操作したく、苦心しております。 W押下中にnum4を連打、といったスクリプトはなんとか出来たのですが、 W押下中に、さらにAを押下するとその間num7を連打、といったものは出来ないでしょうか。 w:: SetKeyDelay,50 Loop { Sleep, 10 GetKeyState, state, w, P if state = U break Send,{vk26sc048} ;num4を送る GetKeyState, state, a, P if state = D Loop { Sleep, 10 GetKeyState, state, a, P if state = U break Send,{vk24sc047} ;num7を送る } } return これでは反応してくれませんでした。
w::WasdFunc("NumPad8", "a", "Numpad7", "d", "NumPad9") a::WasdFunc("NumPad4", "w", "Numpad7", "s", "NumPad1") s::WasdFunc("NumPad2", "a", "Numpad1", "d", "NumPad3") d::WasdFunc("NumPad6", "w", "Numpad9", "s", "NumPad3") WasdFunc(defaultKey, case1, key1, case2, key2) { key := GetKeyState(case1, "P") ? key1 : GetKeyState(case2, "P") ? key2 : defaultKey Send, {%key% DownTmp} }
>>719 横レスだが
GetKeyState をそういう風につかうという発想に驚いた
何かに転用できそうだ
ゲームってことはWおしながらA押して、A離したらWが反応してほしいだろうから スマートじゃないけどこんな感じ? w:: s:: a:: d:: Loop { Sleep, 10 GetKeyState, stateW, w, P GetKeyState, stateS, s, P GetKeyState, stateA, a, P GetKeyState, stateD, d, P if(stateW = "D") { Send, % stateA = "D" ? "{Numpad7}" : (stateD = "D") ? "{Numpad9}" : "{Numpad8}" }else if(stateS = "D") { Send, % stateA = "D" ? "{Numpad1}" : (stateD = "D") ? "{Numpad3}" : "{Numpad2}" }else if(stateA = "D") { Send, {Numpad4} }else if(stateD = "D") { Send, {Numpad6} }else{ break } } return
みんな三項演算子好きだよなw
三項演算子好きについて C言語「キサマらの居る場所は既に我々が30年前に通過した場所だッッッ」
>>719 ,721
まさに求めていた通りの動作でした。
諦めかけてましたがこんなにあっさり上手くいくとは!
おれテンプレもまともに読まずに質問してたな。 それだけ文字読むのを苦にしてるっつーことか
#IfWinNotActive ahk_class Chrome_WidgetWin_0 が無視されるわ クラス名Notepadに変えたらうまくいくから、chromeのクラス名まちがってんのかなぁ・・・
>>726 Chrome_WindowImpl_0
じゃない? Window Spy(AU3_Spy.exe)で調べたらいいよ。
>>727 うおおおおおおお!!!!
それでした。さっきはじめてwindow spyなるものも知れたし、勉強になるなぁ。
729 :
名無しさん@お腹いっぱい。 :2010/01/04(月) 12:35:52 ID:BP1by4Om0
#IfWinActive ahk_class Notepad #IfWinNotActive ahk_class Notepad こういう書き方をしたときって、条件以下の記述にすべて影響するじゃないですか。 Break的なものってないんですかね。
#IfWinNotActive の1行を入れるとそれ以降はウィンドウに関わらない設定になる。 AHK_Lでは #If だけの行でもいい
間違えたw #IfWinActive の一行な
おおおお!!なるほど クラス指定しないifwinactiveを入れればいいのか! ありがとう!!
UNICODE版でmsgboxとかに日本語使ったら文字化けするんですが仕様ですか?
もちろん仕様 お前は使うな
~RIGHT & Shift::Send,xxx が動くのに、 ~RIGHT & Ctrl::Send,xxx が動かない。。 なんで?
妙な組み合わせだな Lexikos版かUnicode版で #If GetKeyState("Right") Shift::Send, xxx Ctrl::Send, yyy
>>737 派生版があるの知らなかった
試してみますサンクス
体が金色になって手が真っ赤に萌えるのか
メモ帳とかにアンダーバー"_"を送ろうとした時、Sendコマンドだとちゃんと"_"になるのですが ControlSendコマンドだと"\"になってしまうのですが何故でしょうか?
XMLSocketの接続はできるかしら 躓いてしまいました
742 :
名無しさん@お腹いっぱい。 :2010/01/08(金) 10:52:45 ID:FalgWUZ70
流行らせるページのInputの説明に 「入力を待っている間は、ホットキーやメニューなどで新たなスレッドが割り込むことが可能。」 とありますが、新たなスレッドが割り込まないようにするにはどうすればよいですか?
suspend
744 :
742 :2010/01/08(金) 11:44:54 ID:FalgWUZ70
>743 おおなるほどっ! ありがとうございました。
745 :
742 :2010/01/08(金) 15:33:41 ID:FalgWUZ70
すみませんさっき質問した者です。 以下のスクリプトで1秒以内にキーボードでABと入力した場合、 「ab」と入力されると思ったのですがなぜか「ba」と入力されます。 なぜ順番が入れ替わってしまうのか教えてください。 また順番が入れ替わらないようにする方法があったら教えてください。 $a:: Input,var,T1, Send,a Return $b:: Input,var,T1, Send,b Return
aのinput待ち中にbが割り込んでsend,bして戻ってsend,aするからbaになる
747 :
742 :2010/01/08(金) 16:31:35 ID:FalgWUZ70
>746 割り込みの意味をちゃんと考えていませんでした。 たしかにその通りですね。 うまい回避方法はないでしょうか。
その例だと最終目的がちょっとよく分からない (ただの例なのか、大文字に変換したいのか) Inputを使っている理由も。 特定キーで文字を出力したいならHotstringを使う手もあるよ
なにがしたいのかよくわからんが criticalにするとか
750 :
742 :2010/01/09(土) 14:30:29 ID:AxEDv1940
アクセス規制でレス遅れました。 >748 親指シフトのエミュレータを作ってみようと思っています。 アルファベットキーに対してシフトキーが少し遅れた場合にもシフトキーを有効にするためにInputを使っています。 >749 Criticalでうまくいきました! ありがとうございました。
ひさしぶりにスレを覗いたらAutoHotKeyが大変化している! AutoHotKeyLにUだと…!?
_U 使ってみたらMouseGesture.ahkの設定ダイアログがズレちまってたので戻した 誰か書き換えてくれー
753 :
名無しさん@お腹いっぱい。 :2010/01/09(土) 18:29:42 ID:WyQWf7vU0
キャレット位置にマウスカーソルを移動するのはA_CaretX、A_CaretY、MouseMoveで出来ますが、逆に マウス非対応テキストエディタ等でマウスクリック位置にキャレットを直接移動させる方法はありますか? MouseGetPos, xpos, ypos A_CaretX := xpos A_CaretY := ypos ↑こんな感じで出来るかなと思ったけど駄目でしたorz
多分無理。そもそも組み込み変数は読み取り専用で、代入しても意味がない。 具体名が無いから分からないけど、汎用のWinAPIも多分通らないんじゃないのかね。
>>753 速さを売りにしているライブラリか
おもしろそう
>>754 >マウス非対応テキストエディタ
なにそれこわい
>>755 が言うように、具体名がないとなんとも言えん(´・ω・`)
コマンドラインのBATコードを、ahkの内部でfileappendで作成し、 runwait , GenerateNow.bat , , hide で起動して、バックグラウンドで定型処理をさせる使い方を多用しています。 コマンドライン中でエラーが出たときなどで「再試行しますか?」などのキー入力を 求められるとき、ウインドウにアクセスすることが出来ず手詰まりになってしまいます。 runwait , GenerateNow.bat , , min で最小化で起動すれば、このようなエラー時の対処が可能ですが、 これだとプロセスを起動するごとにタスクバーに新規ウインドウがチラチラ出現してしまい、 日常の作業に支障が出てしまいます。 そこで質問ですが、普段はhideで進行させておき、キー入力を求められる状況になったときだけ、 コマンドプロンプトの対話ウインドウを開く方法なんて、ないでしょうか。 あるいは、バッチ側の処理として、errorlevelが通常の処理以外じゃないときに、 エラーフラグの役割をさせるファイルを、特定の場所に作成します。そのファイルの存在を ahk側で監視して、ファイルの存在を確認できたときに、ahk側からhideのウインドウを表示状態にする。 、、、なんてことは可能でしょうか。
runwaitじゃなくてrunで起動して プロセスがいなくなるorエラーファイルの存在を タイマかループで監視したらいいんでない? 個人的にはわざわざbat生成せんでもAHKのrunコマンドで 順次処理させてしまいたいところだが、標準入出力の処理が めんどくさいことは変わらないか
760 :
754 :2010/01/11(月) 13:25:28 ID:GIcwgxCp0
マウス非対応テキストエディタはEngineer's Padです。 DllCall()、SetCaretPos()、SetSel()あたりでもうちょい試行錯誤してみます。
Guiで、ウィンドウ全面にAero Glassが利いてるようなGUIって作れませんか?
Windows 7 で AHK_L Unicode を使用しています。 ジョイスティックの入力を A_TimeIdle に反映させるにはどうしたら良いでしょうか。
>>761 半透明ならTransparent設定で手軽にできるけど、それ以外は厳しいんじゃないかな
>>762 操作したかどうかをボタン押下と方向ボタン入力を監視。
操作したと見なしたら、マウスをちょっと動かすか、キーを送る
マウスなら1ドット左右に振る(MouseDeleyとSpeedは0に)、など。
キーならF24とか使わなそうなのを送る、など。
765 :
762 :2010/01/12(火) 00:39:54 ID:NgEiRFRt0
>>763 なるほど、そういう手ですね。
ちょっと試してみます。
ありがとうございました。
知恵を拝借できないでしょうか? ControlSendを使って非アクティブのアプリを終了させたいのです。 単機能ソフトのCloseを使ってプロセスから終了させるとOSがシャットダウンしてしまうので 当該アプリのバーにALT F4を送るようにしたいのです。カーソルを当該アプリのバー上で クリックしてからALT F4を押すと異常なくアプリが閉じてくれます。 終了させたいアプリはFEATHER2006というキャプチャーボードのテレビ視聴ソフトで、 画面の端にバーとして張り付くタイプのものです。(隠れたりするモードにも設定でできます) 次のように試しに書いてみました。 #n:: DetectHiddenWindows,On ControlSend,FEATHER_App1,!F4,ahk_class F2006_AppBar return 上を試してみたのですがまったく反応がありません。 AU3にて取得した当該アプリバーの情報は次のとおりです。
>>>>>>>>>>( Window Title & Class )<<<<<<<<<<< ahk_class F2006_AppBar >>>>>>>>>>>>( Mouse Position )<<<<<<<<<<<<< On Screen: 1220, 603 (less often used) In Active Window: 116, 603 >>>>>>>>>( Now Under Mouse Cursor )<<<<<<<< ClassNN: FEATHER_App1 Text: FEATHER Color: 0xF0F0F0 (Blue=F0 Green=F0 Red=F0) >>>>>>>>>>( Active Window Position )<<<<<<<<<< left: 1104 top: 0 width: 176 height: 994 >>>>>>>>>>>( Status Bar Text )<<<<<<<<<< >>>>>>>>>>>( Visible Window Text )<<<<<<<<<<< FEATHER CTL sendmessageならできそうというレスを過去ログでみたのですが あまりにも難解っぽくヒントがないのでControl Sendでやってみようと思っています。 ご教授いただけないでしょうか?よろしくお願いします。
>>767 #n:: WinClose, ahk_class F2006_AppBar
または
#n:: WinKill, ahk_class F2006_AppBar
はどうですか?
>>768 ありがとうございます! 実現できてちゃんと動きました。
すぐに回答いただきほんと助かりました。
WinCloseっていう式があったのはじめて知りました。こういう式の一覧が
流行らせるページにあるんだろうか、まだ読み込んでいないみたいですね。
AHKは凄い
非アクティブのウインドウ・アプリ操作もできるようなことが私にとって
AHKにかなり魅力を感じたのですが、さっきのControl Closeのなにが
駄目だったのか気になります。これから非アクティブの操作しようと思っても
同じところで行き止まりになる気がします。
とにもかくにもありがとうございました。助かりました。引き続き調べてみます。
!F4→!{F4} じゃね
>>770 レスありがとうございます。
そこ前から気になっていたので両方を何度も試したのですが
無理でした。{F4}って書き方は以前から迷っているやり方で気にとめていました。
いまやってもやっぱり無理でした。アプリ側の問題なのかな。
>>772 リンクありがとうございます。その一覧上から下まで眺めてみます。
付属のヘルプは英語なので読めないw
あといまさらですが
>>776 のF4の書き方、まちがって書いてしまってますね。
タスクバーの最前面表示をON/OFFしたくて、 WinSet, AlwaysOnTop, ON, ahk_class Shell_TrayWnd ってやってみたんですけど最前面表示になってくれません。 タスクバーには効かないんでしょうか。
メニューに不特定数の項目を追加したいんですが 対応するラベルで処理を振り分けると言うことは もしメニュー項目が1000個作られる可能性がある場合は あらかじめ1000のラベルを作っておかないといけないと言うことでしょうか? どのメニューを選んだかさえわかれば、あとは関数で同じ処理が出来てしまうような内容なのですが
Loop, 10 { Random, rnd, 1, 100 Menu, M1, Add, 項目%rnd%, MenuAction } Menu, M1, Show Return MenuAction: MsgBox, メニュー「%A_ThisMenu%」の上から%A_ThisMenuItemPos%番目の「%A_ThisMenuItem%」を選択 Return
>>777 ありがとうございました!
サンプルがとてもわかりやすかったです
規制テスト
ウインドウハンドルの適切な取得の方法をおしえてください 僕のやり方では知ったウインドウハンドルをControlSendのあとに続けても どのアプリでも動いてくれません。(ほとんどの場合ClassNNをオーソドックスに入れると動く) いま躍起になってるアプリなのですが Controlsendにてキーを送りたい先のアプリケーションのClassNNが SysListView323なので、おそらくこれが原因で動いてくれません。 なのでウインドウハンドルなるものを直接指定してする必要があるようなのです。 いまやっているウインドウハンドル取得の方法 #u:: ControlGet, WhichTab, Hwnd, , SysListView323, PeCaRecorder if ErrorLevel <> 0 MsgBox There was a problem. else MsgBox Tab #%WhichTab% is active. return これにてダイアログで出現した#0x40ae2というのを ControlSendの最初にいれて #P:: run C:\PeCaRecorder\PeCaRecorder.exe WinWait, PecaRecorder, , 2 ControlSend,#0x40ae2,{F5},ahk_class #32770 return としているのですが、PeCaRecorder.exeが起動するだけです。 どなたかヒントいただけませんか?
>>780 の下から四行目のところを次のように試しに改変しました
ControlSend,,{F5},ahk_id 0x6039a
これで一時的には動くのですが、プログラムが起動のたびに
ウインドウハンドルを変えるので結局使えなくなりました。
>>781 プログラムが起動のたびにウインドウハンドルの値を取得すればいいのでは?
レスありがとうございます。なるほどAHK側で起動毎にウインドウハンドルを取得させるんですか? むずかしくて今はわかりません。みてみます。 いままでは、手動で自分でDisplayWindowInfoOnMouseOver.exeというのを起動して そこでコピペした文字列を自分でiniに張り付けていました。
ウィンドウが作られる度に毎回ハンドルは変わるので、ウィンドウハンドルは、毎度取得し直す必要があるよ AHKの起動毎じゃなく、ホットキーで呼び出す毎に。
>>784 ありがとうございます。WINGETでいいのかな、いま格闘してますが
ぜんぜんあかんw
あまりテストしてませんが、なんとか動くようになったみたいです。 ググってでてきたHPのものを一部コピペしたので何故そうなるかまったくわからない。 とりあえず報告まで ;ペカの起動マクロ #P:: run C:\PeCaRecorder\PeCaRecorder.exe SetTitleMatchMode, 2 ;なにこれ? Sleep, 500 ;起動してすぐF5は利かないみたいなので WinGet, FF,, PeCaRecorder ;大文字小文字区別。拝借してきたよーわからん。 ControlSend,, {F5}, ahk_id %FF% return
コマンドは全部流行らせるページに解説あるんだから それぞれ一行づつ調べたらいいよ PeCaRecorderとやらはよく知らないが林檎の木のSS見た感じだと TitleMatchModeはデフォ(1:前方一致)のままでもよさげ もし多重起動可能なアプリだったらRunで起動させる時にPID取得した方が確実
>>775 以前からchmとしてのヘルプが欲しいと思っていたのでが、
作成している方がいらっしゃったのですね。
普段xyzzyを使っているのでカーソル位置の関数等を
F1で直ぐに検索出来て凄くありがたいです。
AHKって指定したトレイアイコンの上で〜っていう条件はできませんよね? MouseGesture.ahk使ってfoobar2000のトレイアイコンの上で進む戻るボタンを押すと次の曲前の曲をやりたいのですが
ImageSearchでいけそうかも
マウス直下のタスクトレイアイコンのアイコン番号を取得
番号は0始まり、該当しない場合は-1を返す
取得した番号は、流行らせるページの「タスクトレイアイコン操作」と組み合わせて使う。
http://lukewarm.s101.xrea.com/myscripts/index.html Tra_GetyIconNo_UnderCursor() {
CoordMode, Mouse, Screen
MouseGetPos, x, y, hwnd, classNN
TrayIconNo := -1
If (classNN == "ToolbarWindow321" && hwnd == WinExist("ahk_class Shell_TrayWnd")) {
MouseGetPos, ,,, ctrl,2
sizeOfStruct := VarSetCapacity(POINT, 4*2, 0x00)
NumPut(x, POINT, 0, "Int")
NumPut(y, POINT, 4, "Int")
DllCall("ScreenToClient", "UInt",ctrl, "UInt", &POINT)
WinGet, pid, PID, ahk_id %ctrl%
If (hProcess := DllCall("OpenProcess","UInt", 0x38, "UInt", 0, "UInt", pid, "UInt")) { ; PROCESS_VM_OPERATION(0x08)| PROCESS_VM_READ(0x10) | PROCESS_VM_WRITE(0x20)
If (remote_buffer:=DllCall("VirtualAllocEx", "UInt", hProcess, "UInt", 0, "UInt", 20, "UInt", 0x1000, "UInt", 0x0004, "UInt")) { ; MEM_COMMIT(0x1000), PAGE_READWRITE(0x0004)
If DllCall("WriteProcessMemory", "UInt",hProcess, "UInt",remote_buffer, "UInt",&point, "UInt", sizeOfStruct, "UInt", NULL, "Int") {
SendMessage, 0x445, 0, remote_buffer,, ahk_id %ctrl% ; TB_HITTEST(0x445)
TrayIconNo := ErrorLevel
}
DllCall("VirtualFreeEx", "UInt",hProcess, "UInt",remote_buffer, "UInt",0, "UInt",0x8000) ; MEM_RELEASE(0x8000)
}
DllCall("psapi\CloseProcess","UInt",hProcess)
}
}
Return TrayIconNo
}
>>775 見た事あるアドレスだと思ったら、IME.ahkの人のサイトなのね。
感謝感謝
アクティブウィンドウのサイズをツールチップ表示したくて下のようにしてみたのですが リサイズしている時はツールチップ更新してくれません アドバイスください Loop { WinGetPos,,, Width, Height, A ToolTip, %Width% x %Height% Sleep, 200 }
~LButton:: If InStr(A_Cursor, "Size") { While GetKeyState("LButton") { WinGetPos,,, w, h, A Tooltip, %w% x %h% Sleep, 20 } Tooltip } Return 以下は、Lexikos/Unicode版用 #If InStr(A_Cursor, "Size") ~LButton:: While GetKeyState("LButton") { WinGetPos,,, w, h, A Tooltip, %w% x %h% Sleep, 20 } Tooltip Return
>>795 ツールチップがうまく出ないのですがどうもこちらのマウスの問題な気がしますので
もうちょっといろいろ試してみたいと思います
どうもありがとうございました
797 :
名無しさん@お腹いっぱい。 :2010/01/15(金) 12:45:25 ID:f3iDxyoZ0
autohotkey で ime を操作するライブラリ IME.ahk では Text Services Framework (TSF) を操作できません どうすれば操作できるようになりますか?
>>797 具体的にやりたい事がわからんけど、最新(
>>514 )のIME.ahkでGETしてからSETで操作できるかと
799 :
796 :2010/01/15(金) 22:05:00 ID:kybTvzty0
ツールチップが出なかったりリサイズ中にツールチップが更新されなかったのは マウスとか関係なく視覚効果を全部切っていたのげ原因でした…
>>797 IME.ahkは旧タイプAPI(IMM32)での制御なので、Google日本語入力などの
TSF(詳細なテキストサービス)じゃないと動かないIMEだと
ON/OFFくらいしか操作できないです。
TSF関数のノウハウがあるならDllCallあたりでゴニョゴニョするとどうにかなるかも。
上手くいったらフィードバックしてくれると嬉しい
ちょいと質問なんですがAHKでデスクトップをアクティブ化とか最前面に持ってこれたり しますか?自分でWinActiveForceとかWinSetとかはつかってみたんですがどうもうまくいかなくて。 だれかできてる人がいたら教えてください。
WinActivate, ahk_class Progman で、デスクトップにフォーカス当たるけど、そういうことじゃないのね
単純にSend,#mじゃ駄目なんかね。
>>802 うお、すご、そんなこともできたんですね。
>>803 今もそれ使ってるんですが、何かの弾みでウィンドウの順番が変わってしまうことがあって、
それでデスクトップを一番手前に持ってこれればウィンドウの順番変わらないんじゃないか?ということで聞いてみたんですが、
この文章書きながら、あれ、デスクトップアクティブにした後ウインドウの順番戻すにゃどうすれば・・・とか新たな疑問がががが。
ともかく即レス感謝です!
ん? DeskLamp や Desk Topmost みたいなのをやりたいわけじゃないのか 昔あれAHKでやりたかったけど、単純に AlwaysOnTop じゃ無理なんだよね ・透過ウィンドウを全画面配置し、デスクトップ上のアイコンをコピーして同じ位置に配置する もしくは ・Regionで上に重なってるウィンドウに穴を空け、デスクトップ上のアイコンを直接弄れるようにする とかやれば擬似的にはそれっぽくなるのかな 後始末や操作のフィードバック(アイコンをドラッグして並べ替えしたり)まで考えるとしんどいけど
Send, #d ならトグルできるけどそういうことではなく?
807 :
名無しさん@お腹いっぱい。 :2010/01/18(月) 22:27:19 ID:7yuPKeXX0
Sleepのディレイに変数を使う事はできないですか? Sleep, hoge sleep, %hoge% 無理でした。 処理の待ち時間を条件で変えたいのですが。
書式的には後者でいける
数字が入ってないとか グロ変と被った名前付けてるとか
あんま変な略し方しないでくれw
たしかに、グロ変つかいすぎると、settimerを回したときなんかに動作がグロくなるな
既出だと思うけど、 ジョイスティックを接続していない状態でジョイスティック関連のスクリプトを実行していると autohotkeyがどんどん重くなるっぽいね
どんな感じのスクリプト?
joystick, up down Hold me Enjoy!
最初に無変換をコンビネーションキーで設定させると、 ~vk1Dsc07B & I:: Send,{Up} ほかのアプリ限定でまたべつに無変換キーに別のsendを割り当てても #IfWinActive,ahk_class このアプリで無変換キーに割り当てたスクリプトsendが動かないですね。 とりあえずいまのところ#IfWinNotActiveで回避はしているのですが、 回避できるウインドウは一つだけですよね? なにかイイ方法ご存知ありませんか?
>>816 レスありがとうございます。たしかにそれでいけそうです。
しかし動かない。書き方をチェックしてるのですが。
なぜだろう。ありがとうございました
GroupAdd, GroupHoge, ahk_class Notepad #IfWinNotActive, ahk_group GroupHoge Q:: Send, {Q} Sleep, 10 Send, {5} return #IfWinNotActive と書いているのですが、メモ帳の上でQ押してもマクロが動いてQ5と書いてしまう。 上から2行がスルーされて一般適用になってる? なにがいけないんだろう
>>818 そのままコピペして実行してみたけど正常に動いたよ。
とりあえず、基本的な対処法としての
全てのAutohotkeyファイルを終了して再実行したり、
Windowsの再起動をやってみては
>>819 テストありがとうございます。そうですか、、、。
いまだにちゃんと動かない。iniの上下の記述が悪いんだろうか。
気にして見てるんですけど。
グループ作成でつまづいているっぽいけど。うーむ。再起動してこよう
>>iniの上下の記述が悪いんだろうか とりあえず検証するときはほかのスクリプトは消してしようぜ
>>821 ありがとうございます。そうしてみます。代用のiniつかってやってみます。
ぜんぜんでけん
ほんとでした。テストでまっさらのautohotkey.iniに
>>710 を
書いたらちゃんと動きました。なにが悪いんだろう。書き残しないはずなんだが
もう寝るんで つAuto-executeセクション
ありがとうございます。 >Auto-executeセクション よくわかりませんが、あとで調べさせてもらいます
質問です。 「¥」キーを押したら、 「a」「i」とふたつのキーコードが連続で入力される というようにしたいのですが、 (ワンキーで、特定のキーシーケンスを入力したい) どう書いたらよいのでしょうか?
<わからない9大理由> 1.読まない …説明書などを読まない。読む気などさらさらない。 2.調べない …過去スレ、ググるなど最低限の内容も自分で調べようとしない。 3.試さない …めんどくさいなどの理由で実行しない。する気もない。 4.覚えない …人から聞いて、楽して得た答えは身に付かないから、すぐに忘れる。 5.説明できない …何に困っているのか、第三者に正確に伝わる文章が書けない。 6.理解力が足りない …理解力以前の問題で理解しようとしない。 7.人を利用することしか頭にない …甘え根性でその場を乗り切ろうとする。 8.感謝しない …教えてもらって当たり前。事がすんだらさようなら。 9.逆切れする …自分の思うようにならないと逆切れする。
>>825 悪いところがわからないので、
>>818 をautohotkey.iniの
先頭にもっていったら動くようになった。
Auto-executeセクションの意味が流行らせるページ読んでもやはりわからない。
autohotkey.iniのメモ帳の先頭何行はそのセクションなんだろうか。
それともただスクリプトが実行される範囲でreturnまでのことをいうのだろうか。
わからない。
>>114 に書いてるようにほかの行にまで連続実行が突入しているのだろうか
return行は調べているのですが。
ありがとうございました。ちょっとググります。
オレも流行らせるページだいぶ頑張って読んだけど、 普段プログラミングとかしない人なので、 さっぱり分からない・・・。 のどか(旧窓使いの憂鬱)みたいな 初心者向けの解説があるとありがたいんだけどな。
AHKは神ソフト
Auto-execute で困っている人、#Include は使ってる?
>>828 スクリプトが読み込まれると、最初にReturnかExitあるいはホットキーラベルが現れるか、スクリプトの終わりに達するまでが実行される。
この部分のことを、auto-executeセクションと呼ぶ。
流行らせるページを探すんじゃなくて、何故"Auto-executeセクション"そのものでぐぐらない?!
あと書くのはGroupAdd〜だけでいい
>>832 私でしょうか?
#Includeがないと思ったら探したらありました。
>#include ime_func.ahk
>^vk1Dsc07B:: IME_OFF("A")
>return
これをファイルの先頭にもっていきました。
>>833 すいません。
>スクリプトが読み込まれると
もうこの時点でわからない。AHK起動時にiniを読み込んだときという解釈でいいのかな。
>あと書くのはGroupAdd〜だけでいい
だけでいい、ってのが分かりませんがしばらく自力でやります。
ありがとうございました
変数に入れた文字列(通常のShiftJIS)を、EUC-JPの数字表記に変えたいです。
http://ash.jp/code/codetbl2.htm この表でいうと、たとえば
亜 → B0A1
あいうえお → a4a2a4a4a4a6a4a8a4aa
みたいに、変換元の2バイトコードを、4文字の16進数の数字表記に変えたいです。
URLの検索ワードの加工で使いたいのですが、うまい方法はないでしょうか。
なんだかえらい面倒なことになってるな
Autoexec.batを知らん世代だと概念そのものがわかんないのか
>>834 Auto-executeセクションとは、スクリプト(この場合はAutoHotkey.iniファイル)の先頭部分のこと
AHK起動して一番最初に実行されるので初期化しておきたい内容を記述する。
GroupAddはこの「Auto-executeセクション」に書かないとダメ
#Include云々は、それ入れるとAuto-executeセクション終わっちゃうことがあるから
GroupAddはそれより上の行に書けってこと。
837 :
826 :2010/01/20(水) 12:35:01 ID:EsidVYCI0
>>838 たくさんのURLとヒントを、どうもありがとうございます。そうです、URLエンコードです。
過去スレ102のue(Clipboard版)は、変換中にクリップボードが破壊されてしまうので、
ほかのスクリプトを平行して動かしている関係で、厳しいです。
>searchit:
ランチャで、最終的にブラウザを起動するようです。
途中の変換結果だけ返却してくれればベストだったのですが。
>AutoHotKeyでURLエンコードしてみる:
これ、使ってます! UTF8の場面では便利に使わせてもらっているのですが、
今回はShiftJIS→EUC-JPなので、残念ながら活用できませんでした。
これのテーブル表を書き換えると、EUC仕様になるのかも・・・。
>フォーラムのコード
動かしてみましたが、違う結果が出てきたので、
UTFか、URL内のダメ文字(空白など)を置き換える用途のようです。
先に進めないと困るので、現在は、変換したい文字を、fileappendで
ファイルとして書き出して、コマンドラインアプリのnkf.exeでEUC-JPに変換して、
できたファイルをfilereadで読んで、なんとか切り抜けることにします。
ただこれだと、外部コマンドを呼び出す関係で、短い複数文字列を一括で処理すると、
変換時間がネックになるので、あとでやばくなりそうです。
ahk内部の文字列操作だけでやれればベストなのですが、もうちょっと探してみます。
情報ありがとうございます。ひきつづきよろしくお願いします。
やっつけで作成。 EUC-JPとは言っても MS仕様の eucJP-ms なので、一部の文字マッピングが思ったものと違うかもしれない。 ※ Unicode版では正常に動かない(ConvertINetUnicodeToMultiByteを使う) ; SJISからEUCに変換する EUC_ConvertTo(srcStr) { Return ConvertINetString(srcStr, CP_SJIS:=932, CP_EUCJP:=51932) } ; EUCからSJISに変換する EUC_ConvertFrom(srcStr) { Return ConvertINetString(srcStr, CP_EUCJP:=51932, CP_SJIS:=932) } ; 内部用関数 ConvertINetString(srcStr, srcEncoding, dstEncoding) { Mode := 0 srcSize := StrLen(srcStr) dstSize := srcSize *3 VarSetCapacity(dstStr, dstSize, 0x00) DllCall("mlang.dll\ConvertINetString", "UIntP", Mode, "UInt", srcEncoding, "UInt", dstEncoding, "Str", srcStr, "IntP", srcSize, "Str", dstStr, "IntP", dstSize, "Int") Return dstStr }
>>836 わかりやすいです。ありがとうございます。把握できそうです。でも
Auto-executeセクションに入れないといけないキーワードがどれかなんて
わからない。あまりにも当たり前のことなのかもしれないけど。
GroupAddの流行らせるページにもそのことが明示されてない。
例をみればふつうの人は分かるんでしょうけど、俺はわからん。
説明ありがとうございました。掲示板でヘルプしてくださるおかげで
AHKを使えてます。AHKは神
>>840 ありがとうございます!おかげさまで動きました!
その関数で帰ってきたEUC文字を、下記で再度1バイトずつバラして
16進数2桁にしたところ、URLで使用可能な希望通りの動作になりました。
str:=EUC_ConvertTo(srcStr)
SetFormat, IntegerFast, hex
out=
loop,parse,str
{
N:=Asc(A_LoopField)
stringreplace,N,N,0x
out=%out%%N%
}
msgbox,結果→%out%
↑バラし部分。とりあえず動いていますが、もっと効率の良い戻し方があるような気が・・・
sample「秋葉原」
秋葉原 ←元
↓
スゥヘユクカ ←EUC
↓
bda9cdd5b8b6 ←最終
>>842 どこかで文字数分だけループ回さなきゃいけないことは代わりはないのは確か。
どうしても速度をだしたいなら関数内でループ回した方が多少は効率はいいはずだけど、
気にならないならそのままでいいんじゃないかな
>>841 いやキーワード別に対応が分かれてるわけじゃないから。
GroupAddだからAuto-executeセクションに入れないといけないってわけじゃない。
わからんわからん言ってる人間に無理に説明しても
お互いしんどいだけだからこの辺でやめるけど
順次処理と割り込み処理の概念さえ理解できれば何とかなるよ、たぶん
見事にこれに当てはまってるな <わからない9大理由> 1.読まない …説明書などを読まない。読む気などさらさらない。 2.調べない …過去スレ、ググるなど最低限の内容も自分で調べようとしない。 3.試さない …めんどくさいなどの理由で実行しない。する気もない。 4.覚えない …人から聞いて、楽して得た答えは身に付かないから、すぐに忘れる。 5.説明できない …何に困っているのか、第三者に正確に伝わる文章が書けない。 6.理解力が足りない …理解力以前の問題で理解しようとしない。 7.人を利用することしか頭にない …甘え根性でその場を乗り切ろうとする。 8.感謝しない …教えてもらって当たり前。事がすんだらさようなら。 9.逆切れする …自分の思うようにならないと逆切れする。
Run, C:\Program Files\Internet Explorer\iexplore.exe %URL% IEオプションで現在のウィンドウの新しいタブでリンクを開く設定にしてるんだけど URLを渡す度に新規ウィンドウで立ち上がってしまう すでにIEが起動していたらアクティブにして新規タブを開くkeyを送って アドレスバーにControlSendRawするって強引な方法を使ってみたけど こんなことしなくてもいい方法知ってる人いたら知恵を貸してください
そのリンクをみると利用したいコマンドラインオプションはないみたいだね
IEが既定のブラウザなら Run,%URL% で新規ウィンドウ作らずに開くが
>>849 目から鱗
IEのパスは必要なかったのね
思い通りの動作になって満足
どうもありがとうございました
851 :
名無しさん@お腹いっぱい。 :2010/01/22(金) 23:37:43 ID:ruKNOc290
Hotstringを使って"@"+"/"などでよく使う単語を入力しています↓
:*:@/::
Clipboard=
>>1 乙
Send,^v
Return
USBで持ち運びできるようなIMEが欲しかったので
この方法を利用して似非IMEを作ろうとしたのですが
例えば同じ入力で複数の単語を使い分けたい場合("@"+"/"で『
>>1 乙』と『これはポニテじゃ(AA略』など)
どうしたらいいのかわからなくなりました。
多分Menuコマンドとかを利用してポップアップメニューを出して選択できるようにすればいいのかなと思うのですが・・・
どなたかご助言いただけないでしょうか
Google日本語入力の制御において、 変換キーを押すことに関して、 IMEがOFFならONにして、ONなら変換するというのは まだできないみたいですね。 ベータだからしょうが無いですね、待つしか。
>>853 まじですか?吉報。ググリ方が足らんようですね。
無変換を含んだコンビネーションをGoogle日本語入力変換中に多用したいので
AHK.iniで無変換単独のキー動作を無効にしたいと思ってるんですが、
これもうまくいかない。
>>853 「Google日本語入力キー設定」というGoogle日本語入力側からの設定ではおっしゃるとおり
>>852 の動作が実現できました。
Google日本語入力のキー設定はデフォのままで、AHK側からの設定で上と同じことはできないんでしょうか?
無変換のみのキー設定を無効にするのもGoogle日本語入力で設定すればできますが、AHK側からはできないのかな。
自分がやってみたんですが無理でした。
runコマンドで起動ファイルのあるディレクトリを自動で作業ディレクトリにすることはできないかな 一つずつ指定していくのは長くなるし面倒だし
>>855 具体的に何を試して駄目だったかを書くといいよ
>>856 AHKでなくOSの仕様なんで、諦めて1個ずつ指定しよう
>>856 俺は
run(cmd)
という関数を作って、そっちで自分好みの環境を全部構築してる
>>855 $sc07B::return
>853は↓じゃだめなん? 試してないけど。
$sc079::
if (IME_GET()) {
Send,{Space} ; 変換に割り当ててるキー
} else {
IME_SET(1)
}
return
×853 ○852
862 :
名無しさん@お腹いっぱい。 :2010/01/23(土) 23:18:42 ID:gXVIBUYH0
>>851 です。
本家の解説を見ながら試行錯誤してみてポップアップメニューを出す所まではできたのですが
その先でまた詰まってしまいました。
スクリプトは以下のものなのですが↓
これがTest.ahkでは動くのですがAutoHotKey.iniに記述すると動いてくれません(MyMenuが存在しませんとエラーが出ます)
どこが間違っているのでしょうか?
:*:a/::
Menu, MyMenu, Show
(※ahkファイルの場合は@ & /::Menu, MyMenu, Show)
Menu, MyMenu, Add,
>>1 乙,
>>1 乙
Menu, MyMenu, Add, ポニテ, これはポニテじゃ(AA略
return
>>1 乙:
Clipboard=
>>1 乙
Send,^v
return
これはポニテじゃ(AA略:
Clipboard=これはポニテじゃ(AA略
Send,^v
return
・ まず、スクリプトは上から順に実行される ・ ホットキーやHotStringはそのキーのラベルの行から順に実行される ・ メニューは作ってからじゃないと表示できない
他人がとやかく言う筋合いは無いのを承知で聞くけど > :*:a/:: これは、どんな思想でこんな複雑 かつ わかりにくいホットキーを使おうとしてるの? あとラベルに日本語は使わないほうがいい。後で絶対ハマルよ。
>>863 わかりやすい説明ありがとうございます
見直してみて、最初の部分を以下の形にしたら望む動作になりました。
(実行の順番などに加えて、どうもreturnの意味をよく分かっていなかったみたいですorz)
:*:a/::
Menu, MyMenu, Add,
>>1 乙,
>>1 乙
Menu, MyMenu, Add, ポニテ, これはポニテじゃ(AA略
Menu, MyMenu, Show
return
〜〜〜〜〜
>>864 そのキーは使いたい単語が少なかった時の名残で特に意味はないんです
@〜なんてめったに押しませんし、憶えやすかったとかいう程度の理由でそういう組み合わせにしてました。
実際に上のスクリプトを使う時にはホットキーを:*:Itiotu::みたいにしようと思っています。
あと「日本語はハマる」というのは将来的にどっかでバグる?ってことでしょうか?
あんまり複雑な処理をするつもりはない(というかそんなスキルがない)ので大丈夫じゃないかなーとは思うのですが・・
>>859 後述の複数段の式ですが、AHK起動の際ににエラーがでます。
if (IME_GET()) {
の部分にダイアログのなかで矢印がでます。
$sc07B::return に関してはコレを設定するとほかに割り当てている
無変換キーとのコビネーションキーが全部死んでしまいます。
(したいこと)
google日本語入力やATOK側で設定いじらずに
AHK側で設定して、
1.変換キーでIME ONをしたい
2.無変換キーのみの押下による反応をなしにしたい
飛び飛びすぎて流れが読めんが、まさかIME.ahkいれてないんじゃ…?
http://www6.atwiki.jp/eamat/pub/MyScript/IME20091203.zip これ落として解凍して出てくるIME.ahkを何処か自分が決めたahkファイル置き場に置く
それからそのIME.ahkをエディタで開いて中の28〜92行目(動作確認用 内部ルーチン の行から ExitApp の行)まで削除して上書き保存
IME.ahkと同じフォルダに新たに(既存のでもいいけど…)ahkファイルを作って、
エディタで開いてこんな感じでIME.ahkを始めの方でincludeする↓
#Include %A_ScriptDir%
#Include IME.ahk
$sc079::
if IME_GET() {
Send,{Space} ; 変換に割り当ててるキー(sc079でもいいか)
} else {
IME_SET(1)
}
return
俺はこれで動く
あともう一つの方は普通ならコンビネーションキー設定すると、一つ目のキーの元々の機能はデフォで無効化されるはずだし、
俺はGoogle日本語変換は入れてないしでどういう状況なのか分からん
俺も無変換をコンビネーションキーに設定してるが…
sc07B & C::
msgbox, おめでとうございます
return
sc07B Up::return
sc07B Down::return
こういう感じにしても駄目なの?
>>867 詳しくありがとうございます。やってみました。
IME.ahkは入ってるようでした。最新版の上と同じやつ(?)が。
変換キーでIMEONをする方法ですが、現時点で結論からいうと、
デフォでGoogle日本語入力だと普通に変換キーを押すとIMEONになります。。
なにかすいません。テキストエディタとAHKを再起動したらそうなりました。
前半部の#Include %A_ScriptDir%
ですが、これを記入すると下のようなポップアップが始終ついてまわります。
http://img641.imageshack.us/img641/6249/imeokasii.gif なので削除してみました。
2.ですが、たしかに無変換キーにコンビネーションキーを設定すると一つ目のキーは無効化されるのですが、
無変換キーに限っては、文章の書き始め、変換のし始めは、単独の無変換キーの動作がいきており、
コンビネーションを使って無変換を押すとカタカナ変換してしまいます。
無変換キーを鬼のように使い倒すっていうスレがあって、他の人も無変換キーにコンビネーションを割り当てていることから
私のAHKの設定が悪いのだとおもうのですが、いまのままだと無変換キーにコンビネーションを使うのは
向いてないと思うようになりました。
無変換キー単独の機能が最初生き延びていることにてついて {blind}を入れて様子をみてみます。不具合が起こる確率が減ったような
espstつかえばいいじゃんとおもた
ちょっと話題変わるのですが、 ひらがなキーを修飾キーに使うのは適さないというのは常識なのでしょうか? 平仮名キーとアルファベットのコンビネーションを複数割り当てて、 それらを一度両方続けて使うと、以後平仮名キーを押さなくても 常に押した状態になってアルファベットだけを押しても 平仮名キーとのコンビネーションの機能が働いてしまう。 vkF2sc070をそのまま使うのがだめなのかな。
[CapsLock(英数)]と同様に[ひらがな]もだめみたいね。
>>871 通常のキーは押し下げでDown、開放でUpと変化しますが、
Windows日本語版のひらがな、半角/全角、CapsLockなどは
押すたびにトグル状態が変化します。
つまり、押し下げ時のみ状態が変化し(Up→Down、またはUp→Down)
開放したときに変化しません。
なので、そのまま修飾キーとして利用することは出来ません。
>>3 の Q1 に説明してあるようにChangekeyなどを使って「ひらがな」キーを
普段使わないF13〜F24などに変更し、それを修飾キーとして利用することは可能です。
以下は前スレ359の後半をコピペ
ということでひらがなキーをF13に置き換える手順。
AutoHotkeyで任意のキーをF13にリマップする。
例えばF12をF13にリマップし、スクリプトを実行させる。
F12::F13
Changekeyを起動する。(Changekeyが無いならググって入手する)
「調査」→「どのキーなのか?またはスキャンコードでキーを変更します」を選択。
F12を押すとスキャンコード「0x0064」、該当するキーは「該当なし」と表示される。
(0x0064 はF13のスキャンコード)
「上のスキャンコードでキー変更する」をクリックすると
「変更前 (中略) 0x0064 をどのキーに変更しますか?」
というウィンドウが表示されるので「ひらがな」キーを選択。
「登録」をクリックし、Windowsを再起動する。
リマップ( F12::F13 )を解除する。
× つまり、押し下げ時のみ状態が変化し(Up→Down、またはUp→Down) ○ つまり、押し下げ時のみ状態が変化し(Up→Down、またはDown→Up)
ジョイパッドの"スライダ"のアナログ値を取得出きませんか? directplayとかで引き出さないとだめ?
>>873 レスありがとうございます。その三つのキーは仕組み自体が他と違うのですね。
キー置き換えしかないみたいですね。
常駐ソフトがひとつ増えるのが気になりますが、暫定的なもので、
マユを入れることにします。
すいません。追加でまた質問なのですが、ごくごく簡単なマクロで
ゲーム画面の一定の位置を時間を置いて次々にマウスクリックしていく
ことってAHKでできるのでしょうか?
おしえてください。海外の掲示板でそういう式を見た覚えがあったのですが
流行らせるページの「CLICK」の項目見つけましたが、どうやらできるみたいですね
>>878 Changekeyは常駐ソフトじゃないよ
>>880 すいません。書き方が足りませんでした。ChangeKeyは再起動が必要になったり
敷居が若干高いので、自分の方法論がある程度固まるまでは容易に変更ができる
マユにしておこうと思いました。
そんな機会ないかもしれないのに、仕事場で共用で使うパソコンでカスタマイズ環境を
作りやすくするにはということを考慮したりしてしまうので。
あと、ウインドウの特定の位置をクリックするのを自動化するの、とりあえず今のところ
望むことが実現できました。AHKは神。プログラム知らない僕にとって仕組みがすごすぎて楽しい。
どうでもいいけどいいかげん連投する前に調べる癖つけなさいよ、神の人
最近autohotkeyを入れてみました。 ホットキーでタスクバーの大きさを変えるには どうすれば良いでしょうか? #9::WinMove, ahk_class Shell_TrayWnd, , ,100,, としても、動いてくれません、、 タスクバーは下ではなく、右端おいてあって、 30⇒100ピクセルくらいに大きさを変えたいのです。
884 :
名無しさん@お腹いっぱい。 :2010/01/26(火) 20:34:24 ID:pmerGxxL0
英語配列のキーボードにしてAlt+`を押すのが面倒だったので、 AutoHotKeyで左AltにAlt+`を割り当てたのですが、 日本語キーボードの半角/全角キーの場合と違って 確定させずにIMEをOffにすると、その部分が消えてしまいます。 半角/全角キーと同じ動作にさせる方法ってないですか?
>>884 IMEの設定でその動作を選択できるのでIME設定を見直してみては?
>>883 実際にドラッグしないと変わらないんで、ドラッグエミューレートすりゃいいんじゃない
CoordMode, Mouse, Screen
MouseGetPos, oX, oY
WinGetPos, xx,yy,ww,hh, ahk_class Shell_TrayWnd
x := xx+ww-1
y := Round((yy+hh)/2)
MouseClickDrag, L, x, y, 99+xx, y
MouseMove, oX, oY
エクスプローラで右クリックしたときに表示されるメニューの 「元に戻す〜」で戻される操作の具体的な内容を取得することは出来ないでしょうか? ツールバーの「編集」→「元に戻す」の場合は、メニューをポイントすればステータスバーに どういう操作をしたのを元に戻すか、という具体的な内容が表示されるのですが、 右クリックだと表示されないのでなんとかしたいのです。
888 :
名無しさん@お腹いっぱい。 :2010/01/26(火) 22:36:48 ID:pmerGxxL0
>>885 MSIMEにそんな設定ありますか?
探してみたんですが、見つかりませんでした。
ネット上には、半角/全角キーだと入力が確定してOffになり、
Alt+半角/全角だと未確定部分が消えてOffになるなんて
話もでていましたが、どうなんでしょう?
>>887 メモリ覗いてもわけわかめだろうし、メニューの文字列とるのが確実なのかなぁ。
#IfWinActive, ahk_class CabinetWClass
Pause::
Send, !e
WinWait, ahk_class #32768,, 0.5
If (!ErrorLevel) {
SendMessage, 0x01E1, 0, 0
str := (ErrorLevel!=1) ? RegExReplace(GetMenuString(ErrorLevel, 0), "(?:^元に戻す - |\(.+$)") :
}
Send, {Alt}
MsgBox,, 元に戻す操作, % str
Return
GetMenuString(hMenu, nPos) {
length := DllCall("GetMenuString", "UInt", hMenu, "UInt", nPos, "UInt", 0, "Int", 0, "UInt", 0x0400) ; MF_BYPOSITION
VarSetCapacity(str, (length+1) * (A_IsUnicode ? 2 : 1))
DllCall("GetMenuString", "UInt", hMenu, "UInt", nPos, "Str", str, "Int", length + 1, "UInt", 0x0400)
Return str
}
>>887 > ツールバーの「編集」→「元に戻す」の場合は、メニューをポイントすればステータスバーに
> どういう操作をしたのを元に戻すか、という具体的な内容が表示されるのですが、
初めて知ったw
>>888 MS-IMEを使っているとするなら、
IMEのキー設定で Alt+` の「入力文字のみ」の部分が「IME-オン/オフ」になっているはずなので、
その「IME-オン/オフ」の部分を右クリックして「削除」。
※私は英語キーボードを持っておらず、Alt+` に割り当てられているのかを確認していません。
Alt+` が無い場合はそれに相当するキー割り当てを探すか、
新たに半角/全角と同設定のキー設定を追加し、それをAHKで左Altに割り当てるといいかも。
逆に、変換中にIMEをOffにしても削除しないようにするには、
同項目を「IME-オン/オフ」に設定するといい。
892 :
891 :2010/01/27(水) 00:40:36 ID:OJCtFlHc0
逆に、変換中にIMEをOffにしても削除しないようにするには、 同項目を「IME-オン/オフ」に設定するといい。 ではなく、 逆に、変換中にIMEをOffにないようにするには 同項目を「IME-オン/オフ」に設定するといい。 と修正してるときに気づいたけど、確定して変換?ってことは動作が違うなぁ・・・
そういえば、2kまでは右クリックからでもステータスバーに戻す内容が表示されたような記憶が・・・
なんで挙動を変えてしまったんだろうかなぁ
>>889 レスありがとうございます。
ただ、表示されるメニュー自体は右クリックでもAlt+Eでも同じなので・・・
>メモリ覗いてもわけわかめだろうし、メニューの文字列とるのが確実なのかなぁ。
やっぱり例で示して下さったのと同じような感じで
Send,!e→StatusBarGetTextをするしかないのかなorz
>>890 おれもw
>>886 面白いね。
タスクバーを引き出せるのなら、
+^z:: タスクバーに並ん出る順にウィンドウ切り替え
ができそう。
AltTabの時に出てくるアイコンの代わりなりそうだけど・・・
>>884 前スレ99を利用したら同じ動作を行うことが出来るんじゃないかな
文字入力中or変換中なら Send, {Enter} してからIMEをOffにするとか。
99 名前:名無しさん@お腹いっぱい。 [sage] 投稿日:2009/06/02(火) 18:58:42 ID:xwgWw2A40 (PC)
対象窓で、文字入力中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
}
>>894 ↓このスレで前に張られてた
; タスクバーに並んでる順にウィンドウ切り替え
+^z::
WinGetTitle active_window, A
Send !{Esc}
WinWaitNotActive %active_window%
WinGet state, MinMax, A
if(state < 0)
{
WinRestore A
}
return
ヨーだも気になるw
何が問題なのか書いてなかったですね。 透過カラー部分が黒く塗りつぶされた形で表示されてしまいます。 もう一つ補足しますと、透過カラーといっても切り抜いて指定した形に 表示することの透過ではなく、文字通りの色が透けていて背景がぼんやり 見えているということです。 OSはWin7で、GreenfishIconEditorで作成。 icoではなくcurで保存し、それをWinのマウスカーソル変更プロパティで 適用したものは正常に透過します。
あんまりその辺詳しくないんだけど。アルファブレンドだとおもう。 例のアイコンはカーソルではない。(カーソル置き換えだとチラつくためGUIにしている) 実際にはGUI窓上にアイコンを配置している。そうなるとGUIの背景色とアイコンの透過色がブレンドされる。 WinAPIでGUIの背景色(単色)の透過の指定をしているため、GUI上でブレンドされた色は透過されない。 アルファブレンドで透過させる方法じゃなくて、単一の透過色を持つようなアイコンにするといいかもしれない。
エクスプローラ及びデスクトップでF2でファイル名変更の際に拡張子部分以外を選択した状態にする。 拡張子が全角の場合失敗するかもしれない(Unicode版は無問題) SetTitleMatchMode, RegEx #IfWinActive, ahk_class CabinetWClass|ExploreWClass|Progman ~F2:: ControlGetFocus, classNN If (classNN != "SysListView321") Return Loop { ControlGetFocus, classNN If InStr(classNN, "Edit") Break If (A_TimeSinceThisHotkey>500) Return Sleep, 50 } ControlGetText, itemName, %classNN% StringGetPos, pos, itemName, ., R1 If (count := StrLen(itemName)-pos) { BlockInput, On SetKeyDelay, 0 Send, {LShift Down} Send, {Left %count%} Send, {LShift Up} BlockInput, Off } Return
文字コードをSJISからUTF-8に変えるのあったっけ ユニコード文字のファイル名の処理でAutoHotkeyUに変えてみようと思ってるんだけど いままで作ったのの変換作業がめんどくさいなと思って
Loop, *.txt とかで得られるファイル名自体がUTF16なんで、 SJISとかUTF8とか気にしなくてもいいような気がするけど 直接じゃなくて、 SJIS → UTF16 → UTF8 ならできるよ。 TransForm, utf16, FromCodePage, 932, % sjis TransForm, utf8, ToCodePage, 65001, % utf16
NKFとか使った方が速いんでないか
ドロップダウンリストのリストをあとから追加することはできるんですが 追加ではなく更新はできませんか?
>>908 これ使っていっきにやってみるサンクス!!
>>906 Dの直下にあるファイルに効かなかった
XP使用
AHK_L rev42 俺的まとめ 簡単に言うと。AutoHotkeyUのいいとこ取りをしたけどユニコードは採用しない。 だけどANSIじゃなくてデフォルトコードページで文字を扱うよ。 ・ スクリプトは従来通りANSI(SJIS)で書く。加えて、UTF8/UTF16LEでもスクリプトが書けるけどBOMを付けてね。 ・ 文字はデフォルトコードページで取り扱う。(UTF8やUTF16LEで書いてあっても変換して格納) ・ 「`(0x60)」系の駄目文字はなさそう。 → 「MsgBox, AチЯ`荏柿義形港餐汁秦疏蛋伝覗描冒輿倭兪啻嫣彖拜杼歔」は正常に表示 ・ パスに「\(0x5c)」が含まれる場合でも正常に取り扱われるようになってるっぽい。 → A_ScriptName, A_ScriptDir, A_LoopFileName, SplitPath とかは無問題。 ・ ユニコード系の組み込み変数。コマンドや関数は捨てた → A_IsUnicodeは捨て。PtrSize→A_PtrSize、StrGet(address)はANSIで取得。 ・ FileEncodingコマンド等は有効なので様々なコードページでファイルを扱える。 ・ DllCallとかもANSI系。 → 関数は"A"系を使う。AStr/WStrは使える。IntPtr→Ptrに変更(IntPと混同を避けるため)。 ---- 駄目文字は無くなったと思っていいのかな。 正規表現は相変わらずだと思う。「RegExMatch("表示", "\\")」の結果は2。
915 :
名無しさん@お腹いっぱい。 :2010/01/29(金) 16:46:04 ID:JptKlGL90
>>914 となるとだめ文字対策を全くしなくても良くなった?
いいね。
>正規表現は相変わらずだと思う
正規表現を使う置換もまだだめなのかな。
それと英語がよく分からないから質問します。
>items marked AHKL are specific to ANSI or Unicode builds in AutoHotkey_L (i.e. may not apply to AutoHotkeyU).
このAHKLはAutoHotkeyUとは別物でAutoHotkey_Lの別バージョン?
AutoHotkey_Lの別バージョンならどういう設定で起動します?
Unicode版はAHKLのユニコード対応版でバイナリは別物(作者も)。ブツは
>>201 。
起動オプションとかではない。
Loop文の中で動いているスクリプトを途中で終了(強制終了)させたいんだけど 良い方法ありませんか?タスクマネージャーからの終了は面倒なので。 ^ESC::ExitAPP loop{ 〜長いスクリプト〜 } これはダメでした。
ループ中で、ESCをGetkeystateで調べて、押されていたらbreakする
ime.ahk の IME_GetConverting について質問です。 Excel のセルに対して文字入力中 or 変換中でも 0 しか取得出来ないのですが、 どうにかして、IMEがONの時の「未入力状態」と「入力中」の区別を付ける方法はないでしょうか。 Excel のバージョンは2003です。IME は MS-IME2003 と 2002 で試しました。 候補リストが出ればちゃんと CandCls でマッチして 2 になるんだけど。 変換中文字列の上で win+3 を押しても XLMAIN の 0 しか取得出来ない。 「オプション-編集と日本語入力-編集中の文字列を文書に挿入モードで入力する」は Word にしか見当たらず、 該当オプションを変更したら Word上では IME_GetConverting が 1 になることは確認しました。 念のために詳細なテキストサービスを無効にみましたが Excel上では何も変わらなかったですorz
w以外のキー連続して入力するとっっっっっっっっっzってなるのどうにかならないの XPでもそうだったし7でも同じ
書き込むスレ間違っちゃったの
>>335 と流行らせるページのMy Scriptsにあるホイールリダイレクトを同時に使えないもんでしょうか
Unicode版でBOMなしUTF-8のテキストファイルを読み込むにはどうしたらいい 文字化けしちゃってうまくいかない
流行らせるページのMy Scriptにある「タスクトレイアイコン操作」が Win7 64bit版だと全く値を取得できなくなってしまいました。 32bit版だとWin7でも動きます。 これさえ大丈夫なら完全に移行できるんですが… どなたかよろしくお願いします。
>>924 なるほどFileEncodingを使うんだね
覚えたありがとう
runwaitを、何千回、何万回と呼び出していると、ほんのたまーーーーに不定期に 「runwaitで実行すべきファイルが見つからない。このスレッド終了するわ」 と出て止まってしまうのだけど、こういう経験ある人いる? サーバのログを、種類ごとに選別&区分けして、深夜にZIPで固めるスクリプトなどで、 1ヶ月くらいノンストップで動いてるのに、たまにこれでコケてしまってて困ってる。 実行してるファイルは固定なので(具体的には7z.exe)、なくなるはずが無いのに、おかしい。 ウイルス対策ソフトは入れていないから、実行の強制おあずけや、横取りも無いはず。 こういう場合、どう対処したらいいだろ? AHKのバージョンは 1.0.48.03
第3引数にUseErrorLevel指定して、ErrorLevelチェックしてリトライ
>>928 なるほどthx、それはやってなかったので追記してみます
>>918 thx! 全スクリプトの中から、更にループしてる所にラベル作って上手くいきました。
Pauseキーはトグル(?)なので、このソフトでは うまくコンビネーションでホットキーにできないみたいですね。
んなこたぁねぇべ pause & space:: pause & left:: pause & right:: pause & up:: pause & down:: tooltip, %A_ThisHotkey% return
AutoHotKey_Lについてなんだけど >MsgBox, AチЯ`荏柿義形港餐汁秦疏蛋伝覗描冒輿倭兪啻嫣彖拜杼歔」は正常に表示 これ正常に表示される?されないんだが…
>>932 あれ、、そうなんですか、すいません。
まったく同じ式をコピペで書いても sleepは動いてPauseは動かないで
AHKのせいかと思っていたのですが。
;DOpusアクティブ
Sleep & D::send, ^{Numpad0}
Pause & D::send, ^{Numpad0}
こう書いてもPauseのほうはうごかないんで。
>>934 ウチもコンビネーションで使うと動かないわ
>>932 さんは動いているようなので環境依存なのかな?
動かないって人は、それを書くと同時に、AHKのアイコンで右クリしてOpenを開いて、 View→Keyhistoryを開いて、どんな状況になってるのか、ログを貼り付けてくれよ。 直接は関係なくて今は流し見してるような人にとっても、 後で参照して役に立つスレにしてほしい。
>>936 僕の場合こうなってます。
13 045 s d 2.20 Pause
13 045 s u 0.02 Pause
44 020 d 0.14 D
44 020 u 0.19 D
74 03F # d 0.81 F5
>後で参照して役に立つスレにしてほしい
そうですね。このスレの過去ログをdat化するのがしんどい
dat化って… 元からdatじゃね?
Pauseも環境依存だった気がしたが実際はどうだったかな。
流行らせるページ確認しにいったらそもそも日本語環境における
Locks系キーの挙動についての注記自体なかったわ
>>937 環境依存かどうかの検証だったら
OSとかPC型番(ノートだとドライバが特殊な場合がある)とか
キーボードの種類や型番とかも書いた方が吉
(あ、あともちろんAHKの派生種類やバージョンも)
ファイルの内容の一部分だけを書き換えたいとき FileReadで全部読み込んでReplaceしてFileDeleteしてFileAppend ってやらないとだめかな 容量が大きいと時間がかかって効率がよくない
941 :
914 :2010/01/31(日) 22:16:38 ID:uZvK3+8k0
>>933 う゛、間違ってるね。スマソ。
テストした時に置き換えてやったはずなんだが、AHKUのままだったらしい。
で、ちょっと再テストししたところで、そういえばL43でてるから落として上書いて再テストしたら再現しない・・・
したらUnicode版になってた。
>>201 のではなく、LexikosビルドのUnicode版に。
fincsビルドのUnicode対応版はちょっと動きが怪しかったがLexikosビルドはどうだろう・・・
ATOKはF1〜F12までしか認識しません。ATOKにF13とか送りたいんだけど、どうしたらいいのかな?
意味ワカンネ。 キーを送る事自体でなく、キーを送ることで機能を呼び出せるのが目的何じゃないの?
>>943 すみませんね。
たとえば、変換操作をスペースじゃなくて、F13で呼び出せたら便利だなと思いまして。
というのは、ATOK自体でそこそこキーアサインを変えられるのですが、今ひとつ使えるキーが少ないのでAHKでなんとかならないかなと思いまして…
>>945 #IfwinActiveみたいにATOKにだけ特定にキーを送れたらと思いました。
後出しで本当に済みません…
sleipnirでフルスクリーンにしたとき、 標準ツールバーが強制的にonになってしまうのですが、autohotkeyでこれをoffにすることは出来ますか?
フルスクリーンオフのショトカトキーに ツールバー有無確認とツールバーオフの動作を仕込むとか
それなら、キーカスタマイズAPI完備な 常駐XULRunnerアプリがいいナリ Firefoxみたいにアドオンでいろんな機能を入れたいナリ
>>950 初めて知った。AHKの処理中に、複数の外部コマンドで組み合わせていた作業が、
簡単に出来そう。右も左もわからないまま、実行してみたら、サンプルは一通り動いた。
tcp_server
ローカルPC内でTCPサーバを動かす。サンプルだと80番で待機となるので、
ブラウザで自分のアドレスを開くと、それだけでそのままサンプルテキストが表示される。
tcp_client
Googleのトップページを、テキストで取得するサンプル。
tcp_server、tcp_clientは、使い方次第でいろいろ化けそう。
簡単な置き換えなら・・・
AHKのGUIウインドウで、なんらかのレポートを表示していた作業を、
ブラウザの127.0.0.1をrunで開いて、あとの体裁はブラウザに丸投げ。
AHKのrunで、別スレッドに指示を与えて、結果をもらう とかも出来るか。
ネット上のデータ収集とか、文字コードの変換とか。
あとは、tcp_serverを外向きに公開して自分でアクセスする目的で認証させて、
テレビ録画PCの予約管理とか、PIM管理やスケジューラとか、簡単に出来そう。
ただ、俺はAHKに体が慣れてしまったので、サンプルを増やしてほしい。
というわけでぜひ、NILを自分で流行らせるページ を作ってください>管理人氏
anhttpd で AHK でCGiやってみた時は苦行だったw ただ、簡単にキー送ったり出来るから面白かった。
http://www.autohotkey.com/forum/viewtopic.php?p=328920&highlight=#328920 LexikosはANSIビルドとUnicodeビルドがあるみたいなこと書いてるけど、
Unicodeビルドしか見あたらないんだが・・・
ところで、
>>509 は次バージョンで直すと言ってるね
> (前略)
> I've identified an issue with A_Desktop and similar built-in variables (specifically, ones which use ReadRegString)
> which prevents the code above and below from working correctly:
> Code:
> MsgBox %A_Desktop%\test.html ; omits \test.html
> For the time being, the following appears to work:
> Code:
> MsgBox % A_Desktop "\test.html"
> It should be fixed in the next revision.
>>950 マウスフックが出来るようになったらしいな。
この調子でキーボードとウィンドウ操作に対応したら、次スレは要らないな。
>>950 マウスフックが出来るようになったらしいな。
>>980 くらいまでにキーボードとウィンドウ操作に対応したら、次スレは要らないな。
p2重すぎ舐めんな
質問です WinActivateとControlFocusは一部のハングしたアプリ等で実行すると処理が停止してしまうようです そこでWinActivateの代わりに DllCall("SetForegroundWindow",UInt,ウィンドウのハンドル,Int) としたところ、これは正常に動きます しかし、ControlFocusの代わりに DllCall("SetForegroundWindow",UInt,コントロールのハンドル,Int) としたところ、ウィンドウがちらついたり非アクティブになってしまいます 何か解決策はありますか?
ここもム度が増してきたな
だってスクリプト言語のスレだし
そろそろ次スレだな テンプレとかは今のまま?
個人的に >877 はテンプレとして追加したい
Q1:[CapsLock(英数)][ひらがな][半角/全角]キーの割り当てがうまくいかないよ A1:OSのローカライズ段階で発生してる問題。 日本語環境だとLock系キーや[ひらがな][半角/全角]の動作はトグルキーとなる。 つまり、通常のキー(アルファベットやファンクションキーなど)とは異なり OS側がキーUp/Down情報を正しく返してこないのでAHKのみで対処は無理。 ドライバレイヤーでのリマップソフト(窓使いの憂鬱など)や、レジストリ変更でリマップを行う(ChangeKeyなど)を利用して [CapsLock]を別の普段使わないキー([F13]〜[F24]など)に割り当ててからAHKで利用すると良い。 例:ChangeKeyを使って[ひらがな]を[F13]にする手順。 AutoHotkeyで任意のキーをF13にリマップする。 (例えばF12をF13にリマップし、スクリプトを実行) F12::F13 Changekeyを起動する。(Changekeyが無いならググって入手する) 「調査」→「どのキーなのか?またはスキャンコードでキーを変更します」を選択。 F12を押すとスキャンコード「0x0064」、該当するキーは「該当なし」と表示される。 (0x0064 はF13のスキャンコード) 「上のスキャンコードでキー変更する」をクリックすると 「変更前 (中略) 0x0064 をどのキーに変更しますか?」 というウィンドウが表示されるので「ひらがな」キーを選択。 「登録」をクリックし、Windowsを再起動する。 リマップ( F12::F13 )を解除する。
>>964 こんなのがあったのか。なにげにすごい情報を見落としてた。
>>877 のHIDダイレクト入力のスクリプトをWin7で動かしてみたら、
ロジクールのSetPointを常駐させなくても、チルトの認識が出来た。
チルトを倒すと、btnflの値が800になり、チルトの傾斜を認識できる。
deltaが120で右倒し、-120で左倒し。
これってWin7だと、デフォルトで出来るんだっけ?
XPでもチルトを識別できるなら、CtrlやAltの押しっぱなし誤認識の
元凶といわれているSetPointと完全におさらばできるかも。
967 :
877 :2010/02/05(金) 20:30:54 ID:vHI0wqdh0
今更ながらリンク間違ってたのに気づいた。それにしても、JaneViewのFireFoxの履歴からちょこっと見るは便利だわw
一番下段に誤り有り
Windowsのイベントをフックして色々やりたい
×
http://www.autohotkey.com/forum/topic27146.html (←PocketPC版のAHKのトピック)
○
http://www.autohotkey.com/forum/topic19367.html テンプレの件だが、AutoHotkey_Lのユニコード対応版については言及した方がいいんじゃないのかね。
駄目文字については
>>6 の最後を↓みたくすればいいとは思うが
> これは、
>>1 にある「駄目文字微対策版」を使うことで回避できる。」
オブジェクトに関してはむずいなぁ・・・。配列やハッシュなら
> Q: 配列変数やハッシュ(仮想配列)は使ええないの?
> A: AutoHotkey_Lではオブジェクトを利用することで利用できる。
> 例)
> array := Object()
> array[1] := 100
> array.2 := "かきくけこ"
> MsgBox, % array.1 "`n" array[2]
> hash := Object()
> hash["hoge"] := "あいうえお"
> hash.fuga := x * y * z
> MsgBox, % hash.hoge "`n" hash["fuga"]
みたいな感じで良さそうだが・・・。
マウス右ボタンを押し下げてるとき、マウスを横に動かすと、画面横スクロール。 これを行いたいのですが、AHKで可能でしょうか? 私の力では無理です。
AutoHotKeyでウインドウを最背面に配置する、といったことはできないものでしょうか? 最前面にするにはアクティブにすればいいだけなのですが・・・
今すぐWinSetのページを読み直すんだ
>>971 サンクス!
これですね
> Attribute, Value
> (略)
> Bottom: Sends a window to the bottom of stack;
> that is, beneath all other windows. The effect is similar to pressing Alt-Escape.
> For example: WinSet, Bottom,, WinTitle
というかAlt-Escapeでようが済んでしまいました。ショートカット覚えておきます。
本当にありがとうございました。AutoHotKey何でもあるんだな
973 :
名無しさん@お腹いっぱい。 :2010/02/06(土) 20:16:19 ID:ABdOL7/C0
クリップボードの半角英数のテキストを 単語ごとに先頭文字を大文字に変換したいのですがAHKだけで可能でしょうか。 どのように記述すればいいのか教えていただけたらうれしいです。
StringUpper
エラー行を無視してスクリプトを実行させることできるかしら Lでアイコン付きメニューが作れると知ってメニュー型ランチャーを作ってみたんだけど うっかり場所変更でアイコンのパスが違ってたりすると実行すらしないから困った 修正するためにファイラーやエディタ類を起動したいとしても エクスプローラーから掘り下げて起動させないといけない 他のランチャーアプリみたいに不正な場所のみ非表示などで起動させてもらえないものか
>>975 他のランチャーアプリみたいはそういうエラー処理を作者が組み込んでるんだよ
自作するなら自前で FileExist() でチェックしなけりゃ
あと >928も参考に。
コマンドライン引数で /ErrorStdOut じゃ駄目なの?
>>977 実行を続行できなきゃ、意味が無いじゃん
項目一つ一つIfExistでチェックを入れてみることにした アドバイスthx
現在アクティブなウインドウに対して行うスクリプトを ランチャーのように、文字の一覧から選択して実行するようなことはできるのでしょうか? 指定の箇所をマウスクリックするスクリプトをたくさん登録したいのですが、 どのホットキーがどのスクリプトか忘れるので、見える形になればいいなと思ったのですが。
>980 Menu 使えば?
>>981 手掛ありがとうございます。
ヘルプにtray以外のサンプルがあればいいのに。まったくわからない
選択したいならMenu
ホットキーを思い出せればいいのならToolTipにホットキー一覧書いて表示する手もある。
>>979 >項目一つ一つIfExistで
ベタで書いてるのかな。エラー処理入れるならファイルパスを
バッファに入れてからループで回すと楽だよ。もしくは関数化するとか
ToolTipで表示される文字列を多段表示させることはできないのでしょうか? 3Dゲーム中、段落をわけて長文を表示させたいのです。 現在過去ログを漁ってそれを流用しようとしているのですが。 #Persistent AutoHideTooltip("このツールチップは5秒で消えます", 5000) AutoHideTooltip(msg, dur,x="",y="") { Tooltip, %msg%,%x%,%y%,20 SetTimer, AutoHideTooltip_HideTip,-%dur% return AutoHideTooltip_HideTip: Tooltip,,,,20 return } おしえてください。
`n
>>985 ありがとうございました。できました。
おそろしく長い一行になりそうです。
若干面倒だけど1行ごとに代入していけば良いんじゃないかな msg .= "1行目`n" msg .= "2行目`n"
そういうときは、ヒアドキュメントをつかうといい。 msg= ( おれは AutoHotkeyを 愛してる ) msgbox,%msg% 2行以上の場合は、ヒアつかったほうが、圧倒的に便利。 既存文章のコピペも、いちいち`nに置換せずにそのまま出来る
#Persistent #NoEnv CoordMode, Tooltip, Screen x = 100 y = 100 SetTimer, Timer1, On Return Timer1: Tooltip, (LTrim Comment %A_YYYY%/%A_MON%/%A_DD%(%A_DDD%) ; コマンド内でもヒアドキュメントは有効 %A_Hour%:%A_Min%:%A_Sec% ), x, y Return
ヒアドキュメントはインデントできないから(やるとそのままメッセージに反映されてしまう) コードの見通し的にはあんまり好きじゃないんだな。 msg .= "1行目`n" . "2行目`n" . "3行目`n" って感じで使うのが多いわ自分の場合
>982 以前書いた正しいか良く分からんコード。コマンドライン引数からもモード指定可能。 mode=%1% If mode = { Menu, ModeMenu, Add, Normal, NormalMode Menu, ModeMenu, Add, Stop, StopMode Menu, ModeMenu, Add, Reload, ReloadMode Menu, ModeMenu, Show } If mode = stop ... Exit NormalMode: mode=normal return StopMode: mode=stop return ReloadMode: mode=reload return
menuってすげー使いにくいと思う
そういうところ誰か作り直さないのかなほんと
俺は menu(str) って関数を作って、愛用している。 str= ( ABC DEF GHI JKL ) ret:=menu(str) ってやると、 ABC DEF GHI JKL という4項目のメニューが表示されて、選択するとretに文字列が返却される。 キャンセルするとヌルが返却される。 これで、単純な選択肢を出したいだけなら、もう何も考えずバンバン使えてる。 色づけとかチェックマークとか、必要なオプションは適宜、引数で渡してる。
ツールチップを表示するのをホットキーに割り当てて複数回押すと
記述がどんどん追加されていくのがかなしい。ずっと同じ表示だけしてくれればいいのに。
>>992 どこに各々のコマンドというか、マウスクリックさせる指令を入れるのでしょうか?
mode=とreturnの間に入れたら、stopに入れたメニュー項目を選択したらnormalのも実行されてしまいます。
どういう動作を期待してどんなことをしたら、意図した動作にならなかったか を書かないと誰も答えられないよ 出来れば最小限のコードも添える
0
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。