Home > autohotkey

autohotkey Archive

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Comments (Close): -
  • TrackBack (Close): -

AutoHotkeyでドライブ文字を取得する

AutoHotkeyのコマンドでドライブ文字を取得

AutoHotkeyDriveGetコマンドの Listオプションでドライブ文字の一覧を取得する。

DriveGet, drives, List
list := RegExReplace(drives, "\w", "$0,", count, -1)
StringLen, length, list
StringLeft, list, list, % length - 1
MsgBox, %list%

; C,D,E

レジストリからドライブ文字を取得

AutoHotkeyの Loop (registry)コマンドでレジストリの「HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices」キーから「\DosDevices\(アルファベット):」という値を探して、ドライブ文字を取り出す。これだと、過去に使用したドライブ文字が残るようだ。

Loop, HKEY_LOCAL_MACHINE, SYSTEM\MountedDevices
{
    IfInString, A_LoopRegName, \DosDevices\
    {
        StringMid, drive, A_LoopRegName, 13, 1
        If (! list) {
            list = %drive%
        } else {
            list .= "`,"drive
        }
    }
}
Sort, list, CL D,
MsgBox, %list%

; A,C,D,E,F,G

Win32 APIでドライブ文字を取得

Win32 APIの GetLogicalDriveStrings 関数でドライブレターを取得するが、AutoHotkeyでは Null文字の後の値が取れないようなので、NumGet()関数で変数のメモリから数値を取り出し、文字に変換してみた。一応取れているけど、こんなやり方でいいんだろうか。

GetLogicalDriveStrings() { 
    nBufferLength = 108
    VarSetCapacity(lpBuffer, nBufferLength)
    length := DllCall("GetLogicalDriveStringsA", UInt, nBufferLength, Str, lpBuffer)
    Loop, %length%
    {
        If (A_Index = length) {
            break
        }
        chr := NumGet(lpBuffer, A_Index - 1, "UChar")
        chr := chr = 0 ? "`," : Chr(chr)
        str .= chr
    }
    return str
}

list := GetLogicalDriveStrings()
StringReplace, list, list, :\, , All
MsgBox, %list%

; C,D,E

AutoHotkeyでディスクの容量を取得する

AutoHotkeyのコマンドでディスクの容量を取得

AutoHotkeyDriveGetコマンドの Capacityオプションでディスクの容量を取得して、DriveSpaceFreeコマンドでディスクの空き容量を取得する。

SetFormat, float, 0.2

; ドライブレターを設定
directoryName = C:\
DriveGet, diskSpace, capacity, %directoryName%
if (ErrorLevel = 0) {
    diskSpace := diskSpace / 1024
    DriveSpaceFree, freeSpace, %directoryName%
    freeSpace := freeSpace / 1024
    text = ディスクの容量`t%diskSpace%GB`nディスクの空き容量`t%freeSpace%GB
} else {
    text = ディスクの容量を取得できませんでした
}
MsgBox, , %directoryName%, %text%

; ディスクの容量 37.27GB
; ディスクの空き容量 25.98GB

Win32 APIでディスクの容量を取得

AutoHotkeyの DllCall()関数で Win32 APIの GetDiskFreeSpaceEx 関数を呼び出して、ディスクの容量、空き容量を取得する。

SetFormat, float, 0.2

GetDiskFreeSpaceEx(lpDirectoryName) { 
    VarSetCapacity(lpTotalNumberOfBytes, 8)
    VarSetCapacity(lpTotalNumberOfFreeBytes, 8)
    result := DllCall("GetDiskFreeSpaceExA", Str, lpDirectoryName, UInt, 0, Uint, &lpTotalNumberOfBytes, UInt, &lpTotalNumberOfFreeBytes) 
    If (result) {
        size = % Numget(lpTotalNumberOfBytes, 0, "Int64") / (1024 * 1024 * 1024) "," Numget(lpTotalNumberOfFreeBytes, 0, "Int64") / (1024 * 1024 * 1024)
    } else {
        size = 0
    }
    return size
}

;ドライブレターを設定
directoryName = C:\
diskSpace := GetDiskFreeSpaceEx(directoryName)
If (diskSpace) {
    StringSplit, diskSpaceList, diskSpace, `,
    text = ディスクの容量`t%diskSpaceList1%GB`nディスクの空き容量`t%diskSpaceList2%GB
} else {
    text = ディスクの容量を取得できませんでした
}
MsgBox, , %directoryName%, %text%

; ディスクの容量 37.27GB
; ディスクの空き容量 25.98GB

AutoHotkeyの DriveGetコマンドと DriveSpaceFreeコマンドは容量をメガバイト単位で取得する(下位を切り捨て)ため、2つのスクリプトでは結果が異なることがある。

参考にしたページ

AutoHotkeyの SetTimer

AutoHotkeySetTimerコマンドは、サブルーチンを指定した時間ごとに実行する。

SetTimer, ラベル(サブルーチンなど), 時間(数値: ミリ秒, On: 停止したタイマーを起動, Off: タイマーを停止), スレッドの割り込み優先度

SetTimerは別スレッドとして実行されるから、下のスクリプトを実行すると、メッセージダイアログ(MsgBox)が閉じられなくても、指定した時間が過ぎるとタイマーが呼ばれてツールチップ(ToolTip)が表示される。(タイマーは常駐しないから、3番目のメッセージダイアログが閉じられてスクリプトが終わると、タイマーも終了する。#Persistentを使えば、タイマーを常駐させることができる。)

SetTimer, Timer, 5000
msgbox 1
msgbox 2
msgbox 3
return

Timer:
ToolTip , timer
Sleep 1000
ToolTip
return

1つのスクリプトの中で複数のスクリプト(スレッド)を実行させることができる。デフォルトは10で、#MaxThreadsによってスレッド数を20まで増やすことができる。

ただし、割り込んだスレッドが終了しないと、元のスレッドは実行されない。下のスクリプトでは、タイマーのメッセージダイアログが表示されると、そのメッセージダイアログが閉じられるまで元のスレッドは前に進まない。

SetTimer, Timer, 5000
msgbox 1
msgbox 2
msgbox 3
return

Timer:
msgbox timer
return

マウスの拡張ボタンでタスクを切り替える AutoHotkeyスクリプト

リスト型タスク切り替えスクリプト

IntelliPoint ソフトウェア(マウスのドライバ)でマウスのボタンにタスクを切り替える機能を割り当てようと思うと、「次のウィンドウ」と Alt+Tab機能がある。しかし、どちらもあまり使い勝手が良くない。

Alt+Tab(マクロで作成する)は、2つのウィンドウの間を行き来するだけで外のウィンドウに進めない。

「次のウィンドウ」(Alt+Esc)は、ウィンドウを多く開いていると、目的のウィンドウに到達するまで時間がかかることがある。それはいいとしても、何度もボタンを押さなければならないのが気に入らない。

リスト型タスク切り替えスクリプト

IntelliPoint ソフトウェアで割り当てられる機能だけでは物足りないから、AutoHotkeyを流行らせるページリスト型タスク切り替えの常駐版(TaskMenuP.ahk)を使ってみた。

上のページからスクリプトをダウンロードして実行すれば、使えるようになる。(使用するには、AutoHotkeyをインストールしておく必要がある。

マウスのプロパティで拡張ボタンに「(規定)」を割り当てておけば、第 4ボタンは XButton1、第 5ボタンは XButton2として AutoHotkeyに検知される。

スクリプトの基本動作
  1. 第 4ボタンを押していると、ウィンドウのリストが現れる。
  2. 押したままマウスカーソルを目的のウィンドウに移動する。
  3. 第 4ボタンを離すと、選んだウィンドウがアクティブになる。

Windowsの Alt+Tab機能を拡張ボタンとマウスカーソルで操作するような感じ。

少し自分用に変更したところ
  • 私はマウスを左手で使用しているから、第 4ボタンから第 5ボタンに換えた。(XButton1 → XButton2)
  • ウィンドウのリストにアイコンとタイトルだけを表示するようにした。元のスクリプトのリストにはアイコンとタイトルの他に、プロセスIDと実行ファイル名とウィンドウのクラス名が表示される。

ボタンを一回押すだけでウィンドウを切り替えられるのが良い。ただし、Alt+Tabのようにウィンドウはアクティブになった順には並ばない。それでも、大体位置は決まってるので(実行ファイル名の順番?)、迷うことはない。

今は、第 5ボタンにこのスクリプトを、第 4ボタンに「プログラムの終了」を割り当てているが、いつまで続くかな。

AutohotkeyからCOMオブジェクトを扱うテスト

AutohotkeyでIEを操作する練習をした。

Google検索のページを開き、テキストボックスに文字を入力して、検索ボタンを押す。

AutohotkeyからCOMオブジェクトを扱うにあたり、AutoHotkeyを流行らせるページActiveX.ahkを使用させてもらいました。

;ActiveX.ahkを同じディレクトリに置いてます
#include %A_ScriptDir%\ActiveX.ahk

;初期化
ActiveX()

;オブジェクト作成
ie:=CreateObject("InternetExplorer.Application")

pp(ie,"Visible","true")
inv(ie,"Navigate","http://www.google.co.jp/")

;表示待ち
Gosub IEbusy

doc:=gp(ie,"document")
forms:=gp(doc,"forms")
forms:=gp(doc,"f")
input:=gp(forms,"q")
pp(input,"value","test")
btn:=gp(forms,"btnG")
inv(btn,"click")


IEbusy:
    Loop {
        busy:=gp(ie,"busy")
        state:=gp(ie,"readyState")
        if ( busy = 0 and state = 4)
            break
        sleep 250
    }
return

Home > autohotkey

おまかせリンク(R)
全記事表示リンク
Search
Meta
Feeds

Page Top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。