레이블이 AutoIt인 게시물을 표시합니다. 모든 게시물 표시
레이블이 AutoIt인 게시물을 표시합니다. 모든 게시물 표시

2009년 4월 27일 월요일

자작 FastPing 프로그램





AutoIt으로 작성했습니다..
게임을 할때 공속 업 효과를 가지고 오는 모양이더군요..


뭐.. 이런 저런 게임들에서 속도에 효과가 있는 모양입니다..

회사에서 누가 패스트핑 아느냐고 물어 보기에 적용방법을 찾아 만들게 되었군요..
처음 실행하면 패스트핑이 적용되고, 다시 실행하면 해제하게 됩니다.

적용후에는 재부팅 할 것인지 물어보는데 패스트핑 자체가 적용후 재부팅해야 적용되므로
재부팅하면 설정 다 날라가는  PC방에서는 헛일이겠군요...

아래 파일은 AutoIt 소스 입니다..
관심 있으신 분들은 한 번 살펴보세요  ^^

2009년 2월 11일 수요일

BestCrypt Traveller + Loader

단일 파일로 만들어진 파일 암호화 프로그램.

단일 파일 파일 구성, 간편한 셋팅 등으로 손쉽게 암호화된 컨테이너 파일을 생성할 수 있다.

### 준비물 ###
1. BestCrypt Traveller - 개인 사용자에게는 무료로 배포된다. 링크를 이용해 다운로드 받기를...
2. BestCrypt Loader - BCTraveller의 귀찮은 실행 문제를 해결해 주는 로더

### 사용 방법 ###

1. BestCrypt Traveller와 BestCrypt Loader를 다운로드 받는다.
2. BestCrypt Loader의 압축을 해제하여 적당한 디렉토리로 옮긴다.
3. 1에서 다운받은 BestCrypt Traveller를 2와 같은 디렉토리로 이동한다.
    다음과 같은 형태로 파일이 저장되어 있으면 OK.


4. BCTraveller Loader.exe를 실행한다.

### 컨테이너 파일 만들기 ###

1. 트레이 아이콘에서 BestCrypt를 클릭하고 "Create Ne Container"를 선택한다.

2. 저장할 파일 이름, 파일 저장 위치, 파일 사이즈 등의 속성을 설정한다.
주의 할 점은 파일 이름을 쓸 때에 확장자를 ".jbc"로 기입해 줘야 하며, 파일 저장 위치를 실행파일이 있는 하위의 Data 폴더에 저장하여야 한다. "Format now"를 선택하면, 컨테이너 파일이 생성되어 마운트 된 후 바로 드라이브 포멧 화면이 나타고, 포멧 후 바로 사용이 가능하다.

3. Create 버튼을 누르면 마운트 할때 사용할 비밀번호 입력화면이 나타난다.

4. 비밀 번호 입력 후 나타는 화면에서 마우스를 마구 움직이거나 키보드를 마구 두드려서 암호화 시드를 생성한다.
(OK 버튼이 활성화 될 때까지 가능한한 마구 두들기자.. ^^)

5. 드디어 컨테이너가 마운트 되고 포멧 화면이 나타났다.
6. 이제 포멧 후 이동식 디스크로 사용하면 된다. ^^

마운트 이후 트레이 메뉴의 변화 모습

### setting.ini 설정 ###

Data폴더 안에 있는 setting.ini 파일을 이용해 마운트할 파일을 지정하거나 드라이브명을 지정하여 사용할 수 있다.
setting.ini 파일이 없을 경우 BCTraveller Loader.exe를 실행하면 자동으로 생성되며, 이때 생성되는 항목은 Use와 Count 2개 항목이 '0' 값으로 설정된다.

아래는 ini 항목 설정 방법이다.
[Default]
Use : 기본값은 0으로 설정되어 있으며, 값이 0일 경우 setting.ini를 사용하지 않고 Data 폴더 안의 모든 jbc 파일을 HDD 이후 비어있는 드라이브명 부터 순서대로 마운트 한다. 1로 설정되어 있을 경우 [Container] 컬럼의 설정에 따라 동작한다.

[Container]
Count : 마운트할 컨테이너 개수를 지정한다. 0일 경우 컨테이너를 마운트 하지 않고 실행된다.
Container1 : 마운트될 컨테이너 파일 명을 지정한다.
Drive1 : 드라이브명을 고정하여 사용하고자 할 경우 입력한다. 비어있을 경우 순서대로 할당 받는다. (h: 형태로 기입)
Count 에 입력한 숫자 만큼 Container 및 Drive를 작성하여 주면 된다.
예를 들어 Count=2 로 설정하였을 경우

Count=2
Container1=MyDisk.jbc
Drive1=
Container2=Mydisk2.jbc
Drive2=y:

위와 같이 등록하면 됨.

BCTraveller Loader.exe가 실행되어 있는 상태에서 다시 실행하면 프로그램을 종료 시킬지 확인 후 종료한다. 이 때 마운트 되어있는 모든 컨테이너들을 마운트 해제하고 종료한다.(강제 종료)


----------- Cut Here 2009.02.11 ----------------------------------------------------------------------------------
로더 소스 일부를 수정했습니다. 여러 jbc파일을 마운트 할 때 마운트 중에 오류가 발생하는 경우가 있어.. Best Crypt에서 패스워드 창이 나타날때까지 WinWait함수로 기다리도록 수정했습니다.(딜레이 시간 설정 3초 - 3초정도면 넉넉할 듯 하더군요..)

스플래시 이미지 적용해 봤습니다.

----------- Cut Here 2009.02.13 ----------------------------------------------------------------------------------
스플래시 이미지 적용을 INI 설정으로 변경합니다.
INI 파일에서 [Default] 아래에 Splash=1로 값을 주면 됩니다.
설정값이 1일 경우 스플래시 이미지가 나타나며, 0일 경우에는 이미지 없이 바로 시작합니다.

2009년 2월 5일 목요일

하위 폴더를 포함한 폴더 및 파일 검색 스크립트

FileSearch.au3#include <Array.au3>

#cs ----------------------------------------------------------------------------

  프로그램 이름 : FileSearch
  파일          : FileSearch.au3
  Autoit버전    : 3.3.0.0
  함수          : _FileSearch($sPath[, $sExt[, $iFlag]])
  설명          : 하위 폴더를 포함하여 폴더 및 파일 검색
                 $sPath - 파일 찾기 경로(지정하지 않을 경우 작업 폴더를 기본으로 함)
                 $sExt - 찾고자 하는 필터(기본값 '*')
                 $iFlag - 찾기 옵션
                    $iFlag = 0 폴더와 파일 모두 검색(기본값)
                    $iFlag = 1 파일만 검색
                    $iFlag = 2 폴더만 검색
  저자         : Kuro™
  연락처        : kuro78@gmil.com, http://kuroz.tistory.com
  환경          : WInXP SP3(윈도우NT기반)
  수정          : 2009.02.04 - 최초 작성

#ce ----------------------------------------------------------------------------

Func _FileSearch($sPath = '', $sExt = '*', $iFlag = 0)
    Local $aResult[1], $aPath[1]
    Local $iHead = 1, $iTail = 1, $iCount = 0
    Local $hSearch
   
    If $sPath = '' Then $sPath = @WorkingDir
    If StringRight($sPath, 1) = '\' Then $sPath = StringTrimRight($sPath, 1)
   
    _ArrayAdd($aPath, $sPath)
    $iTail += 1
   
    while $iHead <> $iTail
        Local $sTmp, $sTmpPath
        $sTmpPath = $aPath[$iHead] & '\'
       
        $hSearch = FileFindFirstFile($sTmpPath&$sExt)
        If @error <> -1 Then
            
            $iHead += 1
           
            Do
                $sTmp = FileFindNextFile($hSearch)
                If @error Then
                    FileClose($hSearch)
                    ExitLoop
                EndIf
               
                If $sTmp = '.' Or $sTmp = '..' Then ContinueLoop
               
                If StringInStr(FileGetAttrib($sTmpPath & $sTmp), 'D') Then
                    _ArrayAdd($aPath, $sTmpPath & $sTmp)
                    
                    If $iFlag <> 1 Then $iCount = _ArrayAdd($aResult, $sTmpPath & $sTmp)
                   
                    $iTail += 1
                    ContinueLoop
                EndIf
               
                If $iFlag <> 2 Then $iCount = _ArrayAdd($aResult, $sTmpPath & $sTmp)
            Until 0
        EndIf
    WEnd
   
    $aResult[0] = $iCount

    Return $aResult
EndFunc


최종 버전... 처음엔 재귀함수 형태로 파일 검색 로직을 만들었다가 좌절했던...
bfs 방식으로 검색하도록 수정 후 확실히 속도는 많이 올라갔음...

약 4000개 파일 2000개 폴더 검색하는데 평균 45초 정도 걸린다...;;

아래는 처음에 작성했던 소스.....

재귀함수는 저하늘에 별에게나 줘버려 ㅡ_ㅢ;;


#include-once
#include <Array.au3>


Func _FileSearch($sParam, $iSub = 0, $iDirInc = 0)
    Local $hSearch, $aList[1], $aDirs[1], $sPath, $sExt
    
    $sPath = StringLeft($sParam, StringInStr($sParam, '\', 0, -1))
    If $sPath = '' Then $sPath = @WorkingDir & '\'
    $sExt = StringTrimLeft($sParam, StringInStr($sParam, '\', 0, -1))
    If $sExt = '' Then $sExt = '*.*'
    
    $hSearch = FileFindFirstFile($sPath & $sExt)
    If @error <> -1 Then
        Local $sFile, $iCount
        Do
            $sFile = FileFindNextFile($hSearch)
            If @error Then
                FileClose($hSearch)
                ExitLoop
            EndIf
            If $sFile = '.' Or $sFile = '..' Then ContinueLoop
            
            If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
                $iCnt = _ArrayAdd($aDirs, $sPath & $sFile)
                $aDirs[0] = $iCnt
                If Not $iDirInc Then ContinueLoop
            EndIf
            $iCount = _ArrayAdd($aList, $sPath & $sFile)
        until 0
        $aList[0] = $iCount
    EndIf
    
    If $iSub Then
        Local $aTmp
        For $i = 1 to $aDirs[0]
            $aTmp = _FileSearch($aDirs[$i] & '\' & $sExt, $iSub, $iDirInc)
            For $j = 1 to $aTmp[0]
                _ArrayAdd($aList, $aTmp[$j])
            Next
            $aList[0] += $aTmp[0]
        Next
    EndIf
    
    Return $aList
EndFunc




2009년 2월 3일 화요일

Splash 이미지 적용 예제

SplashImageOn("Splash", @ScriptDir & "\Data\splash.jpg", 300, 200, @DesktopWidth, @DesktopHeight, 1)  
WinSetTrans("Splash","",1)  
WinMove("Splash","", @DesktopWidth/2-300/2, @DesktopHeight/2-200/2)  
For $trans=0 to 255
WinSetTrans("Splash","",$trans)  
$trans+=1
Sleep(5)  
Next
Sleep(250)  
For $trans=255 to 0 Step -1
$trans-=1
WinSetTrans("Splash","",$trans)  
Sleep(5)  
Next
SplashOff()  

스플래시 이미지가 나타났다 사라지는 방법의 예제...
런처 만들때 써먹어야지 ^^;

2009년 2월 2일 월요일

AutoIt에서 멀티 프로세싱 구현

AutoIt으로 요즘 구상중인 프로젝트를 구현하려고 보니 멀티 스레드의 필요성이 팍팍~

어떤 방법으로 구현이 가능할까 고민하던 중 떡~하니 보여진 UO의 글 덕분에 길이 열렸다... 지화자~~

CoProc.au3 UDF를 이용하면 멀티 프로세싱을 구현할 수 있다. 뭐.. 두개든 세개든 돌아간다는 것에 도낀개낀 해보자.. ㅋㅋㅋ

다음은 CoProc UDF에 포함된 함수 리스트이다.


test.au3_CoProc([$sFunction],[$vParameter])
    ;Starts another Process and Calls $sFunc, Returns PID
_SuperGlobalSet($sName,[$vValue],[$sRegistryBase])
    ;Sets or Deletes a Superglobal Variable
_SuperGlobalGet($sName,[$fOption],[$sRegistryBase])
    ;Returns the Value of a Superglobal Variable
_ProcSuspend($vProcess)
    ;Suspends all Threads in $vProcess (PID or Name)
_ProcResume($vProcess)
    ;Resumes all Threads in $vProcess (PID or Name)
_ProcessGetWinList($vProcess, $sTitle = Default, $iOption = 0)
    ;Enumerates Windows of a Process
_CoProcReciver([$sFunction = ""])
    ;Register/Unregister Reciver Function
_CoProcSend($vProcess, $vParameter,[$iTimeout = 500],[$fAbortIfHung = True])
    ;Send Message to Process
_ConsoleForward($iPid1, [$iPid2], [$iPid3], [$iPidn])
_ProcessEmptyWorkingSet($vPid = @AutoItPID,[$hDll_psapi],[$hDll_kernel32])
    ;Removes as many pages as possible from the working set of the specified process.
_DuplicateHandle($dwSourcePid, $hSourceHandle, $dwTargetPid = @AutoItPID, $fCloseSource = False)
    ;Returns a Duplicate handle
_CloseHandle($hAny)
    ;Close a Handle



예제 파일도 포함되어 있지만.. 멀티 프로세스로 잘 돌아가는지 좀더 확실히 확인해 보고싶어 _CoProc()함수를
아래와 같이 수정해 봤다.


test.au3#NoTrayIcon
#include "CoProc.au3"

$iProc2Pid = _CoProc("_proc2", "notepad.exe")
$iProc3Pid = _CoProc("_Proc2", "regedit.exe")
sleep(500)

Func _Proc2($vParam)
    runwait($vParam)
    MsgBox(0, '', 'close')
EndFunc   ;==>_Proc2


AutoIt 3.3.0.0 버전을 사용한다면 RunErrorsFatal 예약어가 삭제되었으므로
아래와 같이 CoPorc.au3파일을 수정할 필요가 있다.


Func _CoProc($sFunction = Default, $vParameter = Default)
    Local $iPid, $iOldRunErrorsFatal
    If IsKeyword($sFunction) Or $sFunction = "" Then $sFunction = "__CoProcDummy"
    ;$iOldRunErrorsFatal = Opt("RunErrorsFatal", 0)
    EnvSet("CoProc", "0x" & Hex(StringToBinary ($sFunction)))
    EnvSet("CoProcParent", @AutoItPID)
    If Not IsKeyword($vParameter) Then
        EnvSet("CoProcParameterPresent", "True")
        EnvSet("CoProcParameter", StringToBinary ($vParameter))
    Else
        EnvSet("CoProcParameterPresent", "False")
    EndIf
    If @Compiled Then
        $iPid = Run(FileGetShortName(@AutoItExe), @WorkingDir, @SW_HIDE, 1 + 2 + 4)
    Else
        $iPid = Run(FileGetShortName(@AutoItExe) & ' "' & @ScriptFullPath & '"', @WorkingDir, @SW_HIDE, 1 + 2 + 4)
    EndIf
    If @error Then SetError(1)
    ;Opt("RunErrorsFatal", $iOldRunErrorsFatal)
    Return $iPid
EndFunc   ;==>_CoProc



이제 겨우 _CoProc()함수 익히고, _SuperGlobalGet(), _SuperGlobalSet(), _ProcessGetWinList()함수 정도 이해했다..;;
아직 갈길이 너무 멀어 ㅠ.ㅠ