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)
トラックバックURL : http://poimono.exblog.jp/tb/18998607
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
名前
URL
画像認証
削除用パスワード

※このブログはコメント承認制を適用しています。ブログの持ち主が承認するまでコメントは表示されません。

ブログトップ | ファンになる