[출처:http://autohotkey.co.kr/b/6-1012]
매번 트레이 아이콘 메뉴 편집하는게 뭐였더라 하면서 검색하는 제 자신을 발견해서 여기에 간단히 정리해 놓겠습니다.
http://www.autohotkey.co.kr/cgi/board.php?bo_table=qna&wr_id=26216#c_26219
이글에 ImMBR 님의 답변을 참고로
아이콘 자체를 아예 표시하지 않으시려면
#NoTrayIcon
트레이의 기본 메뉴를 삭제하려면
Menu, TRAY, NoStandard
기본 명령어는 위에 2개이고
기본 명령어 다 지우고 자신만의 메뉴을 만드려면
Menu, TRAY, NoStandard ; 기존 메뉴을 지운다.
Menu, tray, add, Item1, MenuHandler1 ; 메뉴 하나 추가
Menu, tray, add, Item2, MenuHandler2 ; 메뉴 하나 더 추가
Menu, tray, add ; 각 메뉴별 분류 라인이 필요할 경우
Menu, tray, add , Exit, ExitMenuHandler ;
return
MenuHandler1:
MsgBox %A_ThisMenuItem%을 선택했습니다.
return
MenuHandler2:
MsgBox %A_ThisMenuItem%을 선택했습니다.
return
ExitMenuHandler:
MsgBox, 4,, 프로그램을 종료하시겠습니까?
IfMsgBox Yes
ExitApp
else IfMsgBox No
return
이런 식으로 진행해 주시면 되고요 위에 예제를 단독으로 테스트 하고자 하실때는
맨 앞에
#Persistent
이 부분을 추가해주셔야지 프로그램이 메모리에 계속 상주해 있습니다.
2016. 3. 13.
2016. 3. 11.
함수(Function)에 대한 팁
[출처:http://autohotkey.co.kr/b/6-272]
함수가 왜 필요할까요?
여러번 반복해서 사용하고 싶은 균일한 명령어들이 필요할때, 간편하게 사용하기 위해서 쓰는것입니다.
반복해서 쓸것도 아닌데, 간편하게 만드는 경우는, 타인에게 함수를 제공할때정도 일것 같습니다
함수가 사실 어려운게 아닌데, 딱히 쉽게 이해될 팁이 없어서 힘들어 하시는분들이 계신듯합니다.
가급적 쉽게 오토핫키의 함수에 대해 적어보겠습니다.
1. 함수의 선언함수이름(사용될변수1, 사용될변수2, 사용될변수3...)
{
실행될 명령들
return 반환값
}
함수이름 : 사용되어질 함수이름입니다.
사용될변수1,2,3... : 함수안에서 사용되어질 변수입니다.
{} 중괄호 : 꼭 중괄호로 묶여져야만 합니다.
실행될 명령들 : 함수내부에서 실행되어지는 명령들입니다.
반환값 : 함수를 실행하고 값을 반환받고 싶을때 사용되어집니다.
return : 반환하고싶은값이 없다면, return이 필요없습니다.
* 여기서부터 함수에 대해 설명할때 함수선언된 내부와 함수가 선언되지 않는 스크립트부분으로 구분하여 이해를 도왔습니다. (main으로 설명하기엔 애매한감이 있었습니다.)
2. 함수의 호출우선 예제로 사용될 함수는 아래와 같습니다.
My_Add(a) ………………………… (3)
{
return a+1 …………………………… (4)
}
b=1 …………………………… (1)
b:=My_Add(b) ………………………… (2)
msgbox % b …………………………… (5)
우선 한가지 특성을 알려드리자면, 함수가 선언되면, 그에 해당하는 중괄호의 모든내용은 실제 스크립트에서
함수를 호출하지 않는이상 스크립트내용에 지장을 안줍니다.
그러므로 함수를 어디에 선언해도 무방합니다.
다르게 말하면, 여기서 중괄호는 if나 loop문에서 쓰이는 중괄호와 다소 다른 역할을 합니다. 스크립트내용에 영향을 안주는 영역설정을 하는것입니다.
스크립트내용에 대해 보겠습니다.
(1) b=1로 선언되었죠.
(2) 그리고 My_Add함수를 b를 넣어서 호출합니다. b는 1이므로 1값을 넣은것입니다.
(3) 그러면 이제 함수부분으로 갑니다.
여기가 중요합니다. b=1을 넣었으므로 함수안에선 a=1인 상태가됩니다.
즉 b와 a는 서로 다른곳에 위치한 변수입니다. 전혀 동일한 변수가 아니라는 얘기입니다.
(자세히 얘기하자면, a라는 변수는 함수를 실행할때만 일시적으로 생기는 변수입니다. 지역변수라고도 합니다.)
또 다르게 표현하자면, 스크립트에서 함수안에 a대신 b라고 써도 b=1로 선언한 변수와는 전혀 틀린 지역변수입니다.
다만 이름만 같을수 있을뿐입니다.
(4) return a+1 a에 1을 더한값을 반환한다는 얘기입니다.
(2) 다시 (2)로 돌아왔습니다. b:=My_Add(b)를 보면, My_Add(b)로부터 반환되는값을 b에 저장하겠다는 얘기입니다.
(5) 그러므로 msgbox % b 에서 b는 2가 출력됩니다.
사실 (1),(2),(5)는 좀더 간단히 표현할수 있습니다.
msgbox % My_Add("1")
한마디로 함수 My_Add에 1을 넣어서 반환받은값을 msgbox로 출력한다는 얘기입니다.
그러면 여기서 한가지 팁이 더 생겼죠?
값그자체로 넣을때는 My_Add("1")처럼 ""안에 넣고 변수형태로 넣을때는, My_Add(b)처럼 하면됩니다.
3. 두개이상의 반환값이 필요할때보시다싶이 return 으론 반환을 하나밖에 못하게 되어있습니다.
return없이 반환을 가능하게 해주는 명령어 두개가 있습니다. global, byref입니다.
a=3
b=3
My_Add()
msgbox % a
msgbox % b
My_Add()
{
global a
a:=a+1
b:=b+1
}
보시다싶이 My_Add엔 아무값도 안넣어서 실행을 했습니다.
그런데 결과값을보면, a=4,b=3이 출력되네요
간단합니다.
함수안에서 global a라은 명령을 실행해주면, 함수안의 a는 일시적으로 사용하는 지역변수가 아닌 스크립트에서 사용되는 a값을 사용할수 있게 해줍니다. 그러므로 함수실행후 a는 4가 되고 b는 3이 되는것입니다.
b에도 영향을 주려면, global b 라고 쓰면 되겠죠 ^^
a=3
b=3
My_Add(a,b)
msgbox % a
msgbox % b
My_Add(Byref a, Byref c)
{
a:=a+1
c:=c+1
}
Byref라고 쓰고 함수에서 변수를 선언해주면, 함수호출시 My_Add(a,b) 대입대는 변수a,b에 간섭을 가능하게 해줍니다.
근데 이상하게 생각되실수 있겠지만, Byref c라고 했음에도 불구하고, 실제 스크립트에서 쓰인 b=3값이 변하여 4가 됩니다.
포인터가 아무래도 적용이 된듯한데, 여기까진 아시면 좋지만, 굳이 알필욘없습니다.
그냥, 간편히 생각하자면, 함수호출시 a,b라고쓰고 함수선언시에는 c,d라고 써도 실제 a,b값에 간섭을 줄수 있다는 것입니다.
------------------------------------------------------------------------------------------------------------------
아마도 여기서부턴 안보셔도 대부분 함수사용시 지장이 없으실듯 합니다.
이 아래 내용은 보실분만 보세요.
4. 함수호출시 값을 안넣어도 함수가 실행되게끔하기
msgbox % My_Add("3")
msgbox % My_Add("3","4")
My_Add(a,b=1)
{
return a+b
}
보시면 함수선언에는 My_Add(a,b=1) a,b 두개가 선언되어있습니다.
하지만 b=1이라고 지정하여, b값을 입력받지 않을시, b는 기본으로 1이 되는것을 의미합니다.
그러므로 msgbox % My_Add("3") 는 4가 나오고, msgbox % My_Add("3","4") 7이 나옵니다.
한가지 주의사항이 있다면, 기본값을 지정할 변수들은 값을 무조건 넣어야 하는 변수보다 뒤쪽에 선언되어야 합니다.
Byref로 선언된 변수는 ""를 사용하는데 굳이 설명하진 않겠습니다. 스크립트만 답니다.
c=2
msgbox % My_Add("3","4")
msgbox % c
My_Add(a,b=1,byref d="")
{
d:=d+1
return a+b
}
5. 함수 호출시만 변하는 static변수
c=10
My_Add(c)
My_Add(c)
My_Add(c)
msgbox % b
My_Add(a)
{
a+=1
static b=0
b+=1
msgbox static b값 : %b%`n지역변수 a값 : %a%
}
static변수란 함수호출시에 함수안에서만 계속 영향을 받는 변수를 말합니다.
함수호출시 처음엔 static b=0 이라고 선언되지만, 그 이후엔 b=0이란 것은 무시되고 static변수로써 취급만 합니다.
그렇다면, 당연히 함수 처음실행시 b값은 1, 다음엔 2, 그다음엔 3으로 출력이 됩니다.
이미 4번까지 읽으셨다면, 자세한 설명이 없어도 이해되시라 생각합니다.
6. 함수의 응용 재귀함수우선 재귀의 국어사전 뜻을 보면,
재귀
[재ː―][再歸] <명사> 다시 본 곳으로 돌아옴. 재귀-하다 <자동사><여불규칙활용>
함수에서 얘기하자면, 함수내부에서 자신의 함수를 다시 돌아본다. 다시 실행한다 라고 얘기할수 있습니다.
스크립트에서 보겠습니다.
msgbox % My_Add("10") ………………………… (1)
My_Add(a) …………………………………………… (2)
{
if a=1 ………………………………………………… (3)
return "1"
else …………………………………………………… (4)
return a+My_Add(a-1)
}
(1) 우선 함수호출시 10을 넣습니다.
(2) 그럼 함수에서 지역변수 a는 10을 받습니다.
(4) else부분이 실행됩니다. 당연히 a=10이기 때문입니다.
a+My_Add(a-1)
즉 10+ My_Add(9)를 반환한다는 얘기입니다.
근데 My_Add(9)를 실행하면 또 반환을 받을수 있네요.
(2),(4)의 과정을 또 거치면, 10+9+My_Add(8)이 되겠네요.
그래서 a=1 될떄까지 계속 반복하다보면, 10+9+8+7+6+5+4+3+2+My_Add(1) 까지 오는데,
My_Add(1)은 1을 반환하므로 10+9+8+7+6+5+4+3+2+1이 됩니다.
간단히 설명하긴 했으나, Loop와는 다르게 이용할수 있습니다. ^^
* 여기까지 보셨다면, 직접 하나씩 함수를 만들어 보시거나, 사이트에 올라온 함수에 주석을 생각해 보시는건 어떠실까요?
최근에 올라온 MultipleSearch에 대해 보시는건 어떠실까요
제가 MBR님의 멀티플서치를 조금 수정해서 만든글을 보면, 재귀함수에 대해 조금은 보실수 있으실거예요
링크 : http://www.autohotkey.co.kr/cgi/board.php?bo_table=script&wr_id=483
함수가 왜 필요할까요?
여러번 반복해서 사용하고 싶은 균일한 명령어들이 필요할때, 간편하게 사용하기 위해서 쓰는것입니다.
반복해서 쓸것도 아닌데, 간편하게 만드는 경우는, 타인에게 함수를 제공할때정도 일것 같습니다
함수가 사실 어려운게 아닌데, 딱히 쉽게 이해될 팁이 없어서 힘들어 하시는분들이 계신듯합니다.
가급적 쉽게 오토핫키의 함수에 대해 적어보겠습니다.
1. 함수의 선언함수이름(사용될변수1, 사용될변수2, 사용될변수3...)
{
실행될 명령들
return 반환값
}
함수이름 : 사용되어질 함수이름입니다.
사용될변수1,2,3... : 함수안에서 사용되어질 변수입니다.
{} 중괄호 : 꼭 중괄호로 묶여져야만 합니다.
실행될 명령들 : 함수내부에서 실행되어지는 명령들입니다.
반환값 : 함수를 실행하고 값을 반환받고 싶을때 사용되어집니다.
return : 반환하고싶은값이 없다면, return이 필요없습니다.
* 여기서부터 함수에 대해 설명할때 함수선언된 내부와 함수가 선언되지 않는 스크립트부분으로 구분하여 이해를 도왔습니다. (main으로 설명하기엔 애매한감이 있었습니다.)
2. 함수의 호출우선 예제로 사용될 함수는 아래와 같습니다.
My_Add(a) ………………………… (3)
{
return a+1 …………………………… (4)
}
b=1 …………………………… (1)
b:=My_Add(b) ………………………… (2)
msgbox % b …………………………… (5)
우선 한가지 특성을 알려드리자면, 함수가 선언되면, 그에 해당하는 중괄호의 모든내용은 실제 스크립트에서
함수를 호출하지 않는이상 스크립트내용에 지장을 안줍니다.
그러므로 함수를 어디에 선언해도 무방합니다.
다르게 말하면, 여기서 중괄호는 if나 loop문에서 쓰이는 중괄호와 다소 다른 역할을 합니다. 스크립트내용에 영향을 안주는 영역설정을 하는것입니다.
스크립트내용에 대해 보겠습니다.
(1) b=1로 선언되었죠.
(2) 그리고 My_Add함수를 b를 넣어서 호출합니다. b는 1이므로 1값을 넣은것입니다.
(3) 그러면 이제 함수부분으로 갑니다.
여기가 중요합니다. b=1을 넣었으므로 함수안에선 a=1인 상태가됩니다.
즉 b와 a는 서로 다른곳에 위치한 변수입니다. 전혀 동일한 변수가 아니라는 얘기입니다.
(자세히 얘기하자면, a라는 변수는 함수를 실행할때만 일시적으로 생기는 변수입니다. 지역변수라고도 합니다.)
또 다르게 표현하자면, 스크립트에서 함수안에 a대신 b라고 써도 b=1로 선언한 변수와는 전혀 틀린 지역변수입니다.
다만 이름만 같을수 있을뿐입니다.
(4) return a+1 a에 1을 더한값을 반환한다는 얘기입니다.
(2) 다시 (2)로 돌아왔습니다. b:=My_Add(b)를 보면, My_Add(b)로부터 반환되는값을 b에 저장하겠다는 얘기입니다.
(5) 그러므로 msgbox % b 에서 b는 2가 출력됩니다.
사실 (1),(2),(5)는 좀더 간단히 표현할수 있습니다.
msgbox % My_Add("1")
한마디로 함수 My_Add에 1을 넣어서 반환받은값을 msgbox로 출력한다는 얘기입니다.
그러면 여기서 한가지 팁이 더 생겼죠?
값그자체로 넣을때는 My_Add("1")처럼 ""안에 넣고 변수형태로 넣을때는, My_Add(b)처럼 하면됩니다.
3. 두개이상의 반환값이 필요할때보시다싶이 return 으론 반환을 하나밖에 못하게 되어있습니다.
return없이 반환을 가능하게 해주는 명령어 두개가 있습니다. global, byref입니다.
a=3
b=3
My_Add()
msgbox % a
msgbox % b
My_Add()
{
global a
a:=a+1
b:=b+1
}
보시다싶이 My_Add엔 아무값도 안넣어서 실행을 했습니다.
그런데 결과값을보면, a=4,b=3이 출력되네요
간단합니다.
함수안에서 global a라은 명령을 실행해주면, 함수안의 a는 일시적으로 사용하는 지역변수가 아닌 스크립트에서 사용되는 a값을 사용할수 있게 해줍니다. 그러므로 함수실행후 a는 4가 되고 b는 3이 되는것입니다.
b에도 영향을 주려면, global b 라고 쓰면 되겠죠 ^^
a=3
b=3
My_Add(a,b)
msgbox % a
msgbox % b
My_Add(Byref a, Byref c)
{
a:=a+1
c:=c+1
}
Byref라고 쓰고 함수에서 변수를 선언해주면, 함수호출시 My_Add(a,b) 대입대는 변수a,b에 간섭을 가능하게 해줍니다.
근데 이상하게 생각되실수 있겠지만, Byref c라고 했음에도 불구하고, 실제 스크립트에서 쓰인 b=3값이 변하여 4가 됩니다.
포인터가 아무래도 적용이 된듯한데, 여기까진 아시면 좋지만, 굳이 알필욘없습니다.
그냥, 간편히 생각하자면, 함수호출시 a,b라고쓰고 함수선언시에는 c,d라고 써도 실제 a,b값에 간섭을 줄수 있다는 것입니다.
------------------------------------------------------------------------------------------------------------------
아마도 여기서부턴 안보셔도 대부분 함수사용시 지장이 없으실듯 합니다.
이 아래 내용은 보실분만 보세요.
4. 함수호출시 값을 안넣어도 함수가 실행되게끔하기
msgbox % My_Add("3")
msgbox % My_Add("3","4")
My_Add(a,b=1)
{
return a+b
}
보시면 함수선언에는 My_Add(a,b=1) a,b 두개가 선언되어있습니다.
하지만 b=1이라고 지정하여, b값을 입력받지 않을시, b는 기본으로 1이 되는것을 의미합니다.
그러므로 msgbox % My_Add("3") 는 4가 나오고, msgbox % My_Add("3","4") 7이 나옵니다.
한가지 주의사항이 있다면, 기본값을 지정할 변수들은 값을 무조건 넣어야 하는 변수보다 뒤쪽에 선언되어야 합니다.
Byref로 선언된 변수는 ""를 사용하는데 굳이 설명하진 않겠습니다. 스크립트만 답니다.
c=2
msgbox % My_Add("3","4")
msgbox % c
My_Add(a,b=1,byref d="")
{
d:=d+1
return a+b
}
5. 함수 호출시만 변하는 static변수
c=10
My_Add(c)
My_Add(c)
My_Add(c)
msgbox % b
My_Add(a)
{
a+=1
static b=0
b+=1
msgbox static b값 : %b%`n지역변수 a값 : %a%
}
static변수란 함수호출시에 함수안에서만 계속 영향을 받는 변수를 말합니다.
함수호출시 처음엔 static b=0 이라고 선언되지만, 그 이후엔 b=0이란 것은 무시되고 static변수로써 취급만 합니다.
그렇다면, 당연히 함수 처음실행시 b값은 1, 다음엔 2, 그다음엔 3으로 출력이 됩니다.
이미 4번까지 읽으셨다면, 자세한 설명이 없어도 이해되시라 생각합니다.
6. 함수의 응용 재귀함수우선 재귀의 국어사전 뜻을 보면,
재귀
[재ː―][再歸] <명사> 다시 본 곳으로 돌아옴. 재귀-하다 <자동사><여불규칙활용>
함수에서 얘기하자면, 함수내부에서 자신의 함수를 다시 돌아본다. 다시 실행한다 라고 얘기할수 있습니다.
스크립트에서 보겠습니다.
msgbox % My_Add("10") ………………………… (1)
My_Add(a) …………………………………………… (2)
{
if a=1 ………………………………………………… (3)
return "1"
else …………………………………………………… (4)
return a+My_Add(a-1)
}
(1) 우선 함수호출시 10을 넣습니다.
(2) 그럼 함수에서 지역변수 a는 10을 받습니다.
(4) else부분이 실행됩니다. 당연히 a=10이기 때문입니다.
a+My_Add(a-1)
즉 10+ My_Add(9)를 반환한다는 얘기입니다.
근데 My_Add(9)를 실행하면 또 반환을 받을수 있네요.
(2),(4)의 과정을 또 거치면, 10+9+My_Add(8)이 되겠네요.
그래서 a=1 될떄까지 계속 반복하다보면, 10+9+8+7+6+5+4+3+2+My_Add(1) 까지 오는데,
My_Add(1)은 1을 반환하므로 10+9+8+7+6+5+4+3+2+1이 됩니다.
간단히 설명하긴 했으나, Loop와는 다르게 이용할수 있습니다. ^^
* 여기까지 보셨다면, 직접 하나씩 함수를 만들어 보시거나, 사이트에 올라온 함수에 주석을 생각해 보시는건 어떠실까요?
최근에 올라온 MultipleSearch에 대해 보시는건 어떠실까요
제가 MBR님의 멀티플서치를 조금 수정해서 만든글을 보면, 재귀함수에 대해 조금은 보실수 있으실거예요
링크 : http://www.autohotkey.co.kr/cgi/board.php?bo_table=script&wr_id=483
2016. 3. 8.
if문 사용시 오류나거나 자주 헷갈리는 부분 정리
[출처:http://autohotkey.co.kr/b/6-260]
IF사용시 예전에는 제대로 안될때가 있어 %붙여보고 소괄호붙여보고..이래저래 헷갈렸었는데
쓰다보니 오토핫키상 오류는 원래 없었던듯 싶습니다.
여러가지 IF의 사용법에 대해 써보겠습니다.
1. 변수와 문자열,숫자 한개비교
변수=문자열
if 변수=문자열
msgbox ok
else
msgbox fail
=>ok출력
변수=3
if 변수=3
msgbox ok
else
msgbox fail
=>ok출력
하나의 변수에 대해선 문자열이든 숫자든 그냥 비교하시면됩니다.
2. 변수와 변수비교
변수1=4
변수2=4
if 변수1=변수2
msgbox ok
else
msgbox fail
=>fail출력
이렇게 하면 안됩니다.
두가지 방법이 있습니다.
변수1=4
변수2=4
if 변수1=%변수2%
msgbox ok
else
msgbox fail
=>ok출력
변수1=4
변수2=4
if (변수1=변수2)
msgbox ok
else
msgbox fail
=>ok출력
여기서보면 유추할수있듯이, %%로 묶어주면 변수로 취급됩니다.
그리고 ()소괄호로 묶어주면 안에있는 문자열은 변수로 취급됩니다.
그렇다면 한가지 둘다 %%로묶어주면 어떨까요?
변수1=4
변수2=4
if %변수1%=%변수2%
msgbox ok
else
msgbox fail
=>fail출력
안됩니다. 여기서보면 첫번째써진 문자열은 변수로 자동취급됨을 알수있습니다.
그렇다면, 소괄호로 묶인상태에서 문자열 비교는 어떻게할까요?
3. 소괄호 내의 변수와 문자열비교
변수=문자열
if (변수="문자열")
msgbox ok
else
msgbox fail
=>ok출력
간단합니다. ""로 묶어주면됩니다.
4. 두개 이상의 조건비교
변수1=4
변수2=5
변수3=6
if 변수1=4 and 변수2=5 and 변수3=6
msgbox ok
else
msgbox fail
=>fail출력
변수1=4
변수2=5
변수3=6
if (변수1=4 and 변수2=5 and 변수3=6)
msgbox ok
else
msgbox fail
=>ok출력
변수1=4
변수2=5
변수3=6
if (변수1=4) and 변수2=5 and 변수3=6
msgbox ok
else
msgbox fail
=>ok출력
fail의 원인을 보자면, =과 and연산자 사이의 연산우선순위에 있는듯합니다. = 대신 다른 비교문으로 실행하면 정상적으로 진행이 가능했습니다.
변수1=4
변수2=5
if 변수1<=5 and 변수2<=5
msgbox ok
else
msgbox fail
=>ok출력
변수1=4
변수2=5
변수3=6
if 변수1<=4 and 변수2<=7 and 변수3=7
msgbox ok
else
msgbox fail
=>ok출력(원래는 fail이 되야함 변수3은6이므로)
변수1=4
변수2=5
변수3=6
if (변수1<=4) and 변수2<=7 and 변수3=7
msgbox ok
else
msgbox fail
=>fail출력
이렇게 해야지 정상적으로 출력되었습니다.
여기서 소괄호 영역은 변수1까지든 변수2까지든 변수3까지 전체든 상관없습니다.
이렇게보니 여러개 비교할땐, 정확히 소괄호를 사용해주는게 편리할것같습니다.
물론 소괄호 영역에서 문자열 비교는 ""사용하는것 까먹으면 안되겠죠 ^^
5. 변수만 비교
변수=0
if 변수
msgbox ok
else
msgbox fail
=>fail출력
변수=
if 변수
msgbox ok
else
msgbox fail
=>fail출력
변수가 0이거나 비어있는경우를 제외하곤 무조건 성공합니다.
그러므로 흔히 내장변수로 제공되는 errorlevel은 특별한경우가 아니면
if errorlevel처럼 간단히 써도 무방합니다.
6. 함수를 if문에서 활용하기
개인이 만든 함수로 참거짓을 판단해야할 경우가 있습니다.
그럴때도 if문에서 사용이 가능합니다.
변수=3
if 결과:=자연수판단(변수) ;자연수판단 함수에 변수값 3을 넣고 결과변수에 그값을 반환받습니다.
msgbox ok
else
msgbox fail
msgbox % 결과 ;여기서 1출력
=>ok출력(결과는 1출력)
변수2=-1
if 결과:=자연수판단(변수2)
msgbox ok
else
msgbox fail
msgbox % 결과
=>fail출력(결과는 0출력)
자연수판단(변수)
{
if 변수>0
return 1
else
return 0
}
위에서 보시다싶이 함수로 반환받는 값을 바로 저장하면서 참거짓 여부를 판단할수 있습니다.
+ 추가정리)
◆ 오늘 공부하닥 우연히 발견했네요. Ternary operator
예) var := x>y ? 2 : 3
변수 세 개를 비교한 후에 값을 저장하는 건데요, 이걸 써보니까 스크립트 내용을 상당히 줄일 수 있더라구요 ^^
(This can improve a script's readability and maintainability)
◆ &&는 And의 의미로 모두 참일떄 값을 참으로 반환하고
하나라도 거짓이면 거짓으로반환합니다.
||는 OR의 의미로 모두거짓일때 거짓을 반환하고
하나라도 참이면 참을반환합니다.
a=1
if (e=3 || a=1 || b=2)
msgbox, ro
return
e=3
a=1
b=2
if (e=3 && a=1 && b=2)
msgbox, ro
return
IF사용시 예전에는 제대로 안될때가 있어 %붙여보고 소괄호붙여보고..이래저래 헷갈렸었는데
쓰다보니 오토핫키상 오류는 원래 없었던듯 싶습니다.
여러가지 IF의 사용법에 대해 써보겠습니다.
1. 변수와 문자열,숫자 한개비교
변수=문자열
if 변수=문자열
msgbox ok
else
msgbox fail
=>ok출력
변수=3
if 변수=3
msgbox ok
else
msgbox fail
=>ok출력
하나의 변수에 대해선 문자열이든 숫자든 그냥 비교하시면됩니다.
2. 변수와 변수비교
변수1=4
변수2=4
if 변수1=변수2
msgbox ok
else
msgbox fail
=>fail출력
이렇게 하면 안됩니다.
두가지 방법이 있습니다.
변수1=4
변수2=4
if 변수1=%변수2%
msgbox ok
else
msgbox fail
=>ok출력
변수1=4
변수2=4
if (변수1=변수2)
msgbox ok
else
msgbox fail
=>ok출력
여기서보면 유추할수있듯이, %%로 묶어주면 변수로 취급됩니다.
그리고 ()소괄호로 묶어주면 안에있는 문자열은 변수로 취급됩니다.
그렇다면 한가지 둘다 %%로묶어주면 어떨까요?
변수1=4
변수2=4
if %변수1%=%변수2%
msgbox ok
else
msgbox fail
=>fail출력
안됩니다. 여기서보면 첫번째써진 문자열은 변수로 자동취급됨을 알수있습니다.
그렇다면, 소괄호로 묶인상태에서 문자열 비교는 어떻게할까요?
3. 소괄호 내의 변수와 문자열비교
변수=문자열
if (변수="문자열")
msgbox ok
else
msgbox fail
=>ok출력
간단합니다. ""로 묶어주면됩니다.
4. 두개 이상의 조건비교
변수1=4
변수2=5
변수3=6
if 변수1=4 and 변수2=5 and 변수3=6
msgbox ok
else
msgbox fail
=>fail출력
변수1=4
변수2=5
변수3=6
if (변수1=4 and 변수2=5 and 변수3=6)
msgbox ok
else
msgbox fail
=>ok출력
변수1=4
변수2=5
변수3=6
if (변수1=4) and 변수2=5 and 변수3=6
msgbox ok
else
msgbox fail
=>ok출력
fail의 원인을 보자면, =과 and연산자 사이의 연산우선순위에 있는듯합니다. = 대신 다른 비교문으로 실행하면 정상적으로 진행이 가능했습니다.
변수1=4
변수2=5
if 변수1<=5 and 변수2<=5
msgbox ok
else
msgbox fail
=>ok출력
변수1=4
변수2=5
변수3=6
if 변수1<=4 and 변수2<=7 and 변수3=7
msgbox ok
else
msgbox fail
=>ok출력(원래는 fail이 되야함 변수3은6이므로)
변수1=4
변수2=5
변수3=6
if (변수1<=4) and 변수2<=7 and 변수3=7
msgbox ok
else
msgbox fail
=>fail출력
이렇게 해야지 정상적으로 출력되었습니다.
여기서 소괄호 영역은 변수1까지든 변수2까지든 변수3까지 전체든 상관없습니다.
이렇게보니 여러개 비교할땐, 정확히 소괄호를 사용해주는게 편리할것같습니다.
물론 소괄호 영역에서 문자열 비교는 ""사용하는것 까먹으면 안되겠죠 ^^
5. 변수만 비교
변수=0
if 변수
msgbox ok
else
msgbox fail
=>fail출력
변수=
if 변수
msgbox ok
else
msgbox fail
=>fail출력
변수가 0이거나 비어있는경우를 제외하곤 무조건 성공합니다.
그러므로 흔히 내장변수로 제공되는 errorlevel은 특별한경우가 아니면
if errorlevel처럼 간단히 써도 무방합니다.
6. 함수를 if문에서 활용하기
개인이 만든 함수로 참거짓을 판단해야할 경우가 있습니다.
그럴때도 if문에서 사용이 가능합니다.
변수=3
if 결과:=자연수판단(변수) ;자연수판단 함수에 변수값 3을 넣고 결과변수에 그값을 반환받습니다.
msgbox ok
else
msgbox fail
msgbox % 결과 ;여기서 1출력
=>ok출력(결과는 1출력)
변수2=-1
if 결과:=자연수판단(변수2)
msgbox ok
else
msgbox fail
msgbox % 결과
=>fail출력(결과는 0출력)
자연수판단(변수)
{
if 변수>0
return 1
else
return 0
}
위에서 보시다싶이 함수로 반환받는 값을 바로 저장하면서 참거짓 여부를 판단할수 있습니다.
+ 추가정리)
◆ 오늘 공부하닥 우연히 발견했네요. Ternary operator
예) var := x>y ? 2 : 3
변수 세 개를 비교한 후에 값을 저장하는 건데요, 이걸 써보니까 스크립트 내용을 상당히 줄일 수 있더라구요 ^^
(This can improve a script's readability and maintainability)
◆ &&는 And의 의미로 모두 참일떄 값을 참으로 반환하고
하나라도 거짓이면 거짓으로반환합니다.
||는 OR의 의미로 모두거짓일때 거짓을 반환하고
하나라도 참이면 참을반환합니다.
a=1
if (e=3 || a=1 || b=2)
msgbox, ro
return
e=3
a=1
b=2
if (e=3 && a=1 && b=2)
msgbox, ro
return
2016. 3. 4.
2CH AHK스레드에서 밝힌 AHK L버전의 편리함
원래 출처는 일본의 2ch 오토핫키 스레드라고 밝힙니다.
요점은 AHK basic과 비교해, COM기능이 자체내장되어, 소스가 엄청 줄어들었다는 것입니다.
■ 표준입출력
; ---- stdout.ahk ----
stdout := FileOpen(DllCall("GetStdHandle", "int", -11, "ptr"), "h `n")
Loop, 10
stdout.WriteLine(A_Index . "항목")
; ---- stdin.ahk ----
stdin := FileOpen(DllCall("GetStdHandle", "int", -10, "ptr"), "h `n")
While !stdin.AtEOF()
q .= stdin.ReadLine()
MsgBox, % q
사용예) 스크립트가 위치한 디렉토리에서 cmd로 다음과 같이 실행
> set ahk="C:\Program Files\AutoHotkey\AutoHotkey.exe"
> %ahk% stdout.ahk | %ahk% stdin.ahk
■ 메뉴에 아이콘 표시 Loop, 3 {
Menu, M1, Add, 항목%A_Index%, Dummy
Menu, M1, Icon, 항목%A_Index%, %A_WinDir%\Explorer.exe, %A_Index% ; , 32|64
}
Menu, M1, Show
Dummy:
Return
※ 주석을 제거하고 32나 64를 지정하면 큰 아이콘도 표시 가능
■ 탐색기에서 선택중인 파일의 풀패스를 복사 COM을 사용하므로 특수 폴더가 있어도 가능
SetTitleMatchMode, RegEx
#IfWinActive, ahk_class CabinetWClass|ExploreWClass
#c::
FileList:=
For window in ComObjCreate("Shell.Application").Windows
If (window.hwnd == WinExist()) {
For item in window.document.SelectedItems
FileList .= item.path "`n"
Break
}
Clipboard:=FileList, window:=item:=
Return
■ 활성화된 어플리케이션의 실행파일이 위치한 폴더를 열기
#z:: ; Win + z
WinGet, pid, PID, A
For process in ComObjGet("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId='" pid "'")
Run, % "explorer.exe /select`,""" . (process.ExecutablePath) . """"
process :=
Return
■ IE 자동화
ie := ComObjCreate("InternetExplorer.Application")
ie.Visible := True
ie.Navigate("http://www.google.co.kr/")
While ie.Busy()
Sleep, 50
MsgBox, 로드 완료`n`n폼에 문자를 입력합니다.
form := ie.document.GetElementsByTagName("FORM")[0]
form.q.value := "AutoHotkey"
MsgBox, 폼 송신 완료
form.submit()
While ie.Busy()
Sleep, 50
MsgBox, 검색결과가 표시되었습니다.`n`n종료합니다.
form:=""
ie.Quit() ; 종료시키지 않으면 iexplore.exe 프로세스가 남으므로 주의
■ AutoHotkey.dll을 이용한 멀티스레드
미리 AutoHotkey.dll를 다운로드하여, 모듈등록을 할 필요가 있음
(DLL이 있는 디렉토리에서 "regsvr32.exe AutoHotkey.dll"을 실행)
code := "#NoTrayIcon`nMsgBox, Thread #"
Loop, 10 {
ComObjCreate("AutoHotkey.script").AhkTextDll(code . A_Index)
Sleep, 100
}
[출처 : http://autohotkey.co.kr/b/1-960]
요점은 AHK basic과 비교해, COM기능이 자체내장되어, 소스가 엄청 줄어들었다는 것입니다.
■ 표준입출력
; ---- stdout.ahk ----
stdout := FileOpen(DllCall("GetStdHandle", "int", -11, "ptr"), "h `n")
Loop, 10
stdout.WriteLine(A_Index . "항목")
; ---- stdin.ahk ----
stdin := FileOpen(DllCall("GetStdHandle", "int", -10, "ptr"), "h `n")
While !stdin.AtEOF()
q .= stdin.ReadLine()
MsgBox, % q
사용예) 스크립트가 위치한 디렉토리에서 cmd로 다음과 같이 실행
> set ahk="C:\Program Files\AutoHotkey\AutoHotkey.exe"
> %ahk% stdout.ahk | %ahk% stdin.ahk
■ 메뉴에 아이콘 표시 Loop, 3 {
Menu, M1, Add, 항목%A_Index%, Dummy
Menu, M1, Icon, 항목%A_Index%, %A_WinDir%\Explorer.exe, %A_Index% ; , 32|64
}
Menu, M1, Show
Dummy:
Return
※ 주석을 제거하고 32나 64를 지정하면 큰 아이콘도 표시 가능
■ 탐색기에서 선택중인 파일의 풀패스를 복사 COM을 사용하므로 특수 폴더가 있어도 가능
SetTitleMatchMode, RegEx
#IfWinActive, ahk_class CabinetWClass|ExploreWClass
#c::
FileList:=
For window in ComObjCreate("Shell.Application").Windows
If (window.hwnd == WinExist()) {
For item in window.document.SelectedItems
FileList .= item.path "`n"
Break
}
Clipboard:=FileList, window:=item:=
Return
■ 활성화된 어플리케이션의 실행파일이 위치한 폴더를 열기
#z:: ; Win + z
WinGet, pid, PID, A
For process in ComObjGet("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId='" pid "'")
Run, % "explorer.exe /select`,""" . (process.ExecutablePath) . """"
process :=
Return
■ IE 자동화
ie := ComObjCreate("InternetExplorer.Application")
ie.Visible := True
ie.Navigate("http://www.google.co.kr/")
While ie.Busy()
Sleep, 50
MsgBox, 로드 완료`n`n폼에 문자를 입력합니다.
form := ie.document.GetElementsByTagName("FORM")[0]
form.q.value := "AutoHotkey"
MsgBox, 폼 송신 완료
form.submit()
While ie.Busy()
Sleep, 50
MsgBox, 검색결과가 표시되었습니다.`n`n종료합니다.
form:=""
ie.Quit() ; 종료시키지 않으면 iexplore.exe 프로세스가 남으므로 주의
■ AutoHotkey.dll을 이용한 멀티스레드
미리 AutoHotkey.dll를 다운로드하여, 모듈등록을 할 필요가 있음
(DLL이 있는 디렉토리에서 "regsvr32.exe AutoHotkey.dll"을 실행)
code := "#NoTrayIcon`nMsgBox, Thread #"
Loop, 10 {
ComObjCreate("AutoHotkey.script").AhkTextDll(code . A_Index)
Sleep, 100
}
[출처 : http://autohotkey.co.kr/b/1-960]
2016. 2. 17.
오토핫키 주요 내장변수 모음
A_WinDir : 윈도우 프로그램 (C:\Windows)
A_WorkingDir : 스크립트(혹은 컴파일 파일)가 실행된 파일의 폴더. 스크립트에서 특정path가 미지정된 경우 file관련 명령어가 우선적으로 참조.
A_Space : 띄어쓰기
A_Tap : 한줄내리기
A_Desktop : 바탕화면
A_StartMenu : 시작메뉴
A_Programs : 프로그램
A_Startup : 시작프로그램
A_MyDocuments : 내 문서
A_ScriptDir : 현재 실행중인 스크립트가 존재하는 디렉토리.
A_ScriptName : 현재 실행중인 스크립트의 이름(path는 제외).
A_ScriptFullPath : path를 포함한 A_ScriptName.
A_LineNumber : 스크립트에서 현재 실행중인 행의 번호. 디버깅시에 사용할 수 있음.
A_ThisFunc : 현재 실행중인 사용자 지정 함수의 이름.
A_ThisLabel : 현재 실행중인 label(서브루틴)의 이름.
A_AhkVersion : 현재 사용중인 AHK의 버젼.07
A_AhkPath : AHK가 설치되어 있는 path.
A_IsCompiled : 값이 1이면 현재 실행중인 스크립트가 compile된 상태임.
A_Username : 사용자계정
A_ComputerName : 네트워크 사용자계정
A_OSversion : 윈도우버젼(as Vista / Win_Xp / Win_95.98.ME etc..)
A_OSType : 윈도우비트(as 16bit / 32bit / 64bit)
ComSpec : cmd위치(as C:\Windows\system32\cmd.exe)
A_Temp : Temp폴더위치
A_IsAdmin : 사용자계정이 어드민이맞는지 확인 (맞다면1 아니라면0)
A_IPAddress1 : 내부아이피
A_IPAddress2 : 외부아이피(as hamachi)
A_Index : 횟수반복 (loop구문사용하게되면 1,2,3,4,5~쭉 차례대로 나열)
A_KeyDelay : 키보드딜레이 조정
A_WinDelay : 윈도우 관련 커멘드의 후에 비우는 동안을 지정
A_SetcontrolDelay : GUI컨트롤 조작시의 간격을 지정
A_MouseDelay : 마우스딜레이를 조정
A_DefaultMouseSpeed : 마우스스피드를 기본으로지정
A_Now : 윈도우상시간 (윈도우시간수정하면 무용지물 as ????년 ??월 ??일 ??시 ??분 ??초)
A_NowUTC : 윈도우상시간(GMT 표준 시간대)
A_YYYY : 2009 (연도 4자리)
A_MM : 11 (월 01-12)
A_DD : 22 (일 01-31)
A_MMMM : 11월
A_DDDD : 일요일 (요일)
A_DDD : 일 (요일)
A_WDay : 1 (요일을 숫자로 표현 1-7)
A_YDay : 326 (11월 22일은 2009년의 326번째 날)
A_YWeek : 200947 (이번 주는 2009년의 47번째 주)
A_Hour : 08 (시각 00-23)
A_Min : 20 (분 00-59)
A_Sec : 59 (초 00-59)
A_MSec : 109 (1/1000초 000-999)
A_TickCount : 컴퓨터가 부팅된 후 경과된 시간 (1/1000초 단위)
돌아다니면서 중복안되는 것들, 주로 쓰는 내장변수들로만 모아봤습니다.
그 외에는 아래 링크에서 공식홈페이지에서 영문으로 보세요.
https://www.autohotkey.com/docs/Variables.htm#Expressions
A_WorkingDir : 스크립트(혹은 컴파일 파일)가 실행된 파일의 폴더. 스크립트에서 특정path가 미지정된 경우 file관련 명령어가 우선적으로 참조.
A_Space : 띄어쓰기
A_Tap : 한줄내리기
A_Desktop : 바탕화면
A_StartMenu : 시작메뉴
A_Programs : 프로그램
A_Startup : 시작프로그램
A_MyDocuments : 내 문서
A_ScriptDir : 현재 실행중인 스크립트가 존재하는 디렉토리.
A_ScriptName : 현재 실행중인 스크립트의 이름(path는 제외).
A_ScriptFullPath : path를 포함한 A_ScriptName.
A_LineNumber : 스크립트에서 현재 실행중인 행의 번호. 디버깅시에 사용할 수 있음.
A_ThisFunc : 현재 실행중인 사용자 지정 함수의 이름.
A_ThisLabel : 현재 실행중인 label(서브루틴)의 이름.
A_AhkVersion : 현재 사용중인 AHK의 버젼.07
A_AhkPath : AHK가 설치되어 있는 path.
A_IsCompiled : 값이 1이면 현재 실행중인 스크립트가 compile된 상태임.
A_Username : 사용자계정
A_ComputerName : 네트워크 사용자계정
A_OSversion : 윈도우버젼(as Vista / Win_Xp / Win_95.98.ME etc..)
A_OSType : 윈도우비트(as 16bit / 32bit / 64bit)
ComSpec : cmd위치(as C:\Windows\system32\cmd.exe)
A_Temp : Temp폴더위치
A_IsAdmin : 사용자계정이 어드민이맞는지 확인 (맞다면1 아니라면0)
A_IPAddress1 : 내부아이피
A_IPAddress2 : 외부아이피(as hamachi)
A_Index : 횟수반복 (loop구문사용하게되면 1,2,3,4,5~쭉 차례대로 나열)
A_KeyDelay : 키보드딜레이 조정
A_WinDelay : 윈도우 관련 커멘드의 후에 비우는 동안을 지정
A_SetcontrolDelay : GUI컨트롤 조작시의 간격을 지정
A_MouseDelay : 마우스딜레이를 조정
A_DefaultMouseSpeed : 마우스스피드를 기본으로지정
A_Now : 윈도우상시간 (윈도우시간수정하면 무용지물 as ????년 ??월 ??일 ??시 ??분 ??초)
A_NowUTC : 윈도우상시간(GMT 표준 시간대)
A_YYYY : 2009 (연도 4자리)
A_MM : 11 (월 01-12)
A_DD : 22 (일 01-31)
A_MMMM : 11월
A_DDDD : 일요일 (요일)
A_DDD : 일 (요일)
A_WDay : 1 (요일을 숫자로 표현 1-7)
A_YDay : 326 (11월 22일은 2009년의 326번째 날)
A_YWeek : 200947 (이번 주는 2009년의 47번째 주)
A_Hour : 08 (시각 00-23)
A_Min : 20 (분 00-59)
A_Sec : 59 (초 00-59)
A_MSec : 109 (1/1000초 000-999)
A_TickCount : 컴퓨터가 부팅된 후 경과된 시간 (1/1000초 단위)
돌아다니면서 중복안되는 것들, 주로 쓰는 내장변수들로만 모아봤습니다.
그 외에는 아래 링크에서 공식홈페이지에서 영문으로 보세요.
https://www.autohotkey.com/docs/Variables.htm#Expressions
피드 구독하기:
글 (Atom)