AutoHotKey_Lで、Sz7内のジャンプ移動してみた。

 axpathlist2.spiはとても便利なんだが、リストが長大になると探索が大変で、フォルダ分けされてればビューアのフォルダ移動機能で楽できるのになーと思ったので、AHKでそれっぽくがんばってみた。

 空行でパス群を区切ったSz7を用意し、MassiGraでAlt+Up/Downすれば、フォルダ移動みたいな感じで次/前のパス群までジャンプする。例によって、MassiGra以外にも応用できるはず。

 ただし、Sz7に記述されたパスのリンク切れなどによって、ファイル名に含まれる連番と、パスの記述順がズレるとジャンプもズレる。ビューア側からは有効パスの連番しかわからず、それを元にSz7を走査してアタリをつけているので。

;--------------------------------------------------------------------------------------
; MassiGra
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class TF811202_MassiGra_Main

; Sz7中の次/前のファイル群(空行区切り)までジャンプ

!Up::Sz7Jump(0)
!Down::Sz7Jump(1)

Sz7Jump(SW) {
  WinGet, WHwnd, ID
  WinGetTitle, WTitle, ahk_id %WHwnd%
  if !RegExMatch(WTitle, "i)^([^<]+\.sz\d+)\\([^<]+)\.[^<]+(?:\s+<.+)?$", $)
    return
  Sz7Path := $1
  ItemNum := $2
  
  FileRead, Sz7Buf, *t *P932 %Sz7Path%
  Sz7Buf := "`n`n" Sz7Buf
  
  if SW {  ; 次
    if !RegExMatch(Sz7Buf, "^(?:\n+[^\n]+){" ItemNum ",}?\n{2,}[^\n]+\.([^\n\.]+)", $)
      return
  } else {  ; 前
    if !RegExMatch(Sz7Buf, "^(?:\n+[^\n]+){0," ItemNum - 2 "}\n{2,}[^\n]+\.([^\n\.]+)", $)
      return
  }
  TxtBuf := $
  FileExt := $1
  
  ErrorLevel := 0
  while !ErrorLevel
    StringReplace, TxtBuf, TxtBuf, `n`n, `n, All
  
  StringReplace, TxtBuf, TxtBuf, `n, `n, UseErrorLevel
  DropFiles(WHwnd, Sz7Path "\" ZeroSup(ErrorLevel, 9) "." FileExt)
}



ZeroSup(Num, NumDigit) {
  RegExMatch(Num, "^0*+(\d*)$", $)
  StringLen, NumLen, $1
  LoopNum := NumDigit - NumLen
  Loop, %LoopNum%
    $1 := 0 $1
  return, $1
}


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%
  if ErrorLevel
    MsgBox, DropFiles Err %errorlevel%
}

 たぶん、問題ない(ジャンプ先検出の正規表現に辿り着いたのかなり偶然なのでry)。

 axpathlist2.spi(てかSz7)自体がフォルダ分けに対応してればさー。あと、ファイル名とか内臓Docで元のパスわかるようにするとかー、リンク切れはダミー画像とかー、Unicode対応とかー、別のSz7のインクルードとかー、ワイルドカードとかー、相対パスとかさー、などと好き勝手いってたら、相対パスにはとっくの昔に対応済みだったという恥ずかしエピソードが。


[PR]
by lordnoesis | 2014-02-26 20:00 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、メディアプレーヤーを目覚ましアラームに。

 快適な目覚めのためには、時間をかけて徐々に目覚める必要があり、それに音楽を使うというのは知られた方法だが、音量までタイマー操作できるハード/ソフトってそうなくね? てかAHKで操作すればよくね? というわけで書いた。

 ウチはサブのオーディオデバイスのみスピーカーに繋がっている構成なので、出力するオーディオデバイスが選択できて、かつシンプルなプレーヤーということでQonohaを使った。自由度それなりに書いたので、その辺は各自適当に。

;--------------------------------------------------------------------------------------
; Qonoha
;--------------------------------------------------------------------------------------
#IfWinActive ahk_class QonohaPlayerMainWnd

F12::
  SetTimer, AAlarmRun, Off
  ;~ TipView()

  Loop {
    InputBox, AlarmTimeSet, AudioAlarm, アラーム時刻を24時間表記で入力してください`n例:午後1時5分 => 1305, , , 150
    if ErrorLevel
      return
    if RegExMatch(AlarmTimeSet, "([0-1][0-9]|2[0-3])([0-5][0-9])", $)
      break
  }
  AlarmH := $1
  AlarmM := $2

  AlarmTime := A_Now
  if (A_Hour > AlarmH) || (A_Hour == AlarmH && A_Min >= AlarmM) {
    AlarmTxt := "明日"
    EnvAdd, AlarmTime, 1, D
  } else {
    AlarmTxt := "本日"
  }

  FormatTime, AlarmTime, %AlarmTime%, yyyyMMdd'%AlarmH%%AlarmM%00'

  FormatTime, AlarmTxt, %AlarmTime%, %AlarmTxt%HH時mm分
  MsgBox, 262177, AudioAlarm, %AlarmTxt% にセットします。
  IfMsgBox, Cancel
    return

  FormatTime, AlarmTxt, %AlarmTime%, アラーム日時:dd日HH時mm分

  EnvSub, AlarmTime, , S
  if !AlarmTime {
    MsgBox, 262160, AudioAlarm, %AlarmTxt%を過ぎています。
    return
  }

  ;~ TipView(AlarmTxt, AlarmTime "000", 0, 0)
  SetTimer, AAlarmRun, -%AlarmTime%000
return

AAlarmRun:
  AudioFilePath := "C:\Users\Public\Music\Sample Music\Sleep Away.mp3"  ; 再生したいファイルのパス。
  SplitPath, AudioFilePath, AudioFileName

  PlayerPath := "C:\Qonoha\Qonoha.exe"
  PlayerTitle := AudioFileName " ahk_class QonohaPlayerMainWnd"
  VolUpKey := "Up"  ; 音量を上げるキー
  VolDnKey := "Down"  ; 音量を下げるキー

  VolMax := 25  ; 音量の最大値(VolUpKeyを何回叩くか)
  VolMaxPeriod := 3600000  ; 音量が最大になるまでにかかる時間(ミリ秒)

  Run, "%PlayerPath%" "%AudioFilePath%"
  WinWait, %PlayerTitle%
  Send, {%VolDnKey% %VolMax%}  ; 音量をゼロに

  VolUpWait := VolMaxPeriod / VolMax
  MACnt := 0
  SetTimer, AAlarmSnooze, %VolUpWait%

  MsgBox, 262208, AudioAlarm, %AlarmTxt% になりました。`n`n%AudioFileName%
  SetTimer, AAlarmSnooze, Off
  WinClose, %PlayerTitle%
return

AAlarmSnooze:
  MACnt++
  WinActivate, %PlayerTitle%
  Send, {%VolUpKey%}
  WinActivate, AudioAlarm ahk_class #32770
  if (VolMax <= MACnt)
    SetTimer, AAlarmSnooze, Off
return

 セット後にアラーム時刻を表示したいなら、コメントアウトしてあるTipView()を使う。

;--------------------------------------------------------------------------------------
; TipView.ahk
;--------------------------------------------------------------------------------------

TipView(TextBuf = "", Timer = 3000, X = "", Y = "", SW = 0) {
  if SW
    CoordMode, ToolTip

  ToolTip, %TextBuf%, X, Y
  if !Timer
    Timer := "Off"
  SetTimer, TipClose, %Timer%
}

TipClose:
  SetTimer, TipClose, Off
  ToolTip
return


[PR]
by lordnoesis | 2014-02-16 22:15 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる