#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>
; HTML5 지원을 위한 IE11 Edge 모드 활성화
_EnableHTML5Support()
; GUI 생성
Local $hGUI = GUICreate("AutoIt HTML5 뷰어", 1200, 800, -1, -1, $WS_OVERLAPPEDWINDOW)
; 상단 컨트롤 패널
Local $idAddressLabel = GUICtrlCreateLabel("주소:", 10, 15, 40, 20)
Local $idAddressEdit = GUICtrlCreateEdit("about:blank", 55, 12, 800, 25, $ES_AUTOHSCROLL)
Local $idGoButton = GUICtrlCreateButton("이동", 865, 11, 60, 27)
Local $idLoadFileButton = GUICtrlCreateButton("HTML 파일 열기", 935, 11, 100, 27)
Local $idRefreshButton = GUICtrlCreateButton("새로고침", 1045, 11, 70, 27)
Local $idBackButton = GUICtrlCreateButton("뒤로", 1125, 11, 50, 27)
; HTML 편집기 (옵션)
Local $idShowEditorButton = GUICtrlCreateButton("HTML 편집기", 10, 45, 100, 25)
Local $idHtmlEdit = GUICtrlCreateEdit("", 10, 75, 580, 200, $ES_MULTILINE + $ES_WANTRETURN + $WS_VSCROLL)
Local $idLoadHtmlButton = GUICtrlCreateButton("HTML 로드", 120, 45, 80, 25)
Local $idClearButton = GUICtrlCreateButton("지우기", 210, 45, 60, 25)
GUICtrlSetState($idHtmlEdit, $GUI_HIDE)
; 상태바
Local $idStatusLabel = GUICtrlCreateLabel("준비", 10, 780, 1180, 15, $SS_SUNKEN)
; WebBrowser 컨트롤
Local $oIE = ObjCreate("Shell.Explorer.2")
If @error Then
MsgBox($MB_ICONERROR, "오류", "WebBrowser 컨트롤을 생성할 수 없습니다.")
Exit
EndIf
; WebBrowser를 GUI에 임베드
Local $idWebBrowser = GUICtrlCreateObj($oIE, 10, 285, 1180, 490)
; GUI 표시
GUISetState(@SW_SHOW)
; 기본 HTML5 테스트 페이지 로드
_LoadDefaultHTML($oIE)
; 변수 초기화
Local $bEditorVisible = False
; 메인 이벤트 루프
While 1
Local $nMsg = GUIGetMsg()
Select
Case $nMsg = $GUI_EVENT_CLOSE
ExitLoop
Case $nMsg = $idGoButton
Local $sUrl = GUICtrlRead($idAddressEdit)
If $sUrl <> "" Then
_NavigateToURL($oIE, $sUrl)
_UpdateStatus("로딩 중: " & $sUrl)
EndIf
Case $nMsg = $idLoadFileButton
Local $sFile = FileOpenDialog("HTML 파일 선택", @ScriptDir, "HTML Files (*.html;*.htm)|모든 파일 (*.*)", $FD_FILEMUSTEXIST)
If Not @error And $sFile <> "" Then
_NavigateToFile($oIE, $sFile)
GUICtrlSetData($idAddressEdit, $sFile)
_UpdateStatus("파일 로드: " & $sFile)
EndIf
Case $nMsg = $idRefreshButton
$oIE.Refresh()
_UpdateStatus("페이지 새로고침")
Case $nMsg = $idBackButton
$oIE.GoBack()
_UpdateStatus("이전 페이지로")
Case $nMsg = $idShowEditorButton
$bEditorVisible = Not $bEditorVisible
If $bEditorVisible Then
GUICtrlSetState($idHtmlEdit, $GUI_SHOW)
GUICtrlSetData($idShowEditorButton, "편집기 숨기기")
; WebBrowser 크기 조정
GUICtrlSetPos($idWebBrowser, 10, 285, 580, 490)
Else
GUICtrlSetState($idHtmlEdit, $GUI_HIDE)
GUICtrlSetData($idShowEditorButton, "HTML 편집기")
; WebBrowser 원래 크기로
GUICtrlSetPos($idWebBrowser, 10, 285, 1180, 490)
EndIf
Case $nMsg = $idLoadHtmlButton
Local $sHtmlContent = GUICtrlRead($idHtmlEdit)
If $sHtmlContent <> "" Then
_LoadHTMLContent($oIE, $sHtmlContent)
_UpdateStatus("사용자 HTML 로드됨")
EndIf
Case $nMsg = $idClearButton
GUICtrlSetData($idHtmlEdit, "")
EndSelect
WEnd
GUIDelete()
; ================= 함수 정의 =================
; HTML5 지원을 위한 레지스트리 설정
Func _EnableHTML5Support()
Local $sAppName = StringRegExpReplace(@ScriptName, "\.au3$", ".exe")
Local $sRegPath = "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION"
; IE11 Edge 모드 (11001) 설정 - HTML5 완전 지원
RegWrite($sRegPath, $sAppName, "REG_DWORD", 11001)
; 추가 기능 활성화
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_AJAX_CONNECTIONEVENTS", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_MANAGE_SCRIPT_CIRCULAR_REFS", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_DOMSTORAGE", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_GPU_RENDERING", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI", $sAppName, "REG_DWORD", 0)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_DISABLE_LEGACY_COMPRESSION", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_LOCALMACHINE_LOCKDOWN", $sAppName, "REG_DWORD", 0)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BLOCK_LMZ_OBJECT", $sAppName, "REG_DWORD", 0)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BLOCK_LMZ_SCRIPT", $sAppName, "REG_DWORD", 0)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_DISABLE_NAVIGATION_SOUNDS", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_SCRIPTURL_MITIGATION", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_SPELLCHECKING", $sAppName, "REG_DWORD", 0)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_STATUS_BAR_THROTTLING", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_TABBED_BROWSING", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_VALIDATE_NAVIGATE_URL", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_WEBOC_DOCUMENT_ZOOM", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_WEBOC_POPUPMANAGEMENT", $sAppName, "REG_DWORD", 0)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_WEBOC_MOVESIZECHILD", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_ADDON_MANAGEMENT", $sAppName, "REG_DWORD", 0)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_WEBSOCKET", $sAppName, "REG_DWORD", 1)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_WINDOW_RESTRICTIONS", $sAppName, "REG_DWORD", 0)
RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_XMLHTTP", $sAppName, "REG_DWORD", 1)
EndFunc
; URL로 이동
Func _NavigateToURL($oObject, $sURL)
$oObject.Navigate($sURL)
EndFunc
; 파일로 이동
Func _NavigateToFile($oObject, $sFilePath)
$oObject.Navigate("file:///" & StringReplace($sFilePath, "\", "/"))
EndFunc
; HTML 내용을 직접 로드
Func _LoadHTMLContent($oObject, $sHTML)
$oObject.Navigate("about:blank")
; 문서가 로드될 때까지 대기
While $oObject.ReadyState <> 4
Sleep(10)
WEnd
$oObject.Document.Write($sHTML)
$oObject.Document.Close()
EndFunc
; 기본 HTML5 테스트 페이지 로드
Func _LoadDefaultHTML($oObject)
Local $sDefaultHTML = '<!DOCTYPE html>' & @CRLF & _
'<html lang="ko">' & @CRLF & _
'<head>' & @CRLF & _
' <meta charset="UTF-8">' & @CRLF & _
' <meta name="viewport" content="width=device-width, initial-scale=1.0">' & @CRLF & _
' <meta http-equiv="X-UA-Compatible" content="IE=edge">' & @CRLF & _
' <title>AutoIt HTML5 뷰어</title>' & @CRLF & _
' <style>' & @CRLF & _
' body { font-family: Arial, sans-serif; margin: 20px; background: linear-gradient(45deg, #e3f2fd, #f3e5f5); }' & @CRLF & _
' .header { background: linear-gradient(135deg, #2196f3, #9c27b0); color: white; padding: 20px; border-radius: 10px; margin-bottom: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }' & @CRLF & _
' .card { background: white; padding: 20px; border-radius: 8px; margin: 10px 0; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }' & @CRLF & _
' .test-btn { background: #4CAF50; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin: 5px; }' & @CRLF & _
' .test-btn:hover { background: #45a049; }' & @CRLF & _
' .demo-area { border: 2px dashed #ddd; padding: 20px; margin: 10px 0; border-radius: 8px; }' & @CRLF & _
' canvas { border: 1px solid #ddd; margin: 10px 0; }' & @CRLF & _
' .progress { width: 100%; height: 20px; background: #f0f0f0; border-radius: 10px; overflow: hidden; margin: 10px 0; }' & @CRLF & _
' .progress-bar { height: 100%; background: linear-gradient(90deg, #4CAF50, #2196F3); width: 0%; transition: width 2s ease; }' & @CRLF & _
' .feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin: 20px 0; }' & @CRLF & _
' .feature-card { background: #f8f9fa; padding: 15px; border-left: 4px solid #2196f3; border-radius: 4px; }' & @CRLF & _
' </style>' & @CRLF & _
'</head>' & @CRLF & _
'<body>' & @CRLF & _
' <div class="header">' & @CRLF & _
' <h1>🌐 AutoIt HTML5 뷰어</h1>' & @CRLF & _
' <p>HTML5, CSS3, JavaScript를 완전 지원하는 고급 웹 뷰어입니다.</p>' & @CRLF & _
' </div>' & @CRLF & _
'' & @CRLF & _
' <div class="card">' & @CRLF & _
' <h2>🎯 주요 기능</h2>' & @CRLF & _
' <div class="feature-grid">' & @CRLF & _
' <div class="feature-card">' & @CRLF & _
' <h3>HTML5 지원</h3>' & @CRLF & _
' <p>최신 HTML5 표준을 완전 지원합니다.</p>' & @CRLF & _
' </div>' & @CRLF & _
' <div class="feature-card">' & @CRLF & _
' <h3>CSS3 스타일링</h3>' & @CRLF & _
' <p>고급 CSS3 기능과 애니메이션을 지원합니다.</p>' & @CRLF & _
' </div>' & @CRLF & _
' <div class="feature-card">' & @CRLF & _
' <h3>JavaScript</h3>' & @CRLF & _
' <p>인터랙티브한 웹 콘텐츠를 완전 지원합니다.</p>' & @CRLF & _
' </div>' & @CRLF & _
' <div class="feature-card">' & @CRLF & _
' <h3>Canvas & SVG</h3>' & @CRLF & _
' <p>그래픽 렌더링과 벡터 그래픽을 지원합니다.</p>' & @CRLF & _
' </div>' & @CRLF & _
' </div>' & @CRLF & _
' </div>' & @CRLF & _
'' & @CRLF & _
' <div class="card">' & @CRLF & _
' <h2>🚀 HTML5 기능 테스트</h2>' & @CRLF & _
' <button class="test-btn" onclick="testCanvas()">Canvas 그리기</button>' & @CRLF & _
' <button class="test-btn" onclick="testLocalStorage()">로컬 스토리지</button>' & @CRLF & _
' <button class="test-btn" onclick="testGeolocation()">위치 정보</button>' & @CRLF & _
' <button class="test-btn" onclick="testAnimation()">CSS3 애니메이션</button>' & @CRLF & _
' <button class="test-btn" onclick="testProgress()">Progress Bar</button>' & @CRLF & _
'' & @CRLF & _
' <div id="demo-area" class="demo-area">' & @CRLF & _
' <p>위의 버튼을 클릭하여 HTML5 기능을 테스트해보세요!</p>' & @CRLF & _
' </div>' & @CRLF & _
' </div>' & @CRLF & _
'' & @CRLF & _
' <div class="card">' & @CRLF & _
' <h2>📊 브라우저 정보</h2>' & @CRLF & _
' <div id="browser-info">' & @CRLF & _
' <p><strong>User Agent:</strong> <span id="user-agent"></span></p>' & @CRLF & _
' <p><strong>현재 시간:</strong> <span id="current-time"></span></p>' & @CRLF & _
' <p><strong>화면 해상도:</strong> <span id="screen-info"></span></p>' & @CRLF & _
' </div>' & @CRLF & _
' </div>' & @CRLF & _
'' & @CRLF & _
' <script>' & @CRLF & _
' // 브라우저 정보 표시' & @CRLF & _
' document.getElementById("user-agent").textContent = navigator.userAgent;' & @CRLF & _
' document.getElementById("screen-info").textContent = screen.width + " x " + screen.height;' & @CRLF & _
' ' & @CRLF & _
' function updateTime() {' & @CRLF & _
' document.getElementById("current-time").textContent = new Date().toLocaleString("ko-KR");' & @CRLF & _
' }' & @CRLF & _
' setInterval(updateTime, 1000);' & @CRLF & _
' updateTime();' & @CRLF & _
'' & @CRLF & _
' function testCanvas() {' & @CRLF & _
' const demo = document.getElementById("demo-area");' & @CRLF & _
' demo.innerHTML = `<h3>Canvas 테스트</h3>' & @CRLF & _
' <canvas id="testCanvas" width="300" height="200"></canvas>`;' & @CRLF & _
' ' & @CRLF & _
' const canvas = document.getElementById("testCanvas");' & @CRLF & _
' const ctx = canvas.getContext("2d");' & @CRLF & _
' ' & @CRLF & _
' // 그라디언트 배경' & @CRLF & _
' const gradient = ctx.createLinearGradient(0, 0, 300, 200);' & @CRLF & _
' gradient.addColorStop(0, "#FF6B6B");' & @CRLF & _
' gradient.addColorStop(1, "#4ECDC4");' & @CRLF & _
' ctx.fillStyle = gradient;' & @CRLF & _
' ctx.fillRect(0, 0, 300, 200);' & @CRLF & _
' ' & @CRLF & _
' // 원 그리기' & @CRLF & _
' ctx.fillStyle = "white";' & @CRLF & _
' ctx.beginPath();' & @CRLF & _
' ctx.arc(150, 100, 50, 0, Math.PI * 2);' & @CRLF & _
' ctx.fill();' & @CRLF & _
' ' & @CRLF & _
' // 텍스트' & @CRLF & _
' ctx.fillStyle = "#333";' & @CRLF & _
' ctx.font = "20px Arial";' & @CRLF & _
' ctx.textAlign = "center";' & @CRLF & _
' ctx.fillText("HTML5 Canvas!", 150, 110);' & @CRLF & _
' }' & @CRLF & _
'' & @CRLF & _
' function testLocalStorage() {' & @CRLF & _
' const demo = document.getElementById("demo-area");' & @CRLF & _
' try {' & @CRLF & _
' localStorage.setItem("test", "HTML5 로컬 스토리지 작동!");' & @CRLF & _
' const value = localStorage.getItem("test");' & @CRLF & _
' demo.innerHTML = `<h3>로컬 스토리지 테스트</h3>' & @CRLF & _
' <p>✅ 성공: ${value}</p>' & @CRLF & _
' <p>저장된 데이터가 브라우저를 재시작해도 유지됩니다.</p>`;' & @CRLF & _
' } catch (e) {' & @CRLF & _
' demo.innerHTML = `<h3>로컬 스토리지 테스트</h3>' & @CRLF & _
' <p>❌ 실패: ${e.message}</p>`;' & @CRLF & _
' }' & @CRLF & _
' }' & @CRLF & _
'' & @CRLF & _
' function testGeolocation() {' & @CRLF & _
' const demo = document.getElementById("demo-area");' & @CRLF & _
' if ("geolocation" in navigator) {' & @CRLF & _
' demo.innerHTML = `<h3>위치 정보 테스트</h3>' & @CRLF & _
' <p>✅ 지오로케이션 API가 지원됩니다!</p>' & @CRLF & _
' <p>실제 위치는 보안상 표시하지 않습니다.</p>`;' & @CRLF & _
' } else {' & @CRLF & _
' demo.innerHTML = `<h3>위치 정보 테스트</h3>' & @CRLF & _
' <p>❌ 지오로케이션 API가 지원되지 않습니다.</p>`;' & @CRLF & _
' }' & @CRLF & _
' }' & @CRLF & _
'' & @CRLF & _
' function testAnimation() {' & @CRLF & _
' const demo = document.getElementById("demo-area");' & @CRLF & _
' demo.innerHTML = `<h3>CSS3 애니메이션 테스트</h3>' & @CRLF & _
' <div style="width: 100px; height: 100px; background: linear-gradient(45deg, #FF6B6B, #4ECDC4); ' & @CRLF & _
' border-radius: 50%; margin: 20px auto; ' & @CRLF & _
' animation: spin 2s linear infinite, pulse 1s ease-in-out infinite alternate;">' & @CRLF & _
' </div>' & @CRLF & _
' <style>' & @CRLF & _
' @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }' & @CRLF & _
' @keyframes pulse { from { transform: scale(1); } to { transform: scale(1.1); } }' & @CRLF & _
' </style>' & @CRLF & _
' <p>✅ CSS3 애니메이션이 정상적으로 작동합니다!</p>`;' & @CRLF & _
' }' & @CRLF & _
'' & @CRLF & _
' function testProgress() {' & @CRLF & _
' const demo = document.getElementById("demo-area");' & @CRLF & _
' demo.innerHTML = `<h3>HTML5 Progress 테스트</h3>' & @CRLF & _
' <div class="progress">' & @CRLF & _
' <div class="progress-bar" id="progressBar"></div>' & @CRLF & _
' </div>' & @CRLF & _
' <p id="progressText">0%</p>`;' & @CRLF & _
' ' & @CRLF & _
' let progress = 0;' & @CRLF & _
' const interval = setInterval(() => {' & @CRLF & _
' progress += 10;' & @CRLF & _
' document.getElementById("progressBar").style.width = progress + "%";' & @CRLF & _
' document.getElementById("progressText").textContent = progress + "%";' & @CRLF & _
' if (progress >= 100) {' & @CRLF & _
' clearInterval(interval);' & @CRLF & _
' document.getElementById("progressText").textContent = "✅ 완료!";' & @CRLF & _
' }' & @CRLF & _
' }, 200);' & @CRLF & _
' }' & @CRLF & _
' </script>' & @CRLF & _
'</body>' & @CRLF & _
'</html>'
_LoadHTMLContent($oObject, $sDefaultHTML)
EndFunc
; 상태 업데이트
Func _UpdateStatus($sMessage)
GUICtrlSetData($idStatusLabel, $sMessage)
EndFunc