Hey, Scripting Guy!봄바람 속에 꽃은 피고, 대화 상자는 열리고

Microsoft Scripting Guys

드디어 봄이 왔습니다. 이렇게 반가울 수가 없네요. 지난 겨울 미국에는 기록적인 폭우와, 진눈깨비, 눈보라, 폭풍 등이 할퀴고 지나갔습니다. 한 Scripting Guy의 집에서도 뒷마당의 큰 나무가 쓰러졌는데, 다행히 건물을 살짝 빗나가긴 했지만 Scripting Guy가 키우는 개가 놀라 소파 밑으로 피하기도 했지요. 그런데 이제 봄이 온 것입니다. 태평양 북서쪽에서 후덥지근한 비가 몰려 오는 여름이 되기 전에 지금은 다소 시원한 비를 만끽하고 있답니다.

창밖에 내리는 이슬비를 보면서 저희 팀은 이번에 스크립팅에서 다소 모험심을 발휘하여 HTA(HTML 응용 프로그램)를 다루면 좋겠다는 생각을 했습니다. 여기서 모험심이란 절대 빈말이 아닙니다. 무언가 새로운 것을 소개하지는 않겠습니다. 여기에서는 독자 여러분이 HTA의 정의와 생성 방법을 이미 알고 계신 것으로 간주하겠습니다. 혹시 HTA를 잘 모르신다면 스크립트 센터의 HTA 개발자 센터를 확인해 보시기 바랍니다. 특히 HTA 초보자 섹션에 있는 두 개의 기사는 매우 유용할 것입니다. 문서를 다 읽은 후 여기로 다시 돌아오면 됩니다.

이 칼럼에서는 대화 상자를 생성하는 방법을 설명합니다. 뿐만 아니라 기본 HTA와 대화 상자 간에 정보를 주고받는 방법에 대해서도 설명할 것입니다. 상큼한 봄바람 덕분에 저희 팀 모두 의욕이 넘치는 것 같습니다. 언제까지 계속될지는 모르지만 당분간은 마음껏 즐겨 보세요!

이미 알고 계신 분도 있겠지만 대화 상자는 모달 방식과 모덜리스 방식으로 구분됩니다. 모달 방식 대화 상자의 경우 대화 상자를 열었던 기본 창으로 돌아가려면 해당 대화 상자를 닫아야 하지만, 모덜리스 방식의 대화 상자의 경우에는 여러 창 간에 자유롭게 이동할 수가 있습니다. 그러나 기본 창을 닫으면 모덜리스 대화 상자도 닫힙니다.

모달 대화 상자를 생성하는 방법은 모덜리스 대화 상자를 생성하는 방법과 똑같습니다. 유일한 차이점은 모달 대화 상자를 생성할 때는 ShowModalDialog 함수를 호출하지만 모덜리스 대화 상자를 생성할 때는 ShowModelessDialog 함수를 호출한다는 점입니다. 그러나 두 함수 모두 동일한 매개 변수를 사용합니다. 우선 모달 방식의 대화 상자를 여는 간단한 HTA부터 살펴보겠습니다(그림 1 참조).

Figure 1 간단한 시작용 대화 상자

<html> 
<head> 
<title>Modal Example</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”MainModal”>
</head>

<script language=”VBScript”> 
Sub ShowDialog 
 intReturn = _
    ShowModalDialog(“modaldialog.hta”) 
 textbox.Value = intReturn
End Sub
</script> 

<body> 
<button onclick=”ShowDialog”>
 Show Dialog Box</button> <p>
<input type=”text” name=”textbox”>
</body> 
</html>

여기서는 Modal Example이라는 제목의 HTA를 만들어 보았습니다. 이 HTA의 <본문> 영역에는 Show Dialog Box라는 단추와 textbox라는 입력란을 추가했습니다. 이 두 요소 모두 그림 2에 나와 있습니다. 이제 단추를 클릭하면 ShowDialog 서브루틴이 실행됩니다.

그림 2 실제 HTA 모달 대화 상자

그림 2** 실제 HTA 모달 대화 상자 **

ShowDialog 서브루틴은 매우 간단합니다. ShowModalDialog 함수를 호출하여 모달 대화 상자로 표시하려는 HTA 파일의 이름(여기서는 modaldialog.hta)을 매개 변수로 전달하는 것입니다.(여기서 modaldialog.hta는 이 HTA와 같은 폴더에 있는 것으로 간주됩니다. 같은 폴더에 있지 않으면 전체 파일 경로를 여기에 포함해야 합니다.)

이제 ShowModalDialog의 반환 값(intReturn)을 캡처하여 입력란에 표시합니다. 이 반환 값을 가져오는 방법은 잠시 후에 설명하겠습니다. 한 가지 명심할 사항은 ShowModalDialog에 대한 호출이 반환되도록 하려면 모달 대화 상자를 닫아야 한다는 사실입니다. 즉, 대화 상자를 닫아야 반환 값이 입력란에 할당됩니다.

이번에는 호출하는 HTA가 여는 대화 상자인 modaldialog.hta를 살펴보겠습니다(그림 3 참조). 이 HTA에서는 listbox라는 목록 상자와 OK라는 레이블이 있는 단추를 만들었습니다(그림 4 참조). 그리고 이 목록 상자에 Option 1, Option 2 같은 이름의 항목을 네 개 추가하고 각 항목에 1에서 4까지 값을 지정했습니다. OK 단추를 클릭하면 CloseWindow 서브루틴이 실행됩니다.

Figure 3 modaldialog.hta

<html> 
<head> 
<title>Modal Dialog Box</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”ModalDialog”>
</head>

<script language=”VBScript”> 
Sub CloseWindow
  window.returnValue = listbox.Value
  window.Close 
End Sub
</script> 

<body> 
<select size=”3” name=”listbox”>
 <option value=”1”>Option 1</option>
 <option value=”2”>Option 2</option>
 <option value=”3”>Option 3</option>
 <option value=”4”>Option 4</option>
</select>
<p>
<input type=”button” id=”idBtn” value=”OK” onclick=”CloseWindow”> 
</body> 
</html>

그림 4 모달 방식 대화 상자를 나타내는 HTA

그림 4** 모달 방식 대화 상자를 나타내는 HTA **

CloseWindow 서브루틴도 매우 간단합니다. 우선 목록 상자에서 선택된 항목의 값을 읽어 window.returnValue 속성에 이 값을 지정합니다. 예를 들어 사용자가 Option 2를 선택한 경우 값 2가 window.returnValue에 지정되는 것입니다. 그런 다음 window.Close 메서드를 호출하여 대화 상자를 닫으면 됩니다.

바로 이때 컨트롤이 기본 HTA로 반환됩니다. ShowModalDialog에 대한 호출을 기억하시죠?

intReturn = _
  ShowModalDialog(“modaldialog.hta”) 

intReturn에 지정된 반환 값은 대화 상자 HTA의 window.returnValue에 지정한 값입니다. 따라서 대화 상자에서 Option 2를 선택하면 값 2가 window.returnValue에 지정되고 intReturn은 2가 됩니다. 그리고 다음과 같은 코드 줄이 해당 값을 입력란에 표시합니다.

textbox.Value = intReturn

지금까지 대화 상자에서 값을 가져오는 방법을 살펴보았으니 이제 대화 상자로 값을 가져오는 방법을 설명하겠습니다. 이번에는 모덜리스 대화 상자(그림 5 참조)를 사용할 것입니다. 모달 방식과 모덜리스 방식 모두 작동 방식이 같기 때문에 모달 대화 상자에서 사용한 것과 동일한 프로세스를 적용할 수 있습니다.

Figure 5 모덜리스 방식

<html>
<head>
<title>Modeless Example</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”ModelessMain”>
</head>

<script language=”VBScript”>
Sub ShowDialog
  intReturn = _
    window.ShowModelessDialog _
    (“modelessdialog.hta”, _
    lstServers.Value, _
    “dialogHeight:400px;dialogWidth:300px”)
End Sub
</script>

<body>
<select size=”1” name=”lstServers”>
 <option value=”server1”>Server1</option>
 <option value=”server2”>Server2</option>
 <option value=”server3”>Server3</option>
 <option value=”server4”>Server4</option>
</select>
<p>
<input type=”button” value=”Retrieve Processes” onclick=”ShowDialog”>
</body>
</html>

그림 7 모덜리스 대화 상자에 전달된 데이터

그림 7** 모덜리스 대화 상자에 전달된 데이터 **

이번에는 lstServers라는 이름의 한 항목 드롭다운(크기가 1과 같으므로 한 항목 드롭다운이라고 할 수 있음) 목록 상자를 만들었습니다. 여기에는 Retrieve Processes라는 레이블이 있는 단추도 있습니다. 이 단추를 클릭하면 ShowDialog 서브루틴이 실행됩니다. 이 ShowDialog 서브루틴에는 아래와 같이 window.ShowModelessDialog 함수에 대한 호출 한 줄만 있습니다.

intReturn = _
  window.ShowModelessDialog _
  (“modelessdialog.hta”, _
  lstServers.Value, _
  “dialogHeight:400px;dialogWidth:300px”)

이 함수에 전달하는 첫 번째 매개 변수는 대화 상자에서 실행하려는 HTA의 이름(여기서는 modelessdialog.hta)입니다. 두 번째 매개 변수는 목록 상자의 Value 속성입니다. Value 속성에는 목록 상자에서 선택한 옵션의 값이 포함되어 있습니다. 따라서 사용자가 목록 상자에서 Server2를 선택하면 Value는 server2가 됩니다. 이 매개 변수를 통해 대화 상자에 정보를 전달하게 됩니다. 값을 여러 개 전달하려는 경우 이 매개 변수에서 배열 또는 컬렉션의 형태로 전달할 수 있습니다.

대화 상자가 이 매개 변수의 값을 받는 방식은 잠시 후에 살펴보겠습니다. 지금은 우선 세 번째 매개 변수를 설명하겠습니다.

“dialogHeight:400px;dialogWidth:300px”

이 매개 변수에는 만들려는 대화 상자의 높이와 너비를 지정하는 문자열이 들어 있습니다. 여기서는 높이를 400픽셀(400px), 너비를 300픽셀로 지정했습니다. 모달 방식 예에서도 보았듯이 이 매개 변수는 비워 둘 수 있습니다. 그러면 대화 상자는 해당 컴퓨터에서 사용되는 기본 크기로 표시됩니다.

이제 modelessdialog.hta(그림 6 참조)를 살펴보고 이 대화 상자가 전달된 값을 읽는 방식을 확인하겠습니다.

Figure 6 modelessdialog.hta

<html>
<head>
<title>Modeless Dialog</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”Processes”>
</head>

<script language=”VBScript”>
Sub window_onLoad
  strComputer = window.dialogArguments
  Set objWMIService = GetObject(“winmgmts:” _
    & “{impersonationLevel=impersonate}!\\” _
    & strComputer & “\root\cimv2”)
  Set colProcesses = objWMIService.ExecQuery   _
    (“Select * from Win32_Process”)

  strHTML = “<h1>” & strComputer & “</h1><p>”
  For Each objProcess in colProcesses
    strHTML = strHTML & objProcess.Name & _
       “<br>”
  Next

  DataArea.InnerHTML = strHTML
End Sub
</script>

<body>
<span id=”DataArea”></span>
</body>
</html>

이 HTA에서 지정한 유일한 요소는 범위이며 범위에는 대화 상자의 전체 영역이 포함됩니다. 또한 스크립트 섹션에서 window_onLoad 서브루틴을 정의했습니다. 이 서브루틴은 HTA가 열리는 즉시(여기서는 ShowModelessDialog에 대한 호출을 통해) 실행됩니다. 이 서브루틴의 첫 번째 줄을 확인해 보십시오.

strComputer = window.dialogArguments

이제 변수 strComputer에 window.dialogArguments 속성의 내용을 지정합니다. 이 속성의 내용이 무엇으로 생각되시나요? 자, 잠에서 깨십시오. 맞습니다. 속성의 내용은 ShowModelessDialog에 대한 호출의 두 번째 매개 변수를 통해 전달된 값입니다. 기본 창에서 Server2를 선택한 경우 strComputer는 이제 server2 값을 포함합니다.

서브루틴의 나머지는 단순히 strComputer에서 모든 프로세스를 검색하여 범위 영역에 표시합니다. 그림 7에서 이 작업의 결과를 확인할 수 있습니다.

이제 여러분은 다가오는 여름 내내 HTA 대화 상자와 함께 즐거운 시간을 보낼 수 있습니다. 물론 곧 겨울을 맞게 될 남반구 지역의 독자들은 제외하고 말이죠. 지난 겨울 저희 팀은 잦은 정전으로 인해 고생이 많았답니다.

Microsoft Scripting Guys는 Microsoft에서 일하고 있는 Microsoft의 직원들입니다. 이들은 좋아하는 야구 경기와 기타 여러 활동을 하는 시간을 제외하고는 항상 TechNet 스크립트 센터를 운영합니다. 자세한 내용은 https://www.microsoft.com/korea/technet/scriptcenter/default.mspx에서 확인하십시오.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..