2015년 2월 11일 수요일

[오토핫키스크립트] 파일관리기 , 공부용, 해부용

#SingleInstance force  ; 같은 스크립트의 다중 프로세스로 실행의 금지/허가설정

#NoTrayIcon            ; 프로그램이 트레이로 들어가지 않도록
#NoEnv                 ; 변수명을 해석할 때, 환경 변수를 무시한다

Gui, +Resize +MinSize  ; 창크기변화 하게
Gui, Font, s10, Arial ; 폰트 지정
Gui, Add, Edit, x6 y10 w250 h22 vDirSelect, c:/
Gui, Add, Button, x+6 y10 w50 h22 gDirSelectBt, ...
Gui, Add, Button, x+13 w50 h22 gDirSelectView, View
Gui, Add, Edit, x+6 w40 h22 vFileListnum, 40
Gui, Add, Edit, x+6 w70 h22 vFileListType, *.*
Gui, Add, CheckBox, x+6 w120 h20 vSubFileall, 서브모두
Gui, Add, ListView, x0 y40 r20 w700 vDirFilelist glistClick, N|Name|Size|Modified|FullPath
Gui, Show, w700 h403,님투 파일관리기
Return

;--------------------------------------------
; 폴더 선택
;--------------------------------------------
DirSelectBt:
FileSelectFolder, dndir, , 3
if dndir =
{
  return
}
GuiControl,, DirSelect, %dndir%
Return


;--------------------------------------------
; 해당 파일이 실행될 경우
;--------------------------------------------
listClick:
   CoordMode,MOUSE,RELATIVE
   MouseGetPos,mx,my,oID,oCNN
   If(A_GuiEvent = "DoubleClick")
   {   Gosub Doubleclick
   }
Return

Doubleclick:

Return


;--------------------------------------------
; 선택된 폴더의 파일목록
;--------------------------------------------
DirSelectView:
Gui,Submit, NoHide
;--------------------------------------------
; 목록 다시 시작
;--------------------------------------------
LV_Delete()
;--------------------------------------------
; 전달 받은 폴더/파일마스크,,서브목록옵션
; Loop, 폴더     : 현재 폴더의 파일만
; Loop, 폴더,, 1 : 서브폴더의 파일전체
;--------------------------------------------
Loop, %DirSelect%\%FileListType%,, %SubFileall%
{
  ;------------------------------------------
  ; 지정한 갯수를 출력하고 빠져나온다
  ; 기본 40 개
  ;------------------------------------------
  If A_Index>%FileListnum%
      Break
  ;------------------------------------------
  ; 번호|파일명|크기|생성일|패치
  ; N|Name|Size|Modified|FullPath
  ;------------------------------------------
  LV_Add("", A_Index, A_LoopFileName, A_LoopFileSize, A_LoopFileTimeModified, A_LoopFileLongPath)
}
;--------------------------------------------
; 셀크기 자동화
LV_ModifyCol()
Return

GuiSize:
;--------------------------------------------
; 창크기에 변화가 있을 경우 같이 크기가 변할
; 오브젝트 지정
;--------------------------------------------
Anchor("DirFilelist", "wh")
Return

GuiClose:
;--------------------------------------------
; 이 항목이 없으면 X 로 종료해도 프로세스에서
; 종료되지 않는다.
;--------------------------------------------
ExitApp

;--------------------------------------------
; 크기 자동함수
;--------------------------------------------
Anchor(i, a = "", r = false) {
  static c, cs = 12, cx = 255, cl = 0, g, gs = 8, z = 0, k = 0xffff, gx = 1
  If z = 0
    VarSetCapacity(g, gs * 99, 0), VarSetCapacity(c, cs * cx, 0), z := true
  If a =
  {
    StringLeft, gn, i, 2
    If gn contains :
    {
      StringTrimRight, gn, gn, 1
      t = 2
    }
    StringTrimLeft, i, i, t ? t : 3
    If gn is not digit
      gn := gx
  }
  Else gn := A_Gui
  If i is not xdigit
  {
    GuiControlGet, t, Hwnd, %i%
    If ErrorLevel = 0
      i := t
    Else ControlGet, i, Hwnd, , %i%
  }
  gb := (gn - 1) * gs
  Loop, %cx%
    If (NumGet(c, cb := cs * (A_Index - 1)) == i) {
      If a =
      {
        cf = 1
        Break
      }
      Else gx := A_Gui
      d := NumGet(g, gb), gw := A_GuiWidth - (d >> 16 & k), gh := A_GuiHeight - (d & k), as := 1
        , dx := NumGet(c, cb + 4, "Short"), dy := NumGet(c, cb + 6, "Short")
        , dw := NumGet(c, cb + 8, "Short"), dh := NumGet(c, cb + 10, "Short")
      Loop, Parse, a, xywh
        If A_Index > 1
          av := SubStr(a, as, 1), as += 1 + StrLen(A_LoopField)
            , d%av% += (InStr("yh", av) ? gh : gw) * (A_LoopField + 0 ? A_LoopField : 1)
      DllCall("SetWindowPos", "UInt", i, "Int", 0, "Int", dx, "Int", dy, "Int", dw, "Int", dh, "Int", 4)
      If r != 0
        DllCall("RedrawWindow", "UInt", i, "UInt", 0, "UInt", 0, "UInt", 0x0101) ; RDW_UPDATENOW | RDW_INVALIDATE
      Return
    }
  If cf != 1
    cb := cl, cl += cs
  If (!NumGet(g, gb)) {
    Gui, %gn%:+LastFound
    WinGetPos, , , , gh
    VarSetCapacity(pwi, 68, 0), DllCall("GetWindowInfo", "UInt", WinExist(), "UInt", &pwi)
      , NumPut(((bx := NumGet(pwi, 48)) << 16 | by := gh - A_GuiHeight - NumGet(pwi, 52)), g, gb + 4)
      , NumPut(A_GuiWidth << 16 | A_GuiHeight, g, gb)
  }
  Else d := NumGet(g, gb + 4), bx := d >> 16, by := d & k
  ControlGetPos, dx, dy, dw, dh, , ahk_id %i%
  If cf = 1
  {
    Gui, %gn%:+LastFound
    WinGetPos, , , gw, gh
    d := NumGet(g, gb), dw -= gw - bx * 2 - (d >> 16), dh -= gh - by - bx - (d & k)
  }
  NumPut(i, c, cb), NumPut(dx - bx, c, cb + 4, "Short"), NumPut(dy - by, c, cb + 6, "Short")
    , NumPut(dw, c, cb + 8, "Short"), NumPut(dh, c, cb + 10, "Short")
  Return, true
}

댓글 없음:

댓글 쓰기