タグ:AutoHotKey ( 73 ) タグの人気記事

AutoHotKey_Lで、フォルダの備忘録(あとで読む)作ってみた。

 私はタブが大好きなので、エクスプローラもタブ化している。そして、タブを開いていけばやがては「当面は必要ないから閉じたいけど、閉じると作業予定も忘れちゃうだろうなー」みたいなヤツが出てくる。これがブラウザだったら、いわゆる「あとで読む」のたぐいを使えばいいのだけど――というわけで作ったった!

 ウィンドウにドロップすると記録。リスト項目をダブルクリックで開く。その際、左端のチェックボックスが非チェックなら削除。右ダブルクリックすればチェックも無視して削除(開かない)。
 終了時にリストを記録して、次回起動時に再現。以上!

;/////////////////////////////////////////////////////////////////////////////////////
;
; OpenLater.ahk
;  フォルダをあとで開く
;
;/////////////////////////////////////////////////////////////////////////////////////


  DefCheckSW := 0  ; デフォルトで保護するか否か


;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


  if DefCheckSW
    DefCheckStr := "Check"
  
  FileEncoding, UTF-8-RAW
  
  SplitPath, A_ScriptName, , , , LogName
  LogPath := A_ScriptDir "\" LogName ".log"
  
  MarginX := 10, MarginY := 5
  Gui, Add, ListView, Checked AltSubmit Grid vPathListView gPathListViewAct, ID|名前|パス
  
  Loop, Read, %LogPath%
  {
    NowID := A_Index
    StringLeft, CheckSW, A_LoopReadLine, 1
    if CheckSW
      CheckStr := "Check"
    else
      CheckStr :=
    StringTrimLeft, DirPath, A_LoopReadLine, 1
    SplitPath, DirPath, DirName
    LV_Add("Vis " CheckStr, NowID, DirName, DirPath)
    StringReplace, DirPathEsc, DirPath, `,, `,`,, All
    PathList .= DirPathEsc ","
  }
  LV_ModifyCol(1, "Logical Auto")
  LV_ModifyCol(2, "Logical 100")
  LV_ModifyCol(3, "Logical AutoHdr")
  
  Gui, +AlwaysOnTop +Resize +MinSize
  Gui, Show, w300 h168
return

GuiDropFiles:
  GuiControl, -Redraw, PathListView

  StringReplace, DropList, A_GuiEvent, `r`n, `n, All
  NowID := LV_GetCount()
  Loop, Parse, DropList, `n, \
  {
    DirPath := A_LoopField
    FileAttrib := FileExist(DirPath)
    IfNotInString, FileAttrib, D
      continue
    StringReplace, DirPathEsc, DirPath, `,, `,`,, All
    if DirPathEsc in %PathList%
      continue
    PathList .= DirPathEsc ","
    SplitPath, DirPath, DirName
    NowID++
    LV_Add("Vis " DefCheckStr, NowID, DirName, DirPath)
  }
  gosub, ColWidthReset

  GuiControl, +Redraw, PathListView
return

PathListViewAct:
  if ("R" == A_GuiEvent)
    DelSW := 1
  else
    DelSW := 0
  
  if DelSW || ("A" == A_GuiEvent) {  ; 項目ダブクリ
    TrgItemID := A_EventInfo
    LV_GetText(DirPath, TrgItemID, 3)
    if !DelSW
      IfExist, %DirPath%
        Run, open %DirPath%
    if DelSW || (TrgItemID != LV_GetNext(TrgItemID - 1, "C")) {  ; 項目削除
      GuiControl, -Redraw, PathListView
      
      LV_GetText(DelPathID, TrgItemID, 1)
      StringReplace, DirPathEsc, DirPath, `,, `,`,, All
      StringReplace, PathList, PathList, %DirPathEsc%`,
      LV_Delete(TrgItemID)
      ListLineCnt := LV_GetCount()
      Loop, %ListLineCnt% {
        LV_GetText(PathID, A_Index, 1)
        if (PathID > DelPathID)
          LV_Modify(A_Index, "", PathID - 1)
      }
      gosub, ColWidthReset
      
      GuiControl, +Redraw, PathListView
    }
  }
return

ColWidthReset:
  LV_ModifyCol(1, "Auto")
  ;~ LV_ModifyCol(2, "100")
  LV_ModifyCol(3, "AutoHdr")
return

GuiSize:
  if (1 == A_EventInfo)
    return
  EMW := A_GuiWidth - MarginX * 2
  EMH := A_GuiHeight - MarginY * 2
  
  GuiControl, Move, PathListView, W%EMW% H%EMH%
  LV_ModifyCol(3, "Logical AutoHdr")
return

GuiClose:
  GuiControl, -Redraw, PathListView
  
  LV_ModifyCol(1, "Sort")
  PathList :=
  ListLineCnt := LV_GetCount()
  Loop, %ListLineCnt% {
    LV_GetText(DirPath, A_Index, 3)
    if (LV_GetNext(A_Index - 1, "C") == A_Index)
      PathList .= "1" DirPath "`n"
    else
      PathList .= "0" DirPath "`n"
  }
  FileDelete, %LogPath%
  FileAppend, %PathList%, %LogPath%
ExitApp

 Unicodeを諦めれば(FileEncodingをコメントアウト)、AHK_Lでなくともいいはず。

 以下はOpenLater.ahkを使いやすくする常駐スクリプト。エクスプローラでフォルダ(複数可)を選択してF11を押せばそのフォルダが、なにも選択していなければカレントフォルダがOpenLaterに送られる。
 OpenLaterが最小化状態でも問題なく動作する。

;--------------------------------------------------------------------------------------
; WindowsExplorer
;--------------------------------------------------------------------------------------
#IfWinActive, ahk_class CabinetWClass

$F11::
  KeyWait, F11
  PathList := GetSelectItemPath()
  if !ErrorLevel {
    WinGetText, CurPath, A
    RegExMatch(CurPath, "([A-Z]:\\[^\r\n]*)", $)
    PathList := $1
  }
  PathListEx :=
  Loop, Parse, PathList, `n
    IfExist, %A_LoopField%
      PathListEx .= A_LoopField "`n"
  Sort, PathListEx

  Sort, PathList
  IfWinNotExist, OpenLater.ahk ahk_class AutoHotkeyGUI
    Run, open hoge\OpenLater.ahk  ; OpenLater.ahkのパス
  WinWait, OpenLater.ahk ahk_class AutoHotkeyGUI
  WinGet, Hwnd, ID
  DropFiles(Hwnd, PathListEx)
  DropFiles(Hwnd, PathList)
return

GetSelectItemPath(FldSW = 0) {  ; AutoHotkey スレッド part11 >>913
  for Window in ComObjCreate("Shell.Application").Windows
    if (Window.hwnd == WinExist()) {
      for Item in Window.Document.SelectedItems
      {
        if (FldSW && !Item.IsFolder)
          continue
        FileList .= Item.Path "`n"
        Cnt++
      }
      break
    }
  StringTrimRight, FileList, FileList, 1
  ErrorLevel := Cnt
  return, FileList
}

DropFiles(hwnd, files, ptX=0, ptY=0, fNC=False) {  ; AutoHotkey スレッド part11 >>332
  static char_type:= A_IsUnicode ? "UShort" : "UChar"
    , char_size := A_IsUnicode ? 2 : 1
    , isUnicode := A_IsUnicode ? 1 : 0
  files := RTrim(files, "`r`n`t ") . "`n`n"
  byte_length := StrLen(files) * char_size
  Loop, Parse, files
    If (A_LoopField = "`n")
      NumPut(0x00, files, (A_Index-1) * char_size, char_type)
  
  hDrop := DllCall("GlobalAlloc", "UInt", 0x42, "UInt",20 + byte_length, "Ptr")
  p := DllCall("GlobalLock", "Ptr", hDrop)
  NumPut(20 , p + 00, "Int") ; offset
  NumPut(ptX , p + 04, "Int") ; pt.x
  NumPut(ptY , p + 08, "Int") ; pt.y
  NumPut(fNC , p + 12, "Int") ; fNC
  NumPut(isUnicode, p + 16, "Int") ; fWide
  DllCall("RtlMoveMemory", "Ptr", p + 20, "Str", files, "UInt", byte_length)
  DllCall("GlobalUnlock", "Ptr", hDrop)
  PostMessage, WM_DROPFILES := 0x233, hDrop , 0, , ahk_id %hwnd%
}

 DropFiles()のあとにウィンドウを閉じてもよさげ。

c0031643_1355170.png


[PR]
by lordnoesis | 2012-12-13 22:38 | テクノロジ | Trackback | Comments(0)

AutoHotKeyで、Everythingの検索結果からEverythingを呼び出してみた。

 EverythingSearchの検索結果で項目を選択してF4を押すと、選択項目のパスを新しいウィンドウ(仮名「結果ウィンドウ」)で検索するAHKスクリプト。Explorerなどでも便利なので、適当に#IfWinActiveをいじってやってみよう!(手抜き)
 「結果ウィンドウ」は、可能な限り再利用される。ただし「結果ウィンドウ」で実行した場合は、さらに新たなウィンドウが呼び出され、今後はそちらが再利用対象になる。

 Everythingでフォルダパスを検索(=フォルダを選択してF4)した場合、結果はそのフォルダ以下のファイル一覧。ファイルパスを検索(=ファイルを選択してF4)した場合、結果はそのファイルのみ。
 フォルダパスでフォルダの中身を検索したり、ファイルパスを削って「同じフォルダの別のファイル」や「別フォルダの同じ名前のファイル」を検索したり、あるいは「F4を二度押して(ファイルのみのウィンドウを残して)、一時的なファイル備忘録として使う」など、可能性は無限大だ!

  EverythingPath := "C:\Program Files (x86)\Everything\Everything.exe"  ; Appごとに似て非なるルーチンがたくさんあるので、AutoExecuteセクションで変数に格納してる。

;--------------------------------------------------------------------------------------
; Everything
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class ahk_class EVERYTHING

$F4::
  Send, ^c
  sleep, 200
  SearchWord := Clipboard

;  if RegExMatch(SearchWord, "適当に整形すればいいと思うよ!",$)
;    SearchWord := $1

  WinGet, HwndA, ID, A
  if (WinExist("ahk_id " HwndEV " ahk_class EVERYTHING") && (HwndA != HwndEV)) {
    ControlSetText, Edit1, %SearchWord%
    WinActivate
  } else {
    Run, %EverythingPath% -search "%SearchWord%"
    Loop {
      WinGet, HwndEV, ID, %SearchWord% ahk_class EVERYTHING
      if (HwndEV && (HwndEV != HwndA))
        break
      Sleep, 200
    }
  }
  WinWaitActive, ahk_id %HwndEV%
  ControlSend, EVERYTHING_LISTVIEW1, ^{NumpadAdd}  ; カラム幅自動調整
return

 WinGet, OutputVar, MinMaxで、「結果ウィンドウ」を最大化してるウィンドウに固定しても便利。最大化したら他が見えない? AeroSnapや半画面化を使うんだ!

 気づいたこと。

  • WinExist関数の対象もLastFoundWindowになるぽ? 日本語リファレンスには記載ない。
  • ExcludeTitleって文字列以外(ahk_idとか)は使えないのかー。
  • Ctrl+NumpadAddはフォーカス箇所で動作が変わる。文字欄ならEverythingの「文字拡大」、SysListView32では標準の「カラム幅自動調整」。


[PR]
by lordnoesis | 2012-11-30 22:12 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、マンガミーヤCEを便利にしてみた&「sz7」の読み込みに対応させたかった……。

 以前書いたマンガミーヤCE向けの「ホイールによるタブ移動」と「表示している書庫/画像のパス保存≒タブセッション保存」をクリンナップしつつ、パス保存で作ったパスリストの読み込み機能も実装してみた。

 あと、基本的なキー設定をすべてAHKでメニューID叩いて実現してみた。Win7だとキーカスタマイズができない問題があって、いちいちVMWareでXPを起動するのが面倒だったので、もう全部AHKでいいじゃん!みたいな。キー割り当てはソースを見れ。
 なお上下キーはページ移動だが、押しっぱなしにした場合の移動を、キーリピートに頼らず実現している(キーリピートだと早すぎる)。二連打でリミッター開放。

;--------------------------------------------------------------------------------------
; マンガミーヤCE MangaMeeyaCW
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class MainFrameDockWindow

MCE_MenuRepeat(MenuID) {
  PostMessage, 0x111, %MenuID%, 0, , A
  RegExMatch(A_ThisHotkey, "(\w+)", $)
  if (A_PriorHotkey == A_ThisHotkey ) && (150 > A_TimeSincePriorHotkey) {
    TipView("Turbo")
    WaitTime := 1
  } else {
    WaitTime := 100
  }
  KeyWait, %$1%, T0.5
  if ErrorLevel
    while GetKeyState($1, "P") {
      PostMessage, 0x111, %MenuID%, 0, , A
      Sleep, %WaitTime%
    }
  TipView("")
}


WheelUp::  ; タブバー上ならタブ移動
  MouseGetPos, , , , Ctrl
  if Ctrl
    PostMessage, 0x111, 20128, 0, , A
  else
    Send, ^+{Tab}
return

WheelDown::  ; タブバー上ならタブ移動
  MouseGetPos, , , , Ctrl
  if Ctrl
    PostMessage, 0x111, 20127, 0, , A
  else
    Send, ^{Tab}
return

Up::MCE_MenuRepeat("20092")  ; 戻る
Down::MCE_MenuRepeat("20091")  ; 進む

left::
Numpad1::
  send, ^+{Tab}  ; 右のタブ(ビューウィンドウ)
return

right::
Numpad3::
  send, ^{Tab}  ; 左のタブ(ビューウィンドウ)
return

^left::
Numpad4::
  PostMessage, 0x111, 20093, 0, , A  ; 1p進む
return

^right::
Numpad6::
  PostMessage, 0x111, 20094, 0, , A  ; 1p戻る
return

Numpad0::PostMessage, 0x111, 20151, 0, , A  ; 新規ビューウィンドウ

NumpadDot::PostMessage, 0x111, 20170, 0, , A  ; 画像情報表示

Space::  ; 見開き切替(1p/2p/自動見開き)
  MMCESW++
  if (1 == MMCESW) {
    PostMessage, 0x111, 20041, 0, , A
    TipView("1p")
  } else if (2 == MMCESW) {
    PostMessage, 0x111, 20042, 0, , A
    TipView("2p")
  } else {
    PostMessage, 0x111, 20044, 0, , A
    TipView("Auto")
    MMCESW := 0
  }
return

s::  ; 表示画像のパスをリストに保存(書庫内パス対応)
w::  ; パス保存後、タブ移動
  WinGet, AWinID, ID, A
  if (PreAWinID != AWinID)
    Prefix := A_Now
  PreAWinID := AWinID

  PostMessage, 0x111, 20151, 0, , A
  Sleep, 100
  PostMessage, 0x111, 20151, 0, , A

  WinGetText, WinTxt, A
  RegExMatch(WinTxt, "sJS)(?:([A-Z]:\\[\S ]+).*((?1))|((?1)))", $)
  if $3
    FileAppend, %$3%`n, MCE_%Prefix%.txt
  else
    FileAppend, %$1%`n%$2%`n, MCE_%Prefix%.txt
  SplashView($1 $3 "`n" $2)

  IfWinNotExist, MCE_%Prefix%.txt
    Run, MCE_%Prefix%.txt

  if ("w" == A_ThisLabel)
    Send, ^{Tab}
return

l::
  IfWinActive, A
  MsgBox, 262179, MangaMeeyaCEでパスリストを開く, クリップボードをパスリストと見なして開きますか?`n`n「いいえ」を選択した場合、パスリスト選択ダイアログを開きます。
  
  IfMsgBox, Cancel
    return
  IfMsgBox, Yes
    PathList := Clipboard
  IfMsgBox, No
  {
    FileSelectFile, ListPath, 3, .\, パスリストを開く, *.txt; *.sz7
    if !ListPath
      return
    FileRead, PathList, *t *P932 %ListPath%
    SplitPath, ListPath, , , ListExt
  }
  if !PathList
    return
  
  WinGet, MCE_PID, PID
  wmi := ComObjGet("winmgmts:")
  queryEnum := wmi.ExecQuery(""
    . "Select * from Win32_Process where ProcessId=" . MCE_PID)
    ._NewEnum()
  if queryEnum[process] {
    RegExMatch(process.CommandLine, """?([^""]+|\S+)""?", $)
    MCE_Path := $1
  }
  wmi := queryEnum := process := ""
  
  if ("sz7" == ListExt)
    MCE2sz7(PathList, MCE_Path)
  else {
    Loop, Parse, PathList, `n, %A_Space%%A_Tab%
    {
      Run, %MCE_Path% "%A_LoopField%"
      Sleep, 100
    }
  }
return

MCE2sz7(PathList, TrgPath, TrgHwnd = 0) {  ; ※sz7疑似展開機能は書庫内パス対応不可能
  if !TrgHwnd
    TrgHwnd := WinExist()
  
  Run, %TrgPath% "Dummy"
  Sleep, 100
  
  Loop, Parse, PathList, `n, \%A_Space%%A_Tab%
  {
    FileGetAttrib, FileAttrib, %A_LoopField%
    IfInString, FileAttrib, D  ; フォルダなら無視
      continue
    if (PrePath == A_LoopField)  ; ひとつ前と同じなら無視
      continue
    PrePath := A_LoopField
    
    if FileExist(A_LoopField) {  ; 実在するパス
      DropFiles(TrgHwnd, A_LoopField)
      Cnt++
    }
  }
  return, Cnt
}

 ソースみればわかるが、以前も作成スクリプトを書いたりしてたsz7の読み込みに、疑似的に対応してみた。というか、本当はコレがメイン。
 パスリスト読み込みは「n個のパスをn個のタブで開く機能」だが、sz7読み込みは「複数のパスをひとつのタブに開く機能」。ただし書庫内パスには非対応。CEの対応ファイルが"実在"していないとならない。

 CEはSusieプラグイン非対応なのでaxpathlist2.spiが使えないが、DnDの仕様をうまく利用すればいけるんじゃね?と思いやってみたが、「書庫はDnDでもリスト追加でなく新規に開く」「無理に書庫内パスを複数渡しても、読み込みエラー」という仕様の前に敗れ去る。無念。
 冷静に考えると(今時はメモリも有り余ってるのだし)、axpathlist2.spi入れた本家マンガミーヤを複数開いて、疑似的にタブ化すればいいよねっていう……。



オマケという名の夢の跡。
[PR]
by lordnoesis | 2012-11-09 20:54 | テクノロジ | Trackback | Comments(0)

MouseGesture.ahkで、マウスホイールを加速してみた。

 長いページをホイールでスクロールさせるのが面倒になって、ソフトごとにホイール係数変えてみたら便利だったので、さらに発展させてみた。

 ホイールを一方向に連続して回転させ続けると、徐々に加速――というか、動く距離が増えていく。
 解除はカウンターあてればできるのだし、移動量の増加と共に、許容する入力間隔も増加させた方がいいかも。調整は個々人によるだろうから、今回はとりあえず600固定にしといた。かなり素早く回した時だけ超加速――というのも考えたが、必死こいて回したくないというのが出発点なのでやめた。他に、Shift+ホイールとかでPageUp/Downさせるのもいいかも。

 以下、ブラウザ向けの例。条件定義等は各自適当に。内容自体は、MG.ahkでなくAHKでも動く。

[Browser]
Exe=iexplore.exe
Exe=firefox.exe
Exe=opera.exe
Exe=chrome.exe

[WU_]
G=WU_
Browser=if(("*WheelUp" == A_PriorHotkey) && (600 >= A_TimeSincePriorHotkey)) {【TAB】【TAB】if (6 > WUSW) {【TAB】【TAB】【TAB】WUSW++【TAB】【TAB】【TAB】Send, {WheelUp}【TAB】【TAB】} else if (18 > WUSW) {【TAB】【TAB】【TAB】;TipView("Turbo", 600)【TAB】【TAB】【TAB】WUSW++【TAB】【TAB】【TAB】Send, {WheelUp 3}【TAB】【TAB】} else {【TAB】【TAB】【TAB】;TipView("Super Turbo", 600)【TAB】【TAB】【TAB】Send, {WheelUp 6}【TAB】【TAB】}【TAB】} else {【TAB】【TAB】WUSW := 1【TAB】【TAB】Send, {WheelUp}【TAB】}

[WD_]
G=WD_
Browser=if(("*WheelDown" == A_PriorHotkey) && (600 >= A_TimeSincePriorHotkey)) {【TAB】【TAB】if (6 > WDSW) {【TAB】【TAB】【TAB】WDSW++【TAB】【TAB】【TAB】Send, {WheelDown}【TAB】【TAB】} else if (18 > WDSW) {【TAB】【TAB】【TAB】;TipView("Turbo", 600)【TAB】【TAB】【TAB】WDSW++【TAB】【TAB】【TAB】Send, {WheelDown 3}【TAB】【TAB】} else {【TAB】【TAB】【TAB】;TipView("Super Turbo", 600)【TAB】【TAB】【TAB】Send, {WheelDown 6}【TAB】【TAB】}【TAB】} else {【TAB】【TAB】WDSW := 1【TAB】【TAB】Send, {WheelDown}【TAB】}

 発動してるか判りにくいので、ツールチップを表示するユーザー関数「TipView」を仕込んである。使いたい人はコメントアウトを解除して、以下の関数をMG.ahkの拡張スクリプトに書くか、AHKの関数ライブラリに置く。



TipView.ahk
[PR]
by lordnoesis | 2012-10-15 20:30 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Explorerのファイル操作を便利に。

 エクスプローラで「カレントフォルダ/選択ファイルのフルパスをコピー」「選択アイテムを上のフォルダへ移動」「選択フォルダの中身を吸い上げる」のみっつを実現してみた。アンドゥ/リドゥ対応。

$F12::
  PathList := GetSelectItemPath()
  if PathList {
    SplashView(PathList)
    Clipboard := PathList
  } else {
    WinGetText, CurPath, A
    RegExMatch(CurPath, "([A-Z]:\\[^\r\n]*)", $)
    SplashView($1)
    Clipboard := $1
  }
return

^u::
  PathList := GetSelectItemPath()
  if !PathList
    return
  Loop, Parse, PathList, `n, %A_Space%%A_Tab%
  {
    SendPath := A_LoopField
    break
  }
  SplitPath, SendPath, , SendPath
  SplitPath, SendPath, , SendPath
  MsgBox, 292, 選択中のアイテムを上のフォルダへ移動, 以下のフォルダ・ファイルを上のフォルダへ移動します。`n`n%PathList%
  IfMsgBox, No
    return

  Loop, Parse, PathList, `n, %A_Space%%A_Tab%
  {
    SendDir := ComObjCreate("Shell.Application").NameSpace(SendPath)
    SendDir.moveHere(A_LoopField)
  }
  SendDir :=
return

^r::
  PathList := GetSelectItemPath()
  if !PathList
    return
  Loop, Parse, PathList, `n, %A_Space%%A_Tab%
  {
    SendPath := A_LoopField
    break
  }
  SplitPath, SendPath, , SendPath
  MsgBox, 292, 選択中のフォルダの中身を上のフォルダへ移動, 以下のフォルダの中身をこのフォルダに移動します。`n`n%PathList%
  IfMsgBox, No
    return

  ShellApp := ComObjCreate("Shell.Application")
  SendDir := ShellApp.NameSpace(SendPath)
  Loop, Parse, PathList, `n, %A_Space%%A_Tab%
  {
    FileGetAttrib, FileAttrib, %A_LoopField%
    IfNotInString, FileAttrib, D  ; フォルダでなければ無視
      continue
    
    SendDir.moveHere(ShellApp.NameSpace(A_LoopField).Items)
    
    If CheckBlankDir(A_LoopField)
      FileRemoveDir, %A_LoopField%
  }
  ShellApp :=, SendDir :=
return

GetSelectItemPath() {  ; AutoHotkey スレッド part11 >>913
  for Window in ComObjCreate("Shell.Application").Windows
    if ( Window.hwnd == WinExist() ){
      for Item in Window.Document.SelectedItems
        FileList .= Item.Path "`n"
      break
    }
  StringTrimRight, FileList, FileList, 1
  return, FileList
}

CheckBlankDir(TrgDir) {
  Loop, %TrgDir%/*, 1
    return, 0
  return, 1
}

SplashView(TextBuf, Timer = 1500) {
  Progress, B1 ZH0 W800, %TextBuf%
  SetTimer, SplashClose, %Timer%
}

SplashClose:
  SetTimer, SplashClose, Off
  Progress, Off
return

 "Loop, Parse"~のとこは、正規表現で取り出した方がいいのかなー? 正規表現だと負荷高そう(※個人の思い込みです)。

 エクスプローラのアンドゥ/リドゥが使いたくてCOM使ってみたのだが、このあたりが素人の限界か。一度のアンドゥ/リドゥで、任意の(ワイルドカードで示せない)複数ファイルを操作するにはどうすりゃいいんだ?


[PR]
by lordnoesis | 2012-10-14 22:24 | テクノロジ | Trackback | Comments(0)

AutoHotKeyで、KbMediaPlayerを少し便利に。

 KbMediaPlayerが7年ぶりにバージョンアップされたが、メニューのIDが変わって今までのスクリプトで問題が出たので、更新がてらPOSTしてみる。「2.51beta.2012.0930」向け。

;--------------------------------------------------------------------------------------
; KbMediaPlayer
;--------------------------------------------------------------------------------------
#IfWinActive - KbMedia Player - ahk_class TFrmMIDI

F1::return
F2::PostMessage, 0x111, 24, 0, , A  ; 単曲再生
F3::PostMessage, 0x111, 21, 0, , A  ; 単曲リピート
F4::PostMessage, 0x111, 22, 0, , A  ; リピート
F6::
  PostMessage, 0x111, 16, 0, , A  ; フェードアウト
  Sleep, 3500
  PostMessage, 0x111, 15, 0, , A  ; 停止
return
F7::PostMessage, 0x111, 25, 0, , A  ; 連続再生
F8::PostMessage, 0x111, 26, 0, , A  ; ランダム再生
F9::PostMessage, 0x111, 29, 0, , A  ; 未再生の曲だけ


#IfWinActive Error ahk_class #32770, ファイルは削除または移動されました。

; 「ファイルが見つからん」ダイアログでスペースを打鍵すると、以後自動で閉じるように。
$Space::
  SetTimer, Check_KB, 500
return

Check_KB:
  IfWinExist, Error ahk_class #32770, ファイルは削除または移動されました。
  {
    ControlSend, , {Enter}
    WinWaitClose, , , 1
    PostMessage, 0x111, 18, 0, , ahk_class TFrmMIDI  ; 次の曲
  }
  IfWinNotExist, ahk_class TFrmMIDI
    SetTimer, Check_KB, Off
return

 どのキーがどの機能か覚えられない人は、スキンにでも書いておくとよい。

 後半のは、音楽ファイルのあるNASが停止中に「次の曲」した時にダイアログ頻発するの対策。ダイアログが出てると(Kbの)ホットキー効かなくなるから、致命的に邪魔なんだあれ……。

 ダイアログ閉じるだけでなく、正常に次の曲が読み込まれるまで繰り返すようにしてみた。


[PR]
by lordnoesis | 2012-09-30 19:41 | テクノロジ | Trackback | Comments(0)

AutoHotKeyで、常駐AHKスクリプトの運用を少し便利に。

 常駐AHKスクリプトの運用(編集やリロード)を便利にするホットキー。

;--------------------------------------------------------------------------------------
; AHK
;--------------------------------------------------------------------------------------

; 5秒後にスクリプトリロード
; もう一度呼び出せば即座にリロード。一時的にホットキーを無効化する作用も。
#R::
  Suspend, Permit
  if ("#R" == A_PriorHotkey)
    Reload
  Suspend, On
  SplashTextOn, 100, 20, , AHK Reload
  SetTimer, AHK_Reload, -5000
return

AHK_Reload:
  Reload
return

; スクリプト編集
#E::
  Run, Edit %A_ScriptFullPath%
return

; WinSpy呼び出し
; WinSpy起動済みならアクティブに。
#W::
  SplitPath, A_AhkPath, , AhkDir
  IfWinExist, Active Window Info (Shift-Alt-Tab to freeze display) ahk_class AU3Reveal
    WinActivate
  else
    Run, %AhkDir%\AU3_Spy.exe
return


[PR]
by lordnoesis | 2012-09-30 18:05 | Trackback | Comments(0)

AutoHotKeyで、Operaの拡張管理を開いてもKbMedia Playerが停止しないようにしてみた。

 KbMedia Playerでホットキーを有効にしてるとそちらが優先されて、Operaで拡張管理を開くショートカットが効かなくなるので、AHKで対策。
 打鍵で拡張管理を開き、長押しでKb停止。

#IfWinActive ahk_class OperaWindowClass
$^+E::
  KeyWait, E, T0.8
  if ErrorLevel
    Send, ^+E
  else
    SendPlay, ^+E
  KeyWait, E
return

 SendとSendPlayを逆にした方が(長押しで拡張管理にした方が)使いやすいかも。Kbはグローバルホットキーだし。


[PR]
by lordnoesis | 2012-09-13 20:42 | テクノロジ | Trackback | Comments(0)

AutoHotKeyで、.sz7を生成してみたり+α。

 axpathlist2.spiとat_picture、それとLeeyesを利用して、.sz7で方々のファイルを上手いことまとめる手法を補助するAHKスクリプト群。

axpathlist2.spi形式の.sz7を生成するAHKスクリプト

 コマンドラインオプションでファイルパス(書庫内書庫対応)を指定すると、ファイルの存在するフォルダor実在書庫と同じ名前の.sz7ファイルを生成する。既に存在した場合は追記。複数パスを一度に渡すとソートしてから登録する。起動してからウィンドウにファイルをドロップしても登録できるが、DnDで書庫内パスを渡すアプリはないだろうなぁ。

;/////////////////////////////////////////////////////////////////////////////////////
;
; Add sz7
;
;/////////////////////////////////////////////////////////////////////////////////////

  Heading1 := "Drop && Run"
  Heading2 := "Running..."
  ErrMsg := ""

  if (1 > %0%) {
    Gui, Add, Text, vHeading, %Heading1%
    Gui, Add, Edit, vErrMsg Multi ReadOnly, %ErrMsg%
    Gui, +AlwaysOnTop
    Gui, +Resize
    Gui, +MinSize
    Gui, Show, W200 H113,
  } else {
    gosub, main
    ExitApp
  }
return

GuiDropFiles:
  StringReplace, FileList, A_GuiEvent, `r`n, `n, 1
  0 := A_EventInfo  ; ドロップされたファイル数を代入
  Loop, Parse, FileList, `n, \
    %A_Index% := A_LoopField

main:
  GuiControl, Text, Heading, %Heading2%
  PathList := ""
  Loop, %0%
  {
    Cmdline := %A_Index%
    loop, %Cmdline%
      Cmdline := A_LoopFileLongPath  ; ロングパス化
    PathList .= Cmdline "`n"
  }
  StringTrimRight, PathList, PathList, 1

  Sort, PathList, CL

  Loop, Parse, PathList, `n
  {
    ArchivePath := GetArchivePath(A_LoopField)
    if ErrorLevel
      SplitPath, ArchivePath, , ArchivePath
    SplitPath, ArchivePath, , ArchiveDir, , Sz7Name
    FileAppend, %A_LoopField%`n, %ArchiveDir%\%Sz7Name%.sz7
  }

  MaxNum = %0%
  SplashView(Sz7Name ".sz7 へ " MaxNum " 個のアイテムを登録しました。")

  if ErrCnt {  ; Errがあったら
  }
  GuiControl, Text, Heading, %Heading1%
return

;/////////////////////////////////////////////////////////////////////////////////////

GetArchivePath(TrgPath = "") {
  ErrorLevel := 0
  if ("" != FileExist(TrgPath))
    ErrorLevel := 1
  loop {
    if ("" != FileExist(TrgPath))
      break
    idx := InStr(TrgPath, ".", 0, 0)
    if !idx
      return
    idx := InStr(TrgPath, "\", 0, %idx%)
    if idx
      StringMid, TrgPath, TrgPath, 1, idx - 1
  }
  return, TrgPath
}

;/////////////////////////////////////////////////////////////////////////////////////

GuiSize:
  if (1 == A_EventInfo)
    return

  EMW := A_GuiWidth - 20, EMH := A_GuiHeight -35
  GuiControl, Move, ErrMsg, W%EMW% H%EMH%
return

GuiClose:
  GUI, Destroy
  Sleep, 2000
  ExitApp

;/////////////////////////////////////////////////////////////////////////////////////

SplashView(TextBuf, Timer = 1500) {
  Progress, B1 ZH0 W600, %TextBuf%
  SetTimer, SplashClose, %Timer%
}

SplashClose:
  SetTimer, SplashClose, Off
  Progress, Off
return

 テキスト表示欄使ってないのは自作テンプレートそのまま使いまわした将来的な拡張余地!

AtPicture2での.sz7の保存を少し便利に。

 .sz7はAtPictureの「ファイルから画像をリストアップ」で開けばグラフィカルに編集できるが、保存がちょっと面倒なので、簡略化するAHKスクリプト。
 F12を押すとAddSz7.ahkと同じく、画像の存在するフォルダor実在書庫と同名の.sz7を上書き保存する。

;--------------------------------------------------------------------------------------
; AtPicture2
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class atpicture2

F12::
  KeyWait, Shift
  KeyWait, Ctrl
  KeyWait, Alt
  BlockInput, On
  WinGetTitle, Title, A
  RegExMatch(Title, "([a-zA-Z]:\\.*)\.[^.]+$", $)
  PostMessage, 0x111, 10102, 0, , A
  WinWait, パスリストを保存 ahk_class #32770
  Control, EditPaste, %$1%.sz7, Edit1
  Send, {Enter}
  WinWait, 名前を付けて保存の確認 ahk_class #32770, , 1
  if !ErrorLevel
    Send, y
  BlockInput, Off
return

Leeyesで.sz7を扱う。

 axpathlist.spiをLeeyesに認識させれば、.sz7を書庫として扱える。

 AddSz7.ahkは、Leeyesの外部アプリケーションに登録しておくと便利。登録は右クリックから。その際、「書庫内のファイルは書庫内のパスを含めて渡す」を有効にすること。

 AtPicture2も登録しておけば、編集したい時に便利。


[PR]
by lordnoesis | 2012-08-24 21:30 | テクノロジ | Trackback(1) | Comments(0)

AutoHotKeyで、Leeyesをちょっと便利にしてみた。

 Leeyesで複数ファイルをDELキーで削除しようとすると時間がかかる。どうも、ひとつ削除しては画面更新という動作を繰り返しているのが原因っぽい。メニューなどから削除を選択した場合は、普通に一括削除するので問題ない。というわけで、DELを削除コマンドに割り当てるAHK。

;--------------------------------------------------------------------------------------
; Leeyes
;--------------------------------------------------------------------------------------
#IfWinActive Leeyes
Del::
  PostMessage, 0x111, 46, 0, , A
return

 大抵の場合――ショートカットファイルや「書庫内の項目がフォルダひとつの場合は自動で開く」を活用していると特に、「一つ上の階層へ」より「前へ戻る」の方が便利。だが、キー/マウスカスタマイズでこのコマンドは利用できない。というわけで、画像ビューのダブルクリックあたりを「登録アプリケーションの実行」にして、以下のAHKスクリプトを登録すればOK。力技。

  send, !{Left}

 なんか2回やらないと上手く戻れない時があるな?


[PR]
by lordnoesis | 2012-08-24 21:15 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる