<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>SoulToMind</title>
    <link>https://soultomind.tistory.com/</link>
    <description>Application Developer</description>
    <language>ko</language>
    <pubDate>Mon, 24 Aug 2026 11:42:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>BitterVitae</managingEditor>
    <item>
      <title>[Windows] - 이벤트 뷰어 시작 프로그램 실행 추적</title>
      <link>https://soultomind.tistory.com/213</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내가 C# 으로 개발한 CS 프로그램을 NSIS 를 통하여 윈도우 시작시에 실행 할 수 있게 아래와 같이 시작프로그램에 등록하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WriteRegStr HKCU &quot;Software\Microsoft\Windows\CurrentVersion\Run&quot; &quot;AppName&quot; '&quot;$INSTDIR\AppName.exe&quot; -bystartup'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객 PC 에서 카카오톡은 실행은 되었지만 내가 개발한 프로그램은 실행이 되지 않는 상태였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 상황일때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트뷰어를 통하여 추적할 수 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 이벤트 뷰어를 통하여 추적하기전에 아래와 같이 설정해야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.실행 gpedit.msc&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJQvT/dJMcaaKJ5D5/ZgIKMAFsezT8jX0vJFllb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJQvT/dJMcaaKJ5D5/ZgIKMAFsezT8jX0vJFllb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJQvT/dJMcaaKJ5D5/ZgIKMAFsezT8jX0vJFllb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJQvT%2FdJMcaaKJ5D5%2FZgIKMAFsezT8jX0vJFllb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;399&quot; height=&quot;206&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.로컬 그룹 정책 편집기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 구성/Windows 설정/보안 설정/고급 감사 정책 구성/시스템 감사정책 - 로컬 그룹 정책 개체/ 세부 추적/ 프로세스 만들기 감사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목을 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bscJle/dJMcagjS0rl/bN48lnRG2kR7DwtCtQvq40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bscJle/dJMcagjS0rl/bN48lnRG2kR7DwtCtQvq40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bscJle/dJMcagjS0rl/bN48lnRG2kR7DwtCtQvq40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbscJle%2FdJMcagjS0rl%2FbN48lnRG2kR7DwtCtQvq40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;987&quot; height=&quot;681&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 항목을 모두 체크한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xOGYO/dJMcaiaWrRU/Kp9VOqEaynjet1UdNoRbcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xOGYO/dJMcaiaWrRU/Kp9VOqEaynjet1UdNoRbcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xOGYO/dJMcaiaWrRU/Kp9VOqEaynjet1UdNoRbcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxOGYO%2FdJMcaiaWrRU%2FKp9VOqEaynjet1UdNoRbcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;552&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 재시작 후에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 뷰어를 실행하여 Windows 로그/보안 항목에서 시작프로그램으로 실행되는 항목을 볼 수 있다.&lt;/p&gt;</description>
      <category>Operating System/Windows</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/213</guid>
      <comments>https://soultomind.tistory.com/213#entry213comment</comments>
      <pubDate>Tue, 6 Jan 2026 18:21:53 +0900</pubDate>
    </item>
    <item>
      <title>[Dev Note] - 한글 유니코드 범위</title>
      <link>https://soultomind.tistory.com/212</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://home.unicode.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://home.unicode.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1752532436782&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Home&quot; data-og-description=&quot; &quot; data-og-host=&quot;home.unicode.org&quot; data-og-source-url=&quot;https://home.unicode.org/&quot; data-og-url=&quot;https://home.unicode.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/djEDXI/hyZjtvoKWe/FPkA2kM6tI5TUDlvOeCX7K/img.jpg?width=95&amp;amp;height=112&amp;amp;face=0_0_95_112&quot;&gt;&lt;a href=&quot;https://home.unicode.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://home.unicode.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/djEDXI/hyZjtvoKWe/FPkA2kM6tI5TUDlvOeCX7K/img.jpg?width=95&amp;amp;height=112&amp;amp;face=0_0_95_112');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Home&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;home.unicode.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 사이트에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간에&lt;/p&gt;
&lt;h4 style=&quot;background-color: #5555ff; color: #ffffff; text-align: start;&quot; data-lineheight=&quot;18px&quot; data-fontsize=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;Technical Work / Code Charts 클릭&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: center;&quot;&gt;Find chart by hex code: AC00 입력 후 Go&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: center;&quot;&gt;새로운 창으로 열리는 링크의 PDF를 열어보면 한글 유니코드의 범위를 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: center;&quot;&gt;가 AC00&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: center;&quot;&gt;힟 D79F &lt;/span&gt;&lt;/p&gt;</description>
      <category>Dev Note</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/212</guid>
      <comments>https://soultomind.tistory.com/212#entry212comment</comments>
      <pubDate>Tue, 15 Jul 2025 07:35:58 +0900</pubDate>
    </item>
    <item>
      <title>[ILDASM] - 사용 방법</title>
      <link>https://soultomind.tistory.com/208</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 회사에서 C# 으로 개발한 프로그램에서 OOM 관련 이슈가 있어&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windbg, JetBrains dotMemory로 덤프파일을 분석 하던중&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 원인 모를 타입에 대해서 누수가 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인 모를 타입은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 만든 클래스명+&amp;lt;&amp;gt;c_DisplayClass3_0 로 시작되는 클래스였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색결과 해당 클래스는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다를 통한 Invoke(() =&amp;gt; Func()); 코드가 컴파일 이후에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.NET Framewormk 내부적으로 정적클래스로 생성되는 타입이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 타입의 코드를 명확하게 알기 위해서는 ILDASM 툴로 확인 할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DLL 을 열어 OOM 누수가 발생하는 클래스를 펼쳐보니 클래스 내부에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;lt;&amp;gt;c__DisplayClass3_0 로 시작하는 정적클래스를 찾을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/Tools, Library</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/208</guid>
      <comments>https://soultomind.tistory.com/208#entry208comment</comments>
      <pubDate>Mon, 30 Jun 2025 11:09:57 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - Process.MainWindowHandle 속성</title>
      <link>https://soultomind.tistory.com/200</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Process.MainWindowHandle&lt;/b&gt; 속성으로 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Application.Run() 메서드에 들어가는 Form 클래스의 Handle 로 오해하기 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 해당 속성은 전혀 그렇지 않고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램상의 포커스되는 최상위 윈도우의 Handle 로 지정이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.diagnostics.process.mainwindowhandle?view=net-6.0&quot;&gt;https://docs.microsoft.com/ko-kr/dotnet/api/system.diagnostics.process.mainwindowhandle?view=net-6.0&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1653467873712&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Process.MainWindowHandle 속성 (System.Diagnostics)&quot; data-og-description=&quot;연결된 프로세스의 주 창에 대한 창 핸들을 가져옵니다.&quot; data-og-host=&quot;docs.microsoft.com&quot; data-og-source-url=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.diagnostics.process.mainwindowhandle?view=net-6.0&quot; data-og-url=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.diagnostics.process.mainwindowhandle&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cubZ9q/hyOxpijYi6/fQBFdGOVwynscEHDTav3vK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.diagnostics.process.mainwindowhandle?view=net-6.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.microsoft.com/ko-kr/dotnet/api/system.diagnostics.process.mainwindowhandle?view=net-6.0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cubZ9q/hyOxpijYi6/fQBFdGOVwynscEHDTav3vK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Process.MainWindowHandle 속성 (System.Diagnostics)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;연결된 프로세스의 주 창에 대한 창 핸들을 가져옵니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KakaoTalk 에서 핸들정보가 아래와 같다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- KakaoTalk = 1705822&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아무개1, 아무개2 (3) = 329818&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KakaoTalk 로 포커스 되어있다면 해당 &lt;span&gt;MainWindowHandle 값은 1705822&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아무개1, 아무개2 (3) 로 포커스 되어 있다면 해당 MainWindowHandle 값은 329818&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/CSharp</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/200</guid>
      <comments>https://soultomind.tistory.com/200#entry200comment</comments>
      <pubDate>Wed, 25 May 2022 15:48:23 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - WinForm Edge WebView2 사용방법 및 팁</title>
      <link>https://soultomind.tistory.com/198</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 Windows 10 업데이트가 되면서 아래와 같이 WebView2 런타임이 설치된 걸 볼 수 있습니다. 필자는 최근에 회사 PC 윈도우를 다시 설치하여 2022-03-20 날짜로 나오지만 해당 날짜보다 이전에 설치된 걸로 파악이 됩니다. &lt;b&gt;Windows 10 Enterprise&lt;/b&gt; 기준입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;767&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFfRth/btrw5QzMdvS/kqO1yFOYtoVo2sS9bY6yM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFfRth/btrw5QzMdvS/kqO1yFOYtoVo2sS9bY6yM0/img.png&quot; data-alt=&quot;[ 그림 1 - 설치된 Microsoft Edge WebView2 런타임 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFfRth/btrw5QzMdvS/kqO1yFOYtoVo2sS9bY6yM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFfRth%2Fbtrw5QzMdvS%2FkqO1yFOYtoVo2sS9bY6yM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1046&quot; height=&quot;767&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;767&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 - 설치된 Microsoft Edge WebView2 런타임 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Microsoft Edge supported Operating Systems&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/deployedge/microsoft-edge-supported-operating-systems&quot;&gt;https://docs.microsoft.com/en-us/deployedge/microsoft-edge-supported-operating-systems&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우를 최신으로 업데이트하여도 Microsoft Edge WebView2 런타임이 설치가 되어 있지 않을 경우 아래의 경로에서 설치 파일을 다운로드하여 설치합니다. 필자의 Windows 환경은 Windows 10 Professional 이여서 자동으로 설치가 되질 않았던거 같습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Download the WebView2 Runtime&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.microsoft.com/en-us/microsoft-edge/webview2/&quot;&gt;https://developer.microsoft.com/en-us/microsoft-edge/webview2/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 WebView2가 설치 되어 있으면 WebView2 모듈(Edge 브라우저 컨트롤)을 사용할 수 있는 환경이 되었다는 것을 뜻합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 해당 WebView2 모듈을 사용하기 위해서는 WebView2 런타임 모듈이 설치되어 있는지 프로그램 상에서 파악이 가능해야 합니다. 해당 설치 유무는 레지스트리 정보를 통하여 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows x64&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HKEY_CURRENT_USER\Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows x86&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}&lt;br /&gt;HKEY_CURRENT_USER\Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HKEY_CURRENT_USER&lt;/b&gt; 쪽에는 설치가 되어도 레지스트리 추가가 되어 있지 않아 이유에 대해서는 찾아보도록 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HKEY_LOCAL_MACHINE&lt;/b&gt; 에 접근하기 위해서는 관리자 권한으로 실행을 해서 확인하면 되겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CMwfK/btrxb9jOTBT/Hb9MYTxMfKa8qjtUSTcjvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CMwfK/btrxb9jOTBT/Hb9MYTxMfKa8qjtUSTcjvk/img.png&quot; data-alt=&quot;[ 그림 2 - WebView2 런타임 레지스트리 위치 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CMwfK/btrxb9jOTBT/Hb9MYTxMfKa8qjtUSTcjvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCMwfK%2Fbtrxb9jOTBT%2FHb9MYTxMfKa8qjtUSTcjvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1644&quot; height=&quot;736&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2 - WebView2 런타임 레지스트리 위치 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구(T)/NuGet 패키지 관리자(N) 들어가서 아래와 같이 찾아보기 탭에서 WebView2를 검색하여 설치할 프로젝트를 선택 후 설치를 진행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1928&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHzynV/btryDQJLMs1/M6GGQv6ZDc1RhXmkYFdvL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHzynV/btryDQJLMs1/M6GGQv6ZDc1RhXmkYFdvL0/img.png&quot; data-alt=&quot;[ 그림 3 - NuGet 패키지 관리자에서 WebView2 설치 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHzynV/btryDQJLMs1/M6GGQv6ZDc1RhXmkYFdvL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHzynV%2FbtryDQJLMs1%2FM6GGQv6ZDc1RhXmkYFdvL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1928&quot; height=&quot;1027&quot; data-origin-width=&quot;1928&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 3 - NuGet 패키지 관리자에서 WebView2 설치 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 참조 항목을 열어보면 사진과 같이 WebView2 관련 라이브러리가 추가된 걸 볼 수 있습니다. WebView2 라이브러리를 사용하기 위해서는 최소 &lt;b&gt;.NET Framework 버전은 4.5입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MainForm.cs&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot; data-ke-language=&quot;cs&quot;&gt;&lt;code&gt;using Microsoft.Web.WebView2.Core;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UseWebView2
{
    public partial class MainForm : Form
    {
        private CoreWebView2Environment _env;
        private bool _initializeCoreWebView2;
        public MainForm(CoreWebView2Environment env)
        {
            InitializeComponent();

            this._env = env;

            // 원래 해당 부분은 관리자실행으로 하여 LocalMahcine, CurrentUser 둘다 체크해야함
            // TODO: CurrentUser 에 레지스트리가 왜 등록이 안되는지 찾아봐야함
            if (WebView2Util.InstalledEdgeWebView2Runtime())
            {
                Toolkit.TraceWriteLine(&quot;Edge WebView2 런타임이 설치되어 있습니다.&quot;);
            }
            else
            {
                Toolkit.TraceWriteLine(&quot;Edge WebView2 런타임이 설치되어 있지 않습니다.&quot;);
            }

            InitializeWebView2Core();
            Text = Text + &quot; &quot; + AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName;
        }

        private async void InitializeWebView2Core()
        {
            _WebView2.CoreWebView2InitializationCompleted += WebView2_CoreWebView2InitializationCompleted;
            await _WebView2.EnsureCoreWebView2Async(_env);

            _LabelWebView2Version.Text = _LabelWebView2Version.Text + &quot; &quot; + _WebView2.ProductVersion.ToString();
        }

        #region MainForm Event
        private void MainForm_Load(object sender, EventArgs e)
        {

        }

        private void MainForm_Shown(object sender, EventArgs e)
        {

        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {

        }
        #endregion

        #region WebView2 Event

        private void WebView2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
        {
            if (e.IsSuccess)
            {
                _WebView2.CoreWebView2.NavigationStarting += CoreWebView2_NavigationStarting;
                _WebView2.CoreWebView2.SourceChanged += CoreWebView2_SourceChanged;
                _WebView2.CoreWebView2.ContentLoading += CoreWebView2_ContentLoading;
                _WebView2.CoreWebView2.HistoryChanged += CoreWebView2_HistoryChanged;
                _WebView2.CoreWebView2.NavigationCompleted += CoreWebView2_NavigationCompleted;

                _WebView2.WebMessageReceived += new EventHandler&amp;lt;CoreWebView2WebMessageReceivedEventArgs&amp;gt;(CoreWebView2_WebMessageReceived);

                // https://chromedevtools.github.io/devtools-protocol/
                _WebView2.CoreWebView2.GetDevToolsProtocolEventReceiver(&quot;Log.entryAdded&quot;).DevToolsProtocolEventReceived += MainForm_DevToolsProtocolEventReceived;
                _WebView2.CoreWebView2.CallDevToolsProtocolMethodAsync(&quot;Log.enable&quot;, &quot;{}&quot;);

                _WebView2.CoreWebView2.GetDevToolsProtocolEventReceiver(&quot;Runtime.consoleAPICalled&quot;).DevToolsProtocolEventReceived += MainForm_DevToolsProtocolEventReceived;
                _WebView2.CoreWebView2.GetDevToolsProtocolEventReceiver(&quot;Runtime.exceptionThrown&quot;).DevToolsProtocolEventReceived += MainForm_DevToolsProtocolEventReceived;
                _WebView2.CoreWebView2.CallDevToolsProtocolMethodAsync(&quot;Runtime.enable&quot;, &quot;{}&quot;);

                _initializeCoreWebView2 = true;
            }
            else
            {
                MessageBox.Show(e.InitializationException.Message, &quot;[ WebView2 에러 발생 ]&quot;);
            }

        }

        private void MainForm_DevToolsProtocolEventReceived(object sender, CoreWebView2DevToolsProtocolEventReceivedEventArgs e)
        {
            if (e != null &amp;amp;&amp;amp; e.ParameterObjectAsJson != null)
            {
                Toolkit.DebugWriteLine(&quot;MainForm_DevToolsProtocolEventReceived=&quot; + e.ParameterObjectAsJson);
            }
        }

        private void CoreWebView2_NavigationStarting(object sender, CoreWebView2NavigationStartingEventArgs e)
        {
            if (Debugger.IsAttached)
            {
                Toolkit.DebugWriteLine(&quot;1. CoreWebView2_NavigationStarting&quot;);
            }
        }

        private void CoreWebView2_SourceChanged(object sender, CoreWebView2SourceChangedEventArgs e)
        {
            if (Debugger.IsAttached)
            {
                Toolkit.DebugWriteLine(&quot;2. CoreWebView2_SourceChanged&quot;);
            }
        }

        private void CoreWebView2_ContentLoading(object sender, CoreWebView2ContentLoadingEventArgs e)
        {
            if (Debugger.IsAttached)
            {
                Toolkit.DebugWriteLine(&quot;3. CoreWebView2_ContentLoading&quot;);
            }
        }

        private void CoreWebView2_HistoryChanged(object sender, object e)
        {
            if (Debugger.IsAttached)
            {
                Toolkit.DebugWriteLine(&quot;4. CoreWebView2_HistoryChanged&quot;);
            }
        }

        private void CoreWebView2_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
        {
            if (Debugger.IsAttached)
            {
                Toolkit.DebugWriteLine(&quot;5. CoreWebView2_NavigationCompleted&quot;);
            }
        }

        private void CoreWebView2_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e)
        {            
            if (Debugger.IsAttached)
            {
                Toolkit.DebugWriteLine(&quot;CoreWebView2_WebMessageReceived e.Source=&quot; + e.Source);
                Toolkit.DebugWriteLine(&quot;CoreWebView2_WebMessageReceived e.WebMessageAsJson=&quot; + e.WebMessageAsJson);
            }
        }

        #endregion

        private void ButtonWebView2Navigate_Click(object sender, EventArgs e)
        {
            if (_initializeCoreWebView2 &amp;amp;&amp;amp; _TextBoxUri.Text.Length &amp;gt; 1)
            {
                _WebView2.CoreWebView2.Navigate(_TextBoxUri.Text);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자에서 호출된 InitializeWebView2Core 메서드에서는 WebView2 브라우저 컨트롤 초기화 작업을 진행하고 있습니다. &lt;b&gt;EnsureCoreWebView2Async&lt;/b&gt; 메서드가 실제 WebView2.CoreWebView2를 초기화하는 작업을 가지며 초기화에 앞서 초기화가 되면 호출되는 &lt;b&gt;CoreWebView2InitializationCompleted&lt;/b&gt; 이벤트핸들러를 등록합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CoreWebView2InitializationCompleted&lt;/b&gt; 이벤트 호출 시에 인자로 전달되는 CoreWebView2InitializationCompletedEventArgs 객체의 &lt;b&gt;IsSuccess&lt;/b&gt; 속성을 통하여 성공적으로 초기화가 되었는지 여부를 알 수 있으며 초기화가 실패하였을 경우 &lt;b&gt;InitializationException&lt;/b&gt; 속성을 통하여 해당 에러에 대한 원인을 알 수가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EnsureCoreWebView2Async&lt;/b&gt; 메서드호출시에 CoreWebView2Environment 객체를 인자로 받아서 초기화를 할 수 있는데 해당 방법에 알아봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Program.cs&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot; data-ke-language=&quot;cs&quot;&gt;&lt;code&gt;using Microsoft.Web.WebView2.Core;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UseWebView2
{
    static class Program
    {
        /// &amp;lt;summary&amp;gt;
        /// 해당 애플리케이션의 주 진입점입니다.
        /// &amp;lt;/summary&amp;gt;
        [STAThread]
        static void Main()
        {
            /*
            Process process = Process.GetCurrentProcess();
            string currentDirectory = Path.GetDirectoryName(process.MainModule.FileName);
            Directory.SetCurrentDirectory(currentDirectory);
            */

            // String userDataFolder = Path.GetTempPath() + @&quot;WebView2UserData&quot;;
            String userDataFolder = null;

            // 실행인자로도 AdditionalBrowserArguments, AllowSingleSignOnUsingOSPrimaryAccount, Language, TargetCompatibleBrowserVersion
            // 설정 가능하게 해야함 이때 Name1=Value1;Name2=Value2 형식으로 Base64 인코딩 처리

            CoreWebView2EnvironmentOptions options = new CoreWebView2EnvironmentOptions();

            // TODO: 필요한 설정 옵션
            // - options.Language=ko,en

            // userDataFolder = EBWebView 캐쉬 디렉토리를 의미합니다.
            // 명시를 하지 않을경우 실행파일 위치 기준으로 
            // 어셈블리이름.exe.WebView2 디렉토리 생성하여 EBWebView 캐쉬 디렉토리 생성
            
            CoreWebView2Environment env = CoreWebView2Environment.CreateAsync(&quot;&quot;, userDataFolder, options).GetAwaiter().GetResult();

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm(env));
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 &lt;b&gt;CoreWebView2EnvironmentOptions&lt;/b&gt; 클래스 인스턴스를 생성후 UserDataFolder&amp;nbsp; 값과 생성한 인스턴스를 통하여 &lt;b&gt;CoreWebView2Environment &lt;/b&gt;클래스 인스턴스를 만들어서&amp;nbsp;WebView2 브라우저 컨트롤을 초기화 합니다. 초기화 할때 사용한 파라미터에 대해 알아봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UserDataFolder&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtzQLz/btryz1F4LNJ/n1tMfryQYfPPdXwLUrJWK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtzQLz/btryz1F4LNJ/n1tMfryQYfPPdXwLUrJWK0/img.png&quot; data-alt=&quot;[ 그림 4 - 기본 UserDataFolder ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtzQLz/btryz1F4LNJ/n1tMfryQYfPPdXwLUrJWK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtzQLz%2Fbtryz1F4LNJ%2Fn1tMfryQYfPPdXwLUrJWK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;233&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 4 - 기본 UserDataFolder ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 디렉토리에 가보면 기본적으로 실행파일명.WebView2 이름으로 디렉토리가 생성되며 안에 EBWebView 디렉토리 안에 실행하는데 필요한 사용자 데이터들을 생성합니다. 생성되는 정보는 아래의 링크를 통하여 확인해 주시기 바랍니다. 해당 위치는 UserDataFolder 위치를 설정함으로써 변경 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 UseWebView2.exe.WebView2 는 &lt;b&gt;VS2019&lt;/b&gt; 기준이며 &lt;b&gt;VS2015&lt;/b&gt; 에서는 디버그 실행시UseWebView2.vshost.exe.WebView2 디렉토리가 별도로 더 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UDF(UserDataFolder)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/user-data-folder?tabs=win32&quot;&gt;https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/user-data-folder?tabs=win32&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String&amp;nbsp;&lt;b&gt;userDataFolder&lt;/b&gt;&amp;nbsp;=&amp;nbsp;Path.GetTempPath()&amp;nbsp;+&amp;nbsp;@&quot;WebView2UserData&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 주석을 풀어서 실행해보면 아래와 같이 해당 위치에 EBWebView 디렉토리가 생성되는걸 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebqCtv/btryAXpUX7R/iTRoMXOFLVGUTLBPrCruR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebqCtv/btryAXpUX7R/iTRoMXOFLVGUTLBPrCruR1/img.png&quot; data-alt=&quot;[ 그림 5 - UserDataFolder 생성되는 위치 변경 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebqCtv/btryAXpUX7R/iTRoMXOFLVGUTLBPrCruR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebqCtv%2FbtryAXpUX7R%2FiTRoMXOFLVGUTLBPrCruR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1450&quot; height=&quot;831&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 5 - UserDataFolder 생성되는 위치 변경 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CoreWebView2EnvironmentOptions&lt;/b&gt; 클래스 프로퍼티&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AdditionalBrowserArguments&lt;/b&gt; :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AllowSingleSignOnUsingOSPrimaryAccount :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Language :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TargetCompatibleBrowserVersion :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발자 도구 프로토콜&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chromedevtools.github.io/devtools-protocol/&quot;&gt;https://chromedevtools.github.io/devtools-protocol/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoreWebView2 브라우저 컨트롤 Uri 연결 시 확인하기 위한 이벤트를 정의하고 이후에 보이는 &lt;b&gt;GetDevToolsProtocolEventReceiver&lt;/b&gt;, &lt;b&gt;CallDevToolsProtocolMethodAsync&lt;/b&gt; 메서드에 대해서 설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Edge WebView2 브라우저 컨트롤 환경설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDF/EBWebView/Default/Preferences 파일에는 현재 Edge WebView2 브라우저 컨트롤의 환경설정 값들이 저장되어 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 개발자도구의 활성화되는 위치를 변경하고 싶을경우 아래와 같이&amp;nbsp; browser/app_window/_placement/EdgeDevToolsApp 안에 left,top,right,bottom 속성값을 변경후 실행 하면 적용되는걸 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p2e76/btrBUGEkOql/bUvxI0opndK8La9dEnrYOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p2e76/btrBUGEkOql/bUvxI0opndK8La9dEnrYOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p2e76/btrBUGEkOql/bUvxI0opndK8La9dEnrYOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp2e76%2FbtrBUGEkOql%2FbUvxI0opndK8La9dEnrYOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;442&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 &lt;b&gt;Edge WebView2&lt;/b&gt; 라이브러리에 대한 연구는 계속하고 있으므로 내용이 계속 추가될 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution&quot;&gt;https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub Source&lt;br /&gt;&lt;a href=&quot;https://github.com/soultomind/Blog/tree/develop/UseWebView2&quot;&gt;https://github.com/soultomind/Blog/tree/develop/UseWebView2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>.NET/CSharp</category>
      <category>Edge WebView2</category>
      <category>Edge 브라우저</category>
      <category>WebView2</category>
      <category>WinForm</category>
      <category>브라우저 컨트롤</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/198</guid>
      <comments>https://soultomind.tistory.com/198#entry198comment</comments>
      <pubDate>Thu, 24 Mar 2022 15:14:27 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - WinForm WebBrowser 사용방법 및 팁</title>
      <link>https://soultomind.tistory.com/195</link>
      <description>&lt;h1&gt;C# WinForm WebBrowser 사용방법 및 팁&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 회사에서 WebBrowser 컨트롤을 활용한 프로그램을 개발중에 있습니다. 개발하면서 겪었던 점을 정리합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.WebBrowser 레지스트리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Internet Feature Control Keys&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ee330720(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/ee330720(v=vs.85).aspx&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 링크는 WebBrowser를 활용하기 위해 필요한 기능(레지스트리 정보)에 대해서 설명하고 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;InternetFeatureControlKeys&lt;/b&gt; 클래스는 해당 레지스트리 정보들을 추가 할 수 있는 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;InternetFeatureControlKeys.cs&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace UseWebBrowser
{

    public class InternetFeatureControlKeys
    {
        public const string FEATURE_BROWSER_EMULATION = &quot;FEATURE_BROWSER_EMULATION&quot;;

        /// &amp;lt;summary&amp;gt;
        /// 현재 프로세스가 64 비트 프로세스인지 여부
        /// &amp;lt;/summary&amp;gt;
        public static bool Is64BitProcess = IntPtr.Size == 8;

        public static bool Is64BitOperatingSystem = NativeMethods.IsOS64Bit();

        /// &amp;lt;summary&amp;gt;
        /// FEATURE_BROWSER_EMULATION 값 자동적으로 설정 여부
        /// &amp;lt;/summary&amp;gt;
        public bool AutoBrowserEmulation
        {
            get { return _autoBrowserEmulation; }
            set { _autoBrowserEmulation = value; }
        }
        private bool _autoBrowserEmulation;

        /// &amp;lt;summary&amp;gt;
        /// FEATURE_BROWSER_EMULATION 값
        /// &amp;lt;/summary&amp;gt;
        public int BrowserEmulation
        {
            get { return _browserEmulation; }
        }
        private int _browserEmulation = 7000;

        /// &amp;lt;summary&amp;gt;
        /// 레지스트리 HKEY 타입
        /// &amp;lt;para&amp;gt;&amp;lt;see cref=&quot;HKEY.LocalMachine&quot;/&amp;gt; 일때 관리자 권한 아닐 경우 예외발생&amp;lt;/para&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;exception cref=&quot;System.ArgumentException&quot;&amp;gt;&amp;lt;/exception&amp;gt;
        public HKEY HKey
        {
            get { return _hKey; }
            set 
            {
                if (value == HKEY.LocalMachine)
                {
                    if (!Toolkit.IsExecuteAdministrator())
                    {
                        throw new System.ArgumentException(&quot;Usage Execute Administrator&quot;);
                    }
                }
                _hKey = value; 
            }
        }
        private HKEY _hKey = HKEY.CurrentUser;

        /// &amp;lt;summary&amp;gt;
        /// Internet Feature Control Keys 
        /// &amp;lt;para&amp;gt;Key,Value&amp;lt;/para&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        public Dictionary&amp;lt;string, uint&amp;gt; Features
        {
            get { return _features; }
            private set { _features = value; }
        }
        private Dictionary&amp;lt;string, uint&amp;gt; _features;

        public InternetFeatureControlKeys()
        {
            Features = new Dictionary&amp;lt;string, uint&amp;gt;();

            SetBrowserEmulation();
        }

        #region BrowserEmulation
        private int GetRegisterBrowserVersion()
        {
            string ieBrowserVersion = RegistryUtility.GetInternetExplorerVersion();
            int indexOf = ieBrowserVersion.IndexOf('.'), result = 0;
            if (indexOf != -1)
            {
                int.TryParse(ieBrowserVersion.Substring(0, indexOf), out result);
            }
            return result;
        }

        private void SetWebBrowserCtrlVersion(int webBrowserMajorVersion, out int outWebBrowserCtrlVersion)
        {
            Toolkit.TraceWriteLine(&quot;WebBrowser Version=&quot; + webBrowserMajorVersion);

            // Set the appropriate Internet Explorer version
            if (webBrowserMajorVersion &amp;gt;= 11)
            {
                outWebBrowserCtrlVersion = (int)BrowserEmulationVersion.Version11Edge;
            }
            else if (webBrowserMajorVersion == 10)
            {
                outWebBrowserCtrlVersion = (int)BrowserEmulationVersion.Version10Standards;
            }
            else if (webBrowserMajorVersion == 9)
            {
                outWebBrowserCtrlVersion = (int)BrowserEmulationVersion.Version9Standards;
            }
            else if (webBrowserMajorVersion == 8)
            {
                outWebBrowserCtrlVersion = (int)BrowserEmulationVersion.Version8Standards;
            }
            else
            {
                outWebBrowserCtrlVersion = (int)BrowserEmulationVersion.Version7;
            }

            Toolkit.TraceWriteLine(&quot;BrowserEmulationVersion=&quot; + outWebBrowserCtrlVersion.ToString());
        }

        private void SetBrowserEmulation()
        {
            Toolkit.TraceWriteLine(&quot;Start&quot;);

            int webBrowserCtrlVersion = 0;
            using (WebBrowser Wb = new WebBrowser())
            {
                SetWebBrowserCtrlVersion(Wb.Version.Major, out webBrowserCtrlVersion);
            }

            int.TryParse(webBrowserCtrlVersion.ToString().Substring(0, 2), out webBrowserCtrlVersion);

            int ieBrowserRegistryVersion = GetRegisterBrowserVersion();
            Toolkit.TraceWriteLine(&quot;WebBrowser Version=&quot; + webBrowserCtrlVersion);
            Toolkit.TraceWriteLine(&quot;InternetExplorer Registry Version=&quot; + ieBrowserRegistryVersion);

            if (webBrowserCtrlVersion == ieBrowserRegistryVersion)
            {
                Toolkit.TraceWriteLine(&quot;Same WebBrowser Version == InternetExplorer Registry Version&quot;);
                SetWebBrowserCtrlVersion(webBrowserCtrlVersion, out _browserEmulation);
            }
            else
            {
                Toolkit.TraceWriteLine(&quot;Same WebBrowser Version != InternetExplorer Registry Version&quot;);
                Toolkit.TraceWriteLine(String.Format(&quot;WebBrowser Version={0}, InternetExplorer Registry Version={1}&quot;, webBrowserCtrlVersion, ieBrowserRegistryVersion));
                SetWebBrowserCtrlVersion(ieBrowserRegistryVersion, out _browserEmulation);
            }

            Toolkit.TraceWriteLine(&quot;End&quot;);
        }

        #endregion

        /// &amp;lt;summary&amp;gt;
        /// 레지스트리에 추가할 Internet Feature Control Key를 등록한다.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;key&quot;&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;value&quot;&amp;gt;&amp;lt;/param&amp;gt;
        public void AddFeature(string key, int value)
        {
            _features.Add(key, (uint)value);
        }

        /// &amp;lt;summary&amp;gt;
        /// appName 이름으로 Feature에 있는 내용을 레지스트리에 추가한다.
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;appName&quot;&amp;gt;&amp;lt;/param&amp;gt;
        public void WriteRegistry(string appName)
        {
            foreach (var item in _features)
            {
                SetRegistryBrowserFeatureControlKey(
                    appName,
                    item.Key,
                    item.Value
                );
            }

            if (_autoBrowserEmulation)
            {
                SetRegistryBrowserFeatureControlKey(appName, FEATURE_BROWSER_EMULATION, (uint)_browserEmulation);
            }
        }

        public void AddDefaultFeature()
        {
            // https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330720(v=vs.85)

            #region (A) 항목

            #endregion

            #region (B..C) 항목

            #endregion

            #region (D..H) 항목

            #endregion

            #region (I..L) 항목

            #endregion

            #region (M..R) 항목


            #endregion

            #region (S..T) 항목

            #endregion

            #region (U..Y) 항목

            #endregion

            #region (Z) 항목

            #endregion

            #region Obsolete Feature Controls

            #endregion


            // (B..C) 항목
            if (!Features.ContainsKey(&quot;FEATURE_BROWSER_EMULATION&quot;))
            {
                AddFeature(&quot;FEATURE_BROWSER_EMULATION&quot;, _browserEmulation);
            }

            // (U..Y) 항목


            // (U..Y) 항목


            foreach (var key in Features.Keys)
            {
                int value = (int)Features[key];
                AddFeature(key, value);
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// 레지스트리를 추가한다.
        /// &amp;lt;para&amp;gt;CurrentUser&amp;lt;/para&amp;gt;
        /// &amp;lt;para&amp;gt;Software\Microsoft\Internet Explorer\Main\FeatureControl\&amp;lt;/para&amp;gt;
        /// &amp;lt;para&amp;gt;LocalMachine&amp;lt;/para&amp;gt;
        /// &amp;lt;para&amp;gt;x64비트 32비트 프로그램 = Software\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\&amp;lt;/para&amp;gt;
        /// &amp;lt;para&amp;gt;그외 = Software\Microsoft\Internet Explorer\Main\FeatureControl\&amp;lt;/para&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;appName&quot;&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;feature&quot;&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;value&quot;&amp;gt;&amp;lt;/param&amp;gt;
        public void SetRegistryBrowserFeatureControlKey(string appName, string feature, uint value)
        {
            if (_hKey == HKEY.LocalMachine)
            {
                string subKey = String.Empty;
                if (!Is64BitProcess &amp;amp;&amp;amp; Is64BitOperatingSystem)
                {
                    subKey = @&quot;Software\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\&quot;;
                }
                else
                {
                    subKey = @&quot;Software\Microsoft\Internet Explorer\Main\FeatureControl\&quot;;
                }

                subKey = String.Concat(subKey, feature);
                using (var key = Registry.LocalMachine.CreateSubKey(subKey, RegistryKeyPermissionCheck.ReadWriteSubTree))
                {
                    key.SetValue(appName, (UInt32)value, RegistryValueKind.DWord);
                }
            }
            else
            {
                string subKey = String.Concat(@&quot;Software\Microsoft\Internet Explorer\Main\FeatureControl\&quot;, feature);
                using (var key = Registry.CurrentUser.CreateSubKey(subKey, RegistryKeyPermissionCheck.ReadWriteSubTree))
                {
                    key.SetValue(appName, (UInt32)value, RegistryValueKind.DWord);
                }
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;InternetFeatureControlKeys&lt;/b&gt; 클래스 생성시 HKEY 기본값이 CurrentUser 인걸 볼 수 있습니다. LocalMachine 인 경우에는 관리자권한 실행이 필요하고 32비트 64비트 일때 등록시키는 위치가 틀립니다. 자세한 내용은 시간이 날때 해당 포스트에 추가적으로 정리 할 예정입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;1073&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rJR28/btrocSEV5ZB/wCW7DY8Etsgyu2DOir74YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rJR28/btrocSEV5ZB/wCW7DY8Etsgyu2DOir74YK/img.png&quot; data-alt=&quot;[ 그림 1 - 레지스트리 편집기 HKEY_CURRENT_USER ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rJR28/btrocSEV5ZB/wCW7DY8Etsgyu2DOir74YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrJR28%2FbtrocSEV5ZB%2FwCW7DY8Etsgyu2DOir74YK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;384&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;1073&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 - 레지스트리 편집기 HKEY_CURRENT_USER ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wow6432 는 64비트 윈도우에서 32비트 프로그램의 레지스트리를 등록합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;32비트 윈도우에서 32비트 프로그램, 64비트 윈도우에서 64비트 프로그램&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;64비트 윈도우에서 32비트 프로그램&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Form Load 이벤트에서 WeBrowser 레지스트리 정보 적용&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;

namespace UseWebBrowser
{
    public partial class Form : System.Windows.Forms.Form
    {
        public Form()
        {
            InitializeComponent();
        }

        private void Form_Load(object sender, EventArgs e)
        {
            InternetFeatureControlKeys featureControlKeys = new InternetFeatureControlKeys();
            Assembly assembly = System.Reflection.Assembly.GetEntryAssembly();
            string path = Path.GetDirectoryName(assembly.Location) + Path.DirectorySeparatorChar + &quot;InternetFeatureControlKeys.xml&quot;;
            if (File.Exists(path))
            {
                try
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(path);
                    XmlNodeList xmlNodeList = doc.SelectNodes(&quot;InternetFeatureControlKeys/InternetFeature&quot;);
                    foreach (XmlNode xmlNode in xmlNodeList)
                    {
                        string name = (string)xmlNode.Attributes[&quot;name&quot;].Value;
                        if (name == InternetFeatureControlKeys.FEATURE_BROWSER_EMULATION &amp;amp;&amp;amp; xmlNode.InnerText == &quot;%Auto%&quot;)
                        {
                            featureControlKeys.AutoBrowserEmulation = true;
                            continue;
                        }

                        uint value = (uint)int.Parse(xmlNode.InnerText);
                        featureControlKeys.Features.Add(name, value);
                    }
                }
                catch (Exception ex)
                {
                    Toolkit.TraceWriteLine(ex.Message);
                    Toolkit.TraceWriteLine(ex.StackTrace);

                    featureControlKeys.AddDefaultFeature();
                }
            }
            else
            {
                featureControlKeys.AddDefaultFeature();
            }

            string appName = String.Empty;
            if (Debugger.IsAttached)
            {
                // Debug [F5 실행]
                Process process = Process.GetCurrentProcess();
                appName = Path.GetFileName(process.MainModule.FileName);
                featureControlKeys.WriteRegistry(appName);
                Toolkit.DebugWriteLine(&quot;Debugger.IsAttached InternetFeatureControlKeys WriteRegistry appName - &quot; + appName);
            }

            if (!appName.Equals(Application.ProductName + &quot;.exe&quot;))
            {
                // Execute
                appName = Application.ProductName + &quot;.exe&quot;;
                featureControlKeys.WriteRegistry(appName);
                Toolkit.TraceWriteLine(&quot;InternetFeatureControlKeys WriteRegistry appName - &quot; + appName);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKnbij/btrINt0tU9o/Cq99o9AiQfFdSRoWz2nLhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKnbij/btrINt0tU9o/Cq99o9AiQfFdSRoWz2nLhK/img.png&quot; data-alt=&quot;[ 그림 2 - 프로젝트 속성/응용 프로그램/어셈블리 정보 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKnbij/btrINt0tU9o/Cq99o9AiQfFdSRoWz2nLhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKnbij%2FbtrINt0tU9o%2FCq99o9AiQfFdSRoWz2nLhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;449&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2 - 프로젝트 속성/응용 프로그램/어셈블리 정보 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 2와 같이 Application.ProductName 값은 어셈블리 정보 창의 제품값에 해당됩니다. 만약에 해당값을 Entry 어셈블리명(실행 파일명 확장자 제외)과 틀릴 경우 문제가 될 수 있는 코드입니다. 그림2 같은 경우에는 어셈블리 명과 같아서 문제가 되질 않지만 문제가 될 만한 코드 이기 때문에 아래와 같이 Entry 어셈블리명.exe 로 추가적으로 레지스트리에 등록을 해줍니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;if (!appName.Equals(Application.ProductName + &quot;.exe&quot;))
{
    // Execute
    appName = Application.ProductName + &quot;.exe&quot;;
    featureControlKeys.WriteRegistry(appName);
    Toolkit.TraceWriteLine(&quot;InternetFeatureControlKeys WriteRegistry appName - &quot; + appName);
}

appName = Assembly.GetEntryAssembly().GetName().Name;
appName = appName + &quot;.exe&quot;;
featureControlKeys.WriteRegistry(appName);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;InternetFeatureControlKeys.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;
&amp;lt;!-- https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330720(v=vs.85) --&amp;gt;
&amp;lt;InternetFeatureControlKeys&amp;gt;
  &amp;lt;!-- (A) 항목--&amp;gt;


  &amp;lt;!-- (B..C) 항목--&amp;gt;

  &amp;lt;!-- %Auto% 시 해당 값은 로컬 PC에 설치되어 있는 IE버전을 내부적으로 실행 시 설정 한다. --&amp;gt;
  &amp;lt;InternetFeature name=&quot;FEATURE_BROWSER_EMULATION&quot;&amp;gt;%Auto%&amp;lt;/InternetFeature&amp;gt;

  &amp;lt;!-- (D..H) 항목--&amp;gt;


  &amp;lt;!-- (I..L) 항목 --&amp;gt;

  &amp;lt;!-- (M..R) 항목 --&amp;gt;


  &amp;lt;!-- (S..T) 항목 --&amp;gt;


  &amp;lt;!-- (U..Y) 항목 --&amp;gt;


  &amp;lt;!-- (Z) 항목 --&amp;gt;

  &amp;lt;!-- Obsolete Feature Controls --&amp;gt;


&amp;lt;/InternetFeatureControlKeys&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Form Load 이벤트에서는 InternetFeatureControlKeys.xml 파일을 읽어들여 해당 파일에 추가되어있는 정보들을 레지스트리에 추가하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Visual Studio 출력&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;[Form :: Form_Load] DEBUG - Debugger.IsAttached InternetFeatureControlKeys WriteRegistry appName - UseWebBrowser.vshost.exe
[Form :: Form_Load] TRACE - InternetFeatureControlKeys WriteRegistry appName - UseWebBrowser.exe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 디버그 실행(F5), Ctrl + F5 실행 에 대한 파일 이름이 다르기 때문에 실행 파일 별로 레지스트리에 WebBrowser 레지스트리 정보를 추가하고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;1073&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8ErKy/btrobIiYOTM/o5VNiCH93FJNkBOmzr6pOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8ErKy/btrobIiYOTM/o5VNiCH93FJNkBOmzr6pOk/img.png&quot; data-alt=&quot;[ 그림 3 - 추가된 레지스트리 정보 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8ErKy/btrobIiYOTM/o5VNiCH93FJNkBOmzr6pOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8ErKy%2FbtrobIiYOTM%2Fo5VNiCH93FJNkBOmzr6pOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;390&quot; data-origin-width=&quot;1706&quot; data-origin-height=&quot;1073&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 3 - 추가된 레지스트리 정보 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 그림 2와 같이 추가된 FEATURE_BROWSER_EMULATION 항목은 아래 내용을 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 버전 (&lt;b&gt;FEATURE_BROWSER_EMULATION&lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 값은 렌더링 되는 웹 페이지(JSP, HTML ..) 내용과 연관되어 있습니다. 자세한 내용은 추후 정리해보고자 합니다. &lt;b&gt;content 값이 IE=edge 일 경우 11001로 설정해야합니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.WebBrowser 에서 렌더링된 페이지와 데이터 통신&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달되는 데이터 형태는 프로그램 개발시에 유동적으로 바뀌기 때문에 하나의 JSON 객체의 문자열로 전달하는게 바람직합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-1. 렌더링된 페이지에서 WebBrowser 데이터 전달&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더링된 페이지에서 WebBrowser 로 데이터 전달은 아래와 같이 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Test1.html&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;

&amp;lt;html lang=&quot;en&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Test1&amp;lt;/title&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
        function callNative() {
            if (&quot;CallNative&quot; in window.external) {
                var data = { eventName: &quot;Btn1 OnClick&quot; };
                window.external.CallNative(JSON.stringify(data));
            }
        }

        function receiveNative(arg) {
            alert(JSON.stringify(arg));
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;input type=&quot;button&quot; id=&quot;Btn1&quot; value=&quot;CallNative&quot; onclick=&quot;callNative()&quot;/&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CallNative 함수는 C# 클라이언트 프로그램에 정의되어야 하는 메서드입니다. 해당 메서드는 WebBrowser.&lt;b&gt;ObjectForScripting&lt;/b&gt; 속성에 설정되는 Object 에 정의되어야 하는 public 메서드이며 클래스 접근지정자 또한 public 이어야만 합니다. 그리고 해당 클래스에는 아래와 같이 어트리뷰트 추가가 필요합니다.&lt;/p&gt;
&lt;pre class=&quot;scheme&quot;&gt;&lt;code&gt;[PermissionSet(SecurityAction.Demand, Name = &quot;FullTrust&quot;)]
[ComVisible(true)]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;되도록이면 해당 속성에 설정되는 클래스 객체는 별도의 클래스 (WebNativeManager)를 생성하여 작업하시기 바랍니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;

namespace UseWebBrowser 
{
    [PermissionSet(SecurityAction.Demand, Name = &quot;FullTrust&quot;)]
    [ComVisible(true)]
    public class WebNativeManager {
        public void CallNative(object arg0) {

        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCvSd4/btroebcMODx/4Xh5zW53qzmjSBmNATeoq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCvSd4/btroebcMODx/4Xh5zW53qzmjSBmNATeoq0/img.png&quot; data-alt=&quot;[ 그림 3 - ObjectForScripting System.ArgumentException ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCvSd4/btroebcMODx/4Xh5zW53qzmjSBmNATeoq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCvSd4%2FbtroebcMODx%2F4Xh5zW53qzmjSBmNATeoq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;174&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 3 - ObjectForScripting System.ArgumentException ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 3과 같이 WebNativeManager 클래스 접근지정자가 public 이 아닐경우 System.ArgumentException 예외를 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNMu8q/btrodRyLAYW/RlfDMgD6HLKutYXOju92sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNMu8q/btrodRyLAYW/RlfDMgD6HLKutYXOju92sK/img.png&quot; data-alt=&quot;[ 그림 4 - 스크립트 오류 발생 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNMu8q/btrodRyLAYW/RlfDMgD6HLKutYXOju92sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNMu8q%2FbtrodRyLAYW%2FRlfDMgD6HLKutYXOju92sK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;228&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 4 - 스크립트 오류 발생 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 4와 같이 CallNative 메서드 접근지정자가 public 이 아닐경우 스크립트 오류 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WebNativeManager.WindowExternal.cs&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UseWebBrowser
{
    [PermissionSet(SecurityAction.Demand, Name = &quot;FullTrust&quot;)]
    [ComVisible(true)]
    public partial class WebNativeManager
    {
        private WebBrowser _WebBrowser;
        public WebNativeManager(WebBrowser webBrowser)
        {
            _WebBrowser = webBrowser;
        }

        public void CallNative(object arg0)
        {
            Toolkit.TraceWriteLine(&quot;Arg0=&quot; + arg0);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Test1.html 페이지에서 WebBrowser 로 전달된 데이터&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;[WebNativeManager :: CallNative] TRACE - Arg0={&quot;eventName&quot;:&quot;Btn1 OnClick&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CallNative 메서드가 try catch 문으로 예외처리가 되어 있지 않습니다. WebBrowser ScriptErrorsSuppressed 값이 False 일경우에는 에러를 확인 할 수 없는 상황이 오므로 반드시 try catch 문으로 감싸서 에러가 발생하였을 경우 로그처리를 해줘야 개발자가 의도치 않은 예외상황에 대처할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-2. WebBrowser 에서 렌더링된 페이지로 데이터 전달&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 반대로 WebBrowser 에서 렌더링된 페이지로 데이터를 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebBrowser.&lt;b&gt;Document&lt;/b&gt; 속성을 이용하여 해당 객체의 InvokeScript 메서드를 호출하여 렌더링된 페이지로 데이터를 전달 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WebNativeManager.InvokeScript.cs&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace UseWebBrowser
{
    partial class WebNativeManager
    {
        public object InvokeScript(string scriptName, object[] args)
        {
            return _WebBrowser.Document.InvokeScript(scriptName, args);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 속성 및 이벤트&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1. PreviewKeyDown 이벤트&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;private void Body_KeyDown(object sender, HtmlElementEventArgs e)
{
    // 86 ASCII CODE = 'V'
    if (e.KeyPressedCode == 86 &amp;amp;&amp;amp; e.CtrlKeyPressed)
    {
        string text = Clipboard.GetText();
        _WebBrowser.Document.ExecCommand(&quot;Paste&quot;, false, text);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 위와 같이 WebBrowser.Document.Body.KeyDown 이벤트로 Paste(Ctrl + V) 처리하려고 하였으나 e.KeyPressedCode 값이 제대로 넘어오질 않아 &lt;b&gt;PreviewKeyDown&lt;/b&gt; 이벤트로 처리하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 이벤트에서는 아래 코드가 정상적으로 동작을 합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;private void WebBrowser_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.Control &amp;amp;&amp;amp; e.KeyCode == Keys.V)
    {
        string text = Clipboard.GetText();
        _WebBrowser.Document.ExecCommand(&quot;Paste&quot;, false, text);
    }
    else if (e.Control &amp;amp;&amp;amp; e.KeyCode == Keys.A)
    {
         _WebBrowser.Document.ExecCommand(&quot;SelectAll&quot;, false, null);
    }
    else if (e.Control &amp;amp;&amp;amp; e.KeyCode == Keys.C)
    {
         _WebBrowser.Document.ExecCommand(&quot;Copy&quot;, false, null);
    }
    else if (e.Control &amp;amp;&amp;amp; e.KeyCode == Keys.X)
    {
        _WebBrowser.Document.ExecCommand(&quot;Cut&quot;, false, null);
    }

    if (e.KeyCode == Keys.Delete)
    {
        _WebBrowser.Document.ExecCommand(&quot;Delete&quot;, false, null);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 기타&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-1. WebBrowser 에서 HtmlElement로 마우스 이벤트 보내기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Test2.html&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;Test2&amp;lt;/title&amp;gt;
        &amp;lt;script&amp;gt;
            var board = null; 
            function bodyOnLoad() { 
                alert(&quot;bodyOnLoad()&quot;); 
                board = document.getElementById(&quot;board&quot;); 
                board.onmousedown = function(e) { 
                    if (e) { 
                        // 웹 브라우저에서만 테스트 할 경우 호출 됨
                        alert(&quot;board.onmousedown(e)&quot;); 
                    } else { 
                        alert(&quot;e undefined mousedown&quot;); 
                    } 
                }; 
            } 
        &amp;lt;/script&amp;gt; 
        &amp;lt;style&amp;gt; 
            div { 
                background-color:lightblue; 
                width:5000px; 
                height:5000px; 

            } 
        &amp;lt;/style&amp;gt; 
&amp;lt;/head&amp;gt;
 &amp;lt;body onload=&quot;bodyOnLoad()&quot;&amp;gt; 
     &amp;lt;div id=&quot;board&quot;&amp;gt; &amp;lt;/div&amp;gt; 
 &amp;lt;/body&amp;gt; 
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WM_LBUTTONDOWN&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;private void ButtonLButtonDown_Click(object sender, EventArgs e)
{
    if (_TextBoxPosX.Text.Length &amp;gt; 0 &amp;amp;&amp;amp; _TextBoxPosY.Text.Length &amp;gt; 0)
    {
        int posX = int.Parse(_TextBoxPosX.Text);
        int posY = int.Parse(_TextBoxPosX.Text);

        IntPtr handle = NativeMethods.FindWindowEx(_WebBrowser.Handle, IntPtr.Zero, &quot;Shell Embedding&quot;, &quot;&quot;);

        handle = NativeMethods.FindWindowEx(handle, IntPtr.Zero, &quot;Shell DocObject View&quot;, &quot;&quot;);
        handle = NativeMethods.FindWindowEx(handle, IntPtr.Zero, &quot;Internet Explorer_Server&quot;, &quot;&quot;);

        const int WM_LBUTTONDOWN = 0x0201;
        NativeMethods.PostMessage(handle, WM_LBUTTONDOWN, 0, NativeMethods.PointToLParam(posX, posY));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3EFFJ/btroeA4MmNd/eEStgmLAZF2R675cdjNV31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3EFFJ/btroeA4MmNd/eEStgmLAZF2R675cdjNV31/img.png&quot; data-alt=&quot;[ 그림 5 - Spy++ ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3EFFJ/btroeA4MmNd/eEStgmLAZF2R675cdjNV31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3EFFJ%2FbtroeA4MmNd%2FeEStgmLAZF2R675cdjNV31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;765&quot; height=&quot;418&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 5 - Spy++ ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 5를 보시면 ButtonLButtonDown_Click 이벤트 메서드에서 왜 핸들을 위와 같이 찾는지 이해가 되실거라고 생각되어 집니다. CEF(Chromium Embedded Framework) 브라우저 또한 위와 같은 방식으로 핸들을 찾아서 마우스 클릭없이 &lt;b&gt;onmousedown&lt;/b&gt; 이벤트를 보낼 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-2. WebBrowser 컨트롤을 포함한 사용자 컨트롤 ActiveX&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebBrowser 컨트롤을 포함한 사용자 컨트롤을 ActiveX 로 만들어 InternetExplorer 브라우저에 Embedd 하려고 하였으나 ObjectDisposeException 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리하여 MFC ActiveX 컨트롤에 해당 사용자 컨트롤을 래핑하여 올렸다.&lt;br /&gt;(해당 개념에 대해서는 CCW(COM Callable Wrapper) 를 찾아보시기 바랍니다.)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-3. WebBrowser 컨트롤에서 렌더링한 페이지 개발자 도구 열기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 내용은 최근에서야 알게 되었으며 아래 링크를 통하여 확인 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/microsoft-edge/devtools-guide-chromium/ie-mode/&quot;&gt;https://docs.microsoft.com/ko-kr/microsoft-edge/devtools-guide-chromium/ie-mode/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8ihQm/btrFZ1rAk7A/eWaaPE8oEm2yg8aR3omZz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8ihQm/btrFZ1rAk7A/eWaaPE8oEm2yg8aR3omZz0/img.png&quot; data-alt=&quot;[ 그림 6 - 실행 창에서 IEChooser.exe 실행 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8ihQm/btrFZ1rAk7A/eWaaPE8oEm2yg8aR3omZz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8ihQm%2FbtrFZ1rAk7A%2FeWaaPE8oEm2yg8aR3omZz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;399&quot; height=&quot;206&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 6 - 실행 창에서 IEChooser.exe 실행 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 6과 같이 실행 창에서 IEChooser.exe 를 실행하면 그림 7과 같은 화면이 나오게 되는데 브라우저 컨트롤을 활용한 프로그램이 실행중일 경우 디버그할 대상에 목록이 나타나게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsC5iN/btrF1DQ6CyL/ek9lX8RLLe6kkGRsuDzTBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsC5iN/btrF1DQ6CyL/ek9lX8RLLe6kkGRsuDzTBK/img.png&quot; data-alt=&quot;[ 그림-7 IEChooser.exe ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsC5iN/btrF1DQ6CyL/ek9lX8RLLe6kkGRsuDzTBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsC5iN%2FbtrF1DQ6CyL%2Fek9lX8RLLe6kkGRsuDzTBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;779&quot; height=&quot;516&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림-7 IEChooser.exe ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세하게 어떠한 환경에서 IEChooser.exe 가 설치되어 있으며 동작하게 되는지는 추후에 연구해 포스트에 추가하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. mshtml(Microsoft HTML Object Library)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebBrowser 컨트롤의 코어 기능을 사용하기 위해서는 mshtml.dll 을 활용하여 처리 할 수 있습니다. 프로젝트/참조 참조추가 메뉴를 클릭하여 COM 항목에서 Microsoft HTML Object Library 항목을 체크하여 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5.1 Ctrl + MouseWheel 시 확대/축소 방지하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/3971675/c-sharp-capturing-ctrl-mouse-wheel-in-webbrowser-control&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/3971675/c-sharp-capturing-ctrl-mouse-wheel-in-webbrowser-control&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;GitHub Source&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;a href=&quot;https://github.com/soultomind/Blog/tree/develop/UseWebBrowser&quot;&gt;https://github.com/soultomind/Blog/tree/develop/UseWebBrowser&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/CSharp</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/195</guid>
      <comments>https://soultomind.tistory.com/195#entry195comment</comments>
      <pubDate>Fri, 17 Dec 2021 20:15:49 +0900</pubDate>
    </item>
    <item>
      <title>[Dev Note] - XPlatform ActiveX WebBrowser 컨트롤 IE11 설정</title>
      <link>https://soultomind.tistory.com/192</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;TOBESOFT &lt;b&gt;XPlatform&lt;/b&gt; WebBrowser 컨트롤을 통하여 현재 C#으로 개발중인 WebSocket 서버 모듈과 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;통신이 잘 되는지 테스트가 필요하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bts9Is/btq0ZK98ldG/Kk41ZLLTxSbAXBQq68t3xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bts9Is/btq0ZK98ldG/Kk41ZLLTxSbAXBQq68t3xK/img.png&quot; data-alt=&quot;[ XPlatform ActiveX Microsoft Web Browser 설정 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bts9Is/btq0ZK98ldG/Kk41ZLLTxSbAXBQq68t3xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbts9Is%2Fbtq0ZK98ldG%2FKk41ZLLTxSbAXBQq68t3xK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;398&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ XPlatform ActiveX Microsoft Web Browser 설정 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;자세하게는 모르지만 기본적으로 IE7로 동작한다는것을 얼핏 들은거 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;TOBESOFT에 제공하는 모듈을 통하여 설정이 가능하겠지만 해당 모듈을 통하여 테스트가 불가능한경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;직접적으로 레지스트리에 값을 추가하여 테스트를 진행 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;설정 하는 레지 경로는 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;LocalMachine&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;x86&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;&quot;&gt;x64&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;CurrentUser&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span&gt;SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 위치로 가서 새로 만들기/DWORD(32비트값) 후 아래와 같이 설정 후 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0cqhl/btq01roVZNX/RkC36Xw3CKs3NolIWEGjp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0cqhl/btq01roVZNX/RkC36Xw3CKs3NolIWEGjp0/img.png&quot; data-alt=&quot;[ 레지스트리 XPlatform IE11로 설정 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0cqhl/btq01roVZNX/RkC36Xw3CKs3NolIWEGjp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0cqhl%2Fbtq01roVZNX%2FRkC36Xw3CKs3NolIWEGjp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;225&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 레지스트리 XPlatform IE11로 설정 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;해당값을 적용 한후에 다시 테스트를 진행 해보면 IE11로 적용된걸 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;[ 참고 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/archive/blogs/patricka/controlling-webbrowser-control-compatibility&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.microsoft.com/ko-kr/archive/blogs/patricka/controlling-webbrowser-control-compatibility&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Dev Note</category>
      <category>XPLATFORM</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/192</guid>
      <comments>https://soultomind.tistory.com/192#entry192comment</comments>
      <pubDate>Thu, 25 Mar 2021 09:21:02 +0900</pubDate>
    </item>
    <item>
      <title>[MFC] - ActiveX 컨트롤 만들기</title>
      <link>https://soultomind.tistory.com/189</link>
      <description>&lt;h1&gt;MFC ActiveX 컨트롤 만들기&lt;/h1&gt;
&lt;p&gt;해당 내용은 &lt;strong&gt;Visual Studio Professional 2015&lt;/strong&gt;로 설명 드리겠습니다. 프로젝트 이름은 추 후에 C# ActiveX 컨트롤을 MFC ActiveX 컨트롤에 래핑하는 예제를 위해서 아래와 같이 &lt;strong&gt;CSharpActiveXCtrlWrapper&lt;/strong&gt;라고 짓게 되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCG4AG/btqSV85MY2t/B0TX4Sbmq2jg2eKYN3RS1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCG4AG/btqSV85MY2t/B0TX4Sbmq2jg2eKYN3RS1k/img.png&quot; data-alt=&quot;[ 그림 1 - MFC ActiveX 프로젝트 추가 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCG4AG/btqSV85MY2t/B0TX4Sbmq2jg2eKYN3RS1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCG4AG%2FbtqSV85MY2t%2FB0TX4Sbmq2jg2eKYN3RS1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;653&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 - MFC ActiveX 프로젝트 추가 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjUu4Z/btqSPFQ6LOh/tK5uQKR2Id4AtkYvGEFkU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjUu4Z/btqSPFQ6LOh/tK5uQKR2Id4AtkYvGEFkU1/img.png&quot; data-alt=&quot;[ 그림 2 - MFC ActiveX 컨트롤 마법사 시작 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjUu4Z/btqSPFQ6LOh/tK5uQKR2Id4AtkYvGEFkU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjUu4Z%2FbtqSPFQ6LOh%2FtK5uQKR2Id4AtkYvGEFkU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;606&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2 - MFC ActiveX 컨트롤 마법사 시작 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GmIRA/btqSPG3xRxU/PXkunukyAg9ssQWWKvDYlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GmIRA/btqSPG3xRxU/PXkunukyAg9ssQWWKvDYlK/img.png&quot; data-alt=&quot;[ 그림 3 - MFC ActiveX 컨트롤 마법사 응용 프로그램 설정 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GmIRA/btqSPG3xRxU/PXkunukyAg9ssQWWKvDYlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGmIRA%2FbtqSPG3xRxU%2FPXkunukyAg9ssQWWKvDYlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;606&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 3 - MFC ActiveX 컨트롤 마법사 응용 프로그램 설정 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEKuZQ/btqSPEYSFcO/0flkHilK5e6yS3qZEmKil1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEKuZQ/btqSPEYSFcO/0flkHilK5e6yS3qZEmKil1/img.png&quot; data-alt=&quot;[ 그림 4 - MFC ActiveX 컨트롤 마법사 컨트롤 이름 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEKuZQ/btqSPEYSFcO/0flkHilK5e6yS3qZEmKil1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEKuZQ%2FbtqSPEYSFcO%2F0flkHilK5e6yS3qZEmKil1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;606&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 4 - MFC ActiveX 컨트롤 마법사 컨트롤 이름 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;마침&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tWkYU/btqSPGJi2f4/gmU7KeCuxwD8KyG37i4I40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tWkYU/btqSPGJi2f4/gmU7KeCuxwD8KyG37i4I40/img.png&quot; data-alt=&quot;[ 그림 5 - MFC ActiveX 컨트롤 마법사 컨트롤 설정 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tWkYU/btqSPGJi2f4/gmU7KeCuxwD8KyG37i4I40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtWkYU%2FbtqSPGJi2f4%2FgmU7KeCuxwD8KyG37i4I40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;606&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 5 - MFC ActiveX 컨트롤 마법사 컨트롤 설정 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;추가 기능에 대한 설명은 아래의 링크를 통해 확인 하시기 바랍니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/dkzccw76.aspx&quot;&gt;https://msdn.microsoft.com/ko-kr/library/dkzccw76.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;컨트롤 설정 탭에서 컨트롤 기준을 (None)으로 하였기 때문에 Internet Explorer 브라우저에서 보이는 컨트롤이 없으므로&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CFormView&lt;/strong&gt; 방식으로 컨트롤을 올려보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccxJ0l/btqSX7L31sv/kU3Ub9ZhZHlVMzPF9POyEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccxJ0l/btqSX7L31sv/kU3Ub9ZhZHlVMzPF9POyEK/img.png&quot; data-alt=&quot;[ 그림 6 - 리소스 추가 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccxJ0l/btqSX7L31sv/kU3Ub9ZhZHlVMzPF9POyEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccxJ0l%2FbtqSX7L31sv%2FkU3Ub9ZhZHlVMzPF9POyEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;374&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 6 - 리소스 추가 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNk3Ji/btqSSdmnil8/G1kYKQ35LDEOCkbaOAkGkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNk3Ji/btqSSdmnil8/G1kYKQ35LDEOCkbaOAkGkk/img.png&quot; data-alt=&quot;[ 그림 7 - 리소스 추가/Dialog/IDD_FORMVIEW ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNk3Ji/btqSSdmnil8/G1kYKQ35LDEOCkbaOAkGkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNk3Ji%2FbtqSSdmnil8%2FG1kYKQ35LDEOCkbaOAkGkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;363&quot; height=&quot;319&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 7 - 리소스 추가/Dialog/IDD_FORMVIEW ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;리소스뷰 창에서 그림6과 같이 리소스 추가(A).... 메뉴를 클릭 후 그림 7과 같이 Dialog/&lt;strong&gt;IDD_FORMVIEW&lt;/strong&gt; 선택 후 새로만들기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl3U88/btqSLGQB6iM/5C6s22QK8tdXU6zdqltGdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl3U88/btqSLGQB6iM/5C6s22QK8tdXU6zdqltGdK/img.png&quot; data-alt=&quot;[ 그림 8 - CFormView 클래스 추가 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl3U88/btqSLGQB6iM/5C6s22QK8tdXU6zdqltGdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl3U88%2FbtqSLGQB6iM%2F5C6s22QK8tdXU6zdqltGdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;516&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 8 - CFormView 클래스 추가 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그림 8과 같이 추가된 폼 뷰 안에서 마우스 오른쪽 버튼을 눌러 클래스 추가(C) 메뉴를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3y8is/btqSX7efUnC/Vdow4qCriiB5q9fTD3N6K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3y8is/btqSX7efUnC/Vdow4qCriiB5q9fTD3N6K0/img.png&quot; data-alt=&quot;[ 그림 9 - MFC 클래스 추가 마법사 시작 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3y8is/btqSX7efUnC/Vdow4qCriiB5q9fTD3N6K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3y8is%2FbtqSX7efUnC%2FVdow4qCriiB5q9fTD3N6K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;606&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 9 - MFC 클래스 추가 마법사 시작 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQPuy/btqSQ5IJ2DM/w5IfcnkhxY5VaKoTvRARok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQPuy/btqSQ5IJ2DM/w5IfcnkhxY5VaKoTvRARok/img.png&quot; data-alt=&quot;[ 그림 10 - 추가한 클래스 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQPuy/btqSQ5IJ2DM/w5IfcnkhxY5VaKoTvRARok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQPuy%2FbtqSQ5IJ2DM%2Fw5IfcnkhxY5VaKoTvRARok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;544&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 10 - 추가한 클래스 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그림 9와 같이 기본 클래스를 CFormView로 선택 후 클래스 이름을 CMyFormView 지정후 마침 후에 그림 10과 같이 추가한 클래스 생성자/소멸자를 &lt;strong&gt;public&lt;/strong&gt; 영역으로 이동시킵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XMiYp/btqSX7yybbF/NvJbEi3nfp0nwqcGmcXYnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XMiYp/btqSX7yybbF/NvJbEi3nfp0nwqcGmcXYnk/img.png&quot; data-alt=&quot;[ 그림 11 - 클래스 뷰/CMyFormView 선택 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XMiYp/btqSX7yybbF/NvJbEi3nfp0nwqcGmcXYnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXMiYp%2FbtqSX7yybbF%2FNvJbEi3nfp0nwqcGmcXYnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;356&quot; height=&quot;532&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 11 - 클래스 뷰/CMyFormView 선택 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OkYiL/btqSV9wRkaZ/nYpdn6pIEoTtCy1LirZw3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OkYiL/btqSV9wRkaZ/nYpdn6pIEoTtCy1LirZw3k/img.png&quot; data-alt=&quot;[ 그림 12 CMyFormView Create, PostNcDestory 함수 재정의 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OkYiL/btqSV9wRkaZ/nYpdn6pIEoTtCy1LirZw3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOkYiL%2FbtqSV9wRkaZ%2FnYpdn6pIEoTtCy1LirZw3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;385&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 12 CMyFormView Create, PostNcDestory 함수 재정의 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그림 11과 같이 클래스뷰 선택 후 CMyFormView 클래스를 선택 후 그림 12와 같이 속성/재정의 에서&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Create&lt;/strong&gt;, &lt;strong&gt;PostNcDestroy&lt;/strong&gt; 함수를 재정의 합니다.&lt;/p&gt;
&lt;p&gt;재정의 후 추가한 PostNcDestory 함수에서 CFormView::PostNcDestroy() 호출 부분을 주석합니다.&lt;/p&gt;
&lt;p&gt;다음은 &lt;strong&gt;CSharpActiveXCtrlWrapper.h&lt;/strong&gt; 파일에서 MyFormView.h 파일을 Include 후에&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CCSharpActiveXCtrlWrapperCtrl&lt;/strong&gt; 클래스에서 사용 할 수 있게 CMyFormView 클래스를 멤버 변수로 선언합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhTb6G/btqSV8ENZX0/XjYf20rtyoMif7IFQ0CoKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhTb6G/btqSV8ENZX0/XjYf20rtyoMif7IFQ0CoKK/img.png&quot; data-alt=&quot;[ 그림 13 CCSharpActiveXCtrlWrapperCtrl WM_CREATE 메시지 추가 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhTb6G/btqSV8ENZX0/XjYf20rtyoMif7IFQ0CoKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhTb6G%2FbtqSV8ENZX0%2FXjYf20rtyoMif7IFQ0CoKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;383&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 13 CCSharpActiveXCtrlWrapperCtrl WM_CREATE 메시지 추가 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그림11처럼 이번에는 &lt;strong&gt;CCSharpActiveXCtrlWrapperCtrl&lt;/strong&gt; 클래스 선택후에 그림 13과 같이 WM_CREATE 메시지를 추가합니다. OnCreate 함수를 재정의 하는 이유는 CSharpActiveXCtrlWrapper 클래스에서 OnCreate시 해당 함수를 호출하기 위해서 입니다.&lt;/p&gt;
&lt;p&gt;OnDraw 함수에서 그리는 코드를 주석 후 OnCreate 함수에서 CMyFormView 를 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CCSharpActiveXCtrlWrapperCtrl.cpp OnDraw 함수&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void CCSharpActiveXCtrlWrapperCtrl::OnDraw(
            CDC* pdc, const CRect&amp;amp; rcBounds, const CRect&amp;amp; /* rcInvalid */)
{
    if (!pdc)
        return;

    // TODO: 다음 코드를 사용자가 직접 작성한 그리기 코드로 바꾸십시오.
    // pdc-&amp;gt;FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
    // pdc-&amp;gt;Ellipse(rcBounds);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;CCSharpActiveXCtrlWrapperCtrl.cpp OnCreate 함수&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int CCSharpActiveXCtrlWrapperCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (COleControl::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  여기에 특수화된 작성 코드를 추가합니다.

    RECT rect;
    ::GetClientRect(m_hWnd, &amp;amp;rect);

    if (m_MyFormView.Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rect, this, IDD_FORMVIEW))
    {
        OutputDebugString(L&amp;quot;MyFormView Create&amp;quot;);
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이로써 간단하게 ActiveX 컨트롤 완성 시켰습니다. 테스트를 해보기 위해서는 Internet Explorer 실행을 통해 확인 해야 합니다. ActiveX 컨트롤을 추가한 Test.html 파일을 만들어야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be2GFi/btqSX8jWQ2s/IAKZllV8sLkNvgKoekNnX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be2GFi/btqSX8jWQ2s/IAKZllV8sLkNvgKoekNnX0/img.png&quot; data-alt=&quot;[ 그림 14 CSharpActiveXCtrlWrapper.idl ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be2GFi/btqSX8jWQ2s/IAKZllV8sLkNvgKoekNnX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe2GFi%2FbtqSX8jWQ2s%2FIAKZllV8sLkNvgKoekNnX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;953&quot; height=&quot;402&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 14 CSharpActiveXCtrlWrapper.idl ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test.html&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
&amp;lt;body&amp;gt;
    &amp;lt;object id=&amp;quot;ActiveX&amp;quot; classid=&amp;quot;CLSID:C5C3AAE2-4733-487B-8A11-C8925B15B3AE&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;
&amp;lt;/body&amp;gt;
...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Test.html 파일에 ActiveX를 추가하였습니다. 중간에 보이는 Object 태그가 ActiveX인데 classid=&amp;quot;CLSID:*&amp;quot; 해당 id는 그림 14와 같이 프로젝트명.idl 파일에서 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;마지막으로 프로젝트를 빌드하고 ActiveX를 레지스트리에 등록하여 실행을 해보겠습니다. 프로젝트 빌드가 안 될 경우에는 VIsual Studio를 관리자권한으로 다시 실행하여 빌드 하시길 바랍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/83z8Q/btqSQ4XuHLF/ZbZKjM1XSAm5QIe0ZbYCE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/83z8Q/btqSQ4XuHLF/ZbZKjM1XSAm5QIe0ZbYCE1/img.png&quot; data-alt=&quot;[ 그림 15 프로젝트 Debug 디렉토리 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/83z8Q/btqSQ4XuHLF/ZbZKjM1XSAm5QIe0ZbYCE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F83z8Q%2FbtqSQ4XuHLF%2FZbZKjM1XSAm5QIe0ZbYCE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;408&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 15 프로젝트 Debug 디렉토리 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kz3um/btqSZxcIJU0/IYT0KK7DPWPW4kMF6YVjK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kz3um/btqSZxcIJU0/IYT0KK7DPWPW4kMF6YVjK0/img.png&quot; data-alt=&quot;[ 그림 16 CSharpActiveXCtrlWrapper.ocx 레지스트리에 등록 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kz3um/btqSZxcIJU0/IYT0KK7DPWPW4kMF6YVjK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKz3um%2FbtqSZxcIJU0%2FIYT0KK7DPWPW4kMF6YVjK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;370&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 16 CSharpActiveXCtrlWrapper.ocx 레지스트리에 등록 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그림 15와 같이 프로젝트 Debug 디렉토리로 이동 후에 그림 16과 같이 명령 프롬프트를 관리자 권한으로 실행 시킨 후에 CSharpActiveXCtrlWrapper.ocx 파일을 레지스트리에 등록합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RegSvr32&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- Ocx 파일 레지스트리에 등록 : regsvr32 파일명.ocx&lt;/p&gt;
&lt;p&gt;- Ocx 파일 레지스트리에서 등록 해제 : regsvr32 -u 파일명.ocx&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbGFu6/btqSLGQEoCS/QAkTUDiqyyQEahTblM5NDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbGFu6/btqSLGQEoCS/QAkTUDiqyyQEahTblM5NDK/img.png&quot; data-alt=&quot;[ 그림 17 Internet Explorer 브라우저에 추가된 ActiveX ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbGFu6/btqSLGQEoCS/QAkTUDiqyyQEahTblM5NDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbGFu6%2FbtqSLGQEoCS%2FQAkTUDiqyyQEahTblM5NDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;626&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 17 Internet Explorer 브라우저에 추가된 ActiveX ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Source&lt;/strong&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/soultomind/Blog/tree/develop/CSharpActiveXCtrlWrapper&quot;&gt;https://github.com/soultomind/Blog/tree/develop/CSharpActiveXCtrlWrapper&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>VC++/MFC</category>
      <category>ActiveX</category>
      <category>MFC</category>
      <category>Win32</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/189</guid>
      <comments>https://soultomind.tistory.com/189#entry189comment</comments>
      <pubDate>Tue, 5 Jan 2021 22:56:18 +0900</pubDate>
    </item>
    <item>
      <title>[Dev Note] - Internet Explorer WebSocket 연결 수 설정</title>
      <link>https://soultomind.tistory.com/188</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;WebSocket Sharp&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://github.com/sta/websocket-sharp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/sta/websocket-sharp&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;필자는 위의 웹 소켓 모듈을 통하여 WebSocket 서버 윈도우 프로그램을 개발중에 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;SuperSocket&lt;/b&gt;을 활용하면 좋겠지만 개발환경이 .NET Framework 3.5 라 어쩔수가 없네요 ㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;WebSocket 연결시 SecurityError 발생&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 에러가 발생하는 이유는 여러가지 이유가 있겠지만 필자의 경우는 허용되는 WebSocket 연결 수 가 최대치에 도달하여 해당 에러가 발생하는걸로 추측하였습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 에러는 WebSocket 서버에 연결되어 있는 클라이언트 WebSocket 객체를 close를 안한상태를 가정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;해결1&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Internet Feature Controls Keys / FEATURE_WEBSOCKET_MAXCONNECTIONSPERSERVER 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330720(v=vs.85)?redirectedfrom=MSDN&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330720(v=vs.85)?redirectedfrom=MSDN&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1606895609937&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Internet Feature Control Keys (Internet Explorer)&quot; data-og-description=&quot;&quot; data-og-host=&quot;docs.microsoft.com&quot; data-og-source-url=&quot;https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330720(v=vs.85)?redirectedfrom=MSDN&quot; data-og-url=&quot;https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330720(v=vs.85)&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330720(v=vs.85)?redirectedfrom=MSDN&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330720(v=vs.85)?redirectedfrom=MSDN&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Internet Feature Control Keys (Internet Explorer)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Internet Explorer(iexplore.exe) &lt;/span&gt;&lt;/b&gt;값으로 레지스트리에 값을 추가하여 해결합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설정하는 자세한 방법은&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://soultomind.tistory.com/154?category=668734&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;soultomind.tistory.com/154?category=668734&lt;/a&gt; 참고 해주시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1607061267480&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[WinForm] - WebBrowser 사용하기&quot; data-og-description=&quot;WebBrowser &amp;nbsp;&amp;nbsp;현재 회사에서 WebBrowser 컨트롤을 활용한 프로그램을 개발중이다. 개발하면서 겪었던 점들을 정리해보고자 합니다. - Internet Feature Control Keys https://msdn.microsoft.com/en-us/library/..&quot; data-og-host=&quot;soultomind.tistory.com&quot; data-og-source-url=&quot;https://soultomind.tistory.com/154?category=668734&quot; data-og-url=&quot;https://soultomind.tistory.com/154&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2WFKS/hyIscWXIWA/clJVM6UPagNdeIUikYj6gK/img.png?width=656&amp;amp;height=675&amp;amp;face=0_0_656_675,https://scrap.kakaocdn.net/dn/bG89ep/hyIsax4EgH/zz1G4ts7WBnK9ZQsxoiPH1/img.png?width=656&amp;amp;height=675&amp;amp;face=0_0_656_675,https://scrap.kakaocdn.net/dn/e8kJe/hyIsjhveeS/Wp58mbHYJRMKILD2CHw6Rk/img.png?width=800&amp;amp;height=589&amp;amp;face=0_0_800_589&quot;&gt;&lt;a href=&quot;https://soultomind.tistory.com/154?category=668734&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://soultomind.tistory.com/154?category=668734&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2WFKS/hyIscWXIWA/clJVM6UPagNdeIUikYj6gK/img.png?width=656&amp;amp;height=675&amp;amp;face=0_0_656_675,https://scrap.kakaocdn.net/dn/bG89ep/hyIsax4EgH/zz1G4ts7WBnK9ZQsxoiPH1/img.png?width=656&amp;amp;height=675&amp;amp;face=0_0_656_675,https://scrap.kakaocdn.net/dn/e8kJe/hyIsjhveeS/Wp58mbHYJRMKILD2CHw6Rk/img.png?width=800&amp;amp;height=589&amp;amp;face=0_0_800_589');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[WinForm] - WebBrowser 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WebBrowser &amp;nbsp;&amp;nbsp;현재 회사에서 WebBrowser 컨트롤을 활용한 프로그램을 개발중이다. 개발하면서 겪었던 점들을 정리해보고자 합니다. - Internet Feature Control Keys https://msdn.microsoft.com/en-us/library/..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;soultomind.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;해결2&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMMig1/btqOM84C2gi/2pCjQ0VUK3jAq6n8flX4FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMMig1/btqOM84C2gi/2pCjQ0VUK3jAq6n8flX4FK/img.png&quot; data-alt=&quot;[ 실행 - gpedit.msc ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMMig1/btqOM84C2gi/2pCjQ0VUK3jAq6n8flX4FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMMig1%2FbtqOM84C2gi%2F2pCjQ0VUK3jAq6n8flX4FK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;399&quot; height=&quot;206&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 실행 - gpedit.msc ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1019&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2rUUj/btqOYtFSRVq/QsTEfqfEcRNlUHhH0MP0G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2rUUj/btqOYtFSRVq/QsTEfqfEcRNlUHhH0MP0G1/img.png&quot; data-alt=&quot;[ 컴퓨터 구성 / 관리템플릿 / Windows 구성 요소 / Internet Explorer / 보안 기능 / AJAX / 서버당 최대 WebSocket 연결 수 설정 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2rUUj/btqOYtFSRVq/QsTEfqfEcRNlUHhH0MP0G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2rUUj%2FbtqOYtFSRVq%2FQsTEfqfEcRNlUHhH0MP0G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1019&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1019&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 컴퓨터 구성 / 관리템플릿 / Windows 구성 요소 / Internet Explorer / 보안 기능 / AJAX / 서버당 최대 WebSocket 연결 수 설정 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ETc29/btqOVKVoV4D/SMOkviaCGRuuhpEFwIFzc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ETc29/btqOVKVoV4D/SMOkviaCGRuuhpEFwIFzc1/img.png&quot; data-alt=&quot;[ 서버당 최대 WebSocket 연결 수 설정 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ETc29/btqOVKVoV4D/SMOkviaCGRuuhpEFwIFzc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FETc29%2FbtqOVKVoV4D%2FSMOkviaCGRuuhpEFwIFzc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;636&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 서버당 최대 WebSocket 연결 수 설정 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;서버당 최대 WebSocket 연결 수 설정 사용 할 경우 기존에 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;해결1에서 설정 하였던 &lt;b&gt;레지스트리에 &lt;/b&gt;옵션값은 무시됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Dev Note</category>
      <category>Internet Explorer</category>
      <category>SecurityError</category>
      <category>웹소켓</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/188</guid>
      <comments>https://soultomind.tistory.com/188#entry188comment</comments>
      <pubDate>Wed, 2 Dec 2020 15:28:09 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - Settings.Default.Save() 시 user.config 저장 위치</title>
      <link>https://soultomind.tistory.com/187</link>
      <description>&lt;h1&gt;프로젝트.Properties.Settings.Default.Save() 시 user.config 저장 위치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH3vbX/btqSXjGGJGc/XYbCQncx4wxJvGk2lRQYRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH3vbX/btqSXjGGJGc/XYbCQncx4wxJvGk2lRQYRK/img.png&quot; data-alt=&quot;[ 그림 1 프로젝트 속성/설정 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH3vbX/btqSXjGGJGc/XYbCQncx4wxJvGk2lRQYRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH3vbX%2FbtqSXjGGJGc%2FXYbCQncx4wxJvGk2lRQYRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;325&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 프로젝트 속성/설정 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 속성/설정 에서 정의한 데이터는 저장시에 아래의 코드를 통하여 저장 할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;Settings.Default.Save() &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;저장 후에 다시 실행 시에 어떻게 기존에 저장되었던 데이터를 로드하는지 궁금하였고. 특정 경로에 파일을 쓸거 같다는 생각이 들어 구글링을 통해 해당 경로를 찾았다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;On Windows Vista and later, the locations have changed to&lt;/b&gt;&lt;br /&gt;C:\Users\\AppData\Roaming\ and C:\Users\\AppData\Local\&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows Vista 이상에서는 경로가 위와 같다. 필자의 경우에는 AppData/Local 위치에 해당 응용프로그램 어셈블리 이름(프로젝트 속성/응용프로그램 탭/어셈블리 이름(A))으로 디렉토리가 생기고 안에 어셈블리 이름.exe\_Url\_\* 형태로 디렉토리가 생기고 안에 현재 어셈블리 버전 디렉토리 안에 user.config 파일이 저장 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어셈블리 이름.exe_Url_*&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 어셈블리 버전(1.0.0.0)&lt;/li&gt;
&lt;li&gt;user.config&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 어셈블리 이름이 Test.A, Test.B 라는 두 개의 프로그램에서 설정 데이터를 저장 할 경우에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Test
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Test.A_Url_*&lt;/li&gt;
&lt;li&gt;Test.B_Url_*&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 디렉토리가 생기고 그 안에 위와 같이 파일이 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;br /&gt;&lt;a href=&quot;https://stackoverflow.com/questions/5789252/properties-settings-default-save-where-is-that-file&quot;&gt;stackoverflow.com/questions/5789252/properties-settings-default-save-where-is-that-file&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>.NET/CSharp</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/187</guid>
      <comments>https://soultomind.tistory.com/187#entry187comment</comments>
      <pubDate>Mon, 2 Nov 2020 15:22:23 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - .NET Framework 3.5 TLS 1.2 적용하기</title>
      <link>https://soultomind.tistory.com/186</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;.NET&amp;nbsp;Framework&amp;nbsp;3.5&amp;nbsp;TLS&amp;nbsp;1.2&amp;nbsp;적용하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;Chrome 브라우저에서 기존에 잘 되던 HTTPS API 서버에서 오류가 발생 하였다. HTTPS API 서버는 &lt;b&gt;System.Net.Security.SslStream&lt;/b&gt; 클래스를 활용하여 개발하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;에러는 &lt;b&gt;ERR_SSL_OBSOLETE_VERSION&lt;/b&gt; 이였고 해당 에러는 아래의 링크를 통하여 해결을 하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://blog.chromium.org/2019/10/chrome-ui-for-deprecating-legacy-tls.html&quot;&gt;https://blog.chromium.org/2019/10/chrome-ui-for-deprecating-legacy-tls.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592284132738&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Chrome UI for Deprecating Legacy TLS Versions&quot; data-og-description=&quot;Update (April 6, 2020): The removal of legacy TLS versions was originally scheduled for Chrome 81, but is being delayed until at least Chr...&quot; data-og-host=&quot;blog.chromium.org&quot; data-og-source-url=&quot;https://blog.chromium.org/2019/10/chrome-ui-for-deprecating-legacy-tls.html&quot; data-og-url=&quot;https://blog.chromium.org/2019/10/chrome-ui-for-deprecating-legacy-tls.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WzauJ/hyGrBRthPp/rY8DulhHoV6CVywiogBck0/img.png?width=533&amp;amp;height=537&amp;amp;face=0_0_533_537,https://scrap.kakaocdn.net/dn/cOLovK/hyGrBcRm6O/0y7R9deeUUdKoIh00sWke0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/wGYUp/hyGryf8F7r/whcbeLPKSYDn8gdfBVQdS0/img.png?width=72&amp;amp;height=72&amp;amp;face=0_0_72_72&quot;&gt;&lt;a href=&quot;https://blog.chromium.org/2019/10/chrome-ui-for-deprecating-legacy-tls.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.chromium.org/2019/10/chrome-ui-for-deprecating-legacy-tls.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WzauJ/hyGrBRthPp/rY8DulhHoV6CVywiogBck0/img.png?width=533&amp;amp;height=537&amp;amp;face=0_0_533_537,https://scrap.kakaocdn.net/dn/cOLovK/hyGrBcRm6O/0y7R9deeUUdKoIh00sWke0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/wGYUp/hyGryf8F7r/whcbeLPKSYDn8gdfBVQdS0/img.png?width=72&amp;amp;height=72&amp;amp;face=0_0_72_72');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Chrome UI for Deprecating Legacy TLS Versions&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Update (April 6, 2020): The removal of legacy TLS versions was originally scheduled for Chrome 81, but is being delayed until at least Chr...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.chromium.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;TLS 1.0 TLS 1.1를 사용하지 말고 TLS 1.2 로 업그레이드 해야 한다는 정보를 얻었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;.NET Framework 3.5로 개발 중이기때문에 .NET Framework 3.5 에서 TLS 1.2를 사용할 수 있는 방법을 찾아야 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/43240611/net-framework-3-5-and-tls-1-2&quot;&gt;https://stackoverflow.com/questions/43240611/net-framework-3-5-and-tls-1-2&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592284314391&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;.NET Framework 3.5 and TLS 1.2&quot; data-og-description=&quot;I currently have a web application that uses the .NET 3.5 framework and I am wondering if it will be compatible with TLS 1.2. No where in our code are we dictating TLS version. This is a legacy&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/43240611/net-framework-3-5-and-tls-1-2&quot; data-og-url=&quot;https://stackoverflow.com/questions/43240611/net-framework-3-5-and-tls-1-2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bCtgrL/hyGrvjpwDy/AMEtwXOsDGq122SJHTPwb1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/43240611/net-framework-3-5-and-tls-1-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/43240611/net-framework-3-5-and-tls-1-2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bCtgrL/hyGrvjpwDy/AMEtwXOsDGq122SJHTPwb1/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;.NET Framework 3.5 and TLS 1.2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I currently have a web application that uses the .NET 3.5 framework and I am wondering if it will be compatible with TLS 1.2. No where in our code are we dictating TLS version. This is a legacy&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다행히 위에 링크를 통하여 해결 할 수 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public class SslProtocolsExtensions
{
    public const SslProtocols _Tls11 = (SslProtocols)0x00000300;
    public const SslProtocols _Tls12 = (SslProtocols)0x00000C00;

    public const SecurityProtocolType Tls11 = (SecurityProtocolType)_Tls11;
    public const SecurityProtocolType Tls12 = (SecurityProtocolType)_Tls12;


    public static void SetSecurityProtocol(SecurityProtocolType securityProtocolType)
    {
        ServicePointManager.SecurityProtocol = securityProtocolType;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;기존에 HTTPS API 서버는 &lt;b&gt;SslStream&lt;/b&gt;을 활용하여 사용하고 있었기 때문에 &lt;b&gt;SslStream&lt;/b&gt;에 대한 생성 코드또한 변경 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저 프로그램이 실행 되었을 때 TLS 1.2에 대한 설정을 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;try
{
    Trace.WriteLine(&quot;TLS12 설정을 시작합니다.&quot;);
    SslProtocolsExtensions.SetSecurityProtocol(SslProtocolsExtensions.Tls12);
    Trace.WriteLine(&quot;TLS12 설정을 완료 하였습니다.&quot;);
}
catch (Exception ex)
{
    Trace.WriteLine(ex.Message);
    Trace.WriteLine(ex.StackTrace);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;&amp;nbsp;try catch 문으로 감싸는 이유는 &lt;/span&gt;위에 링크를 통해(.NET Framework 3.5 and TLS 1.2) &lt;span style=&quot;color: #333333;&quot;&gt;확인 할 수 있다. 개발하고 있는 프로그램은 Windows 7 에서도 정상적으로 실행이 되어야 하기 때문이다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;Windows 7 SP1 에서 실행 될 경우 아래와 같은 에러 메시지를 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;요청한 보안 프로토콜을 사용할 수 없습니다.
위치: System.Net.ServicePointManager.set_SecurityProtocol(SecurityProtocolType value)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;이를 해결 하기 위해서는 해당 링크에서 제공하는 패키지를 다운받아 설치 하여야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/topic/support-for-tls-system-default-versions-included-in-the-net-framework-3-5-1-on-windows-7-sp1-and-server-2008-r2-sp1-5ef38dda-8e6c-65dc-c395-62d2df58715a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://support.microsoft.com/en-us/topic/support-for-tls-system-default-versions-included-in-the-net-framework-3-5-1-on-windows-7-sp1-and-server-2008-r2-sp1-5ef38dda-8e6c-65dc-c395-62d2df58715a&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1637884601939&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1&quot; data-og-description=&quot;The .NET framework version 3.5.1 and earlier versions did not provide support for applications to use Transport Layer Security (TLS) System Default Versions as a cryptographic protocol. This update enables the use of TLS v1.2 in the .NET Framework 3.5.1. N&quot; data-og-host=&quot;support.microsoft.com&quot; data-og-source-url=&quot;https://support.microsoft.com/en-us/topic/support-for-tls-system-default-versions-included-in-the-net-framework-3-5-1-on-windows-7-sp1-and-server-2008-r2-sp1-5ef38dda-8e6c-65dc-c395-62d2df58715a&quot; data-og-url=&quot;https://support.microsoft.com/en-us/topic/support-for-tls-system-default-versions-included-in-the-net-framework-3-5-1-on-windows-7-sp1-and-server-2008-r2-sp1-5ef38dda-8e6c-65dc-c395-62d2df58715a&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/topic/support-for-tls-system-default-versions-included-in-the-net-framework-3-5-1-on-windows-7-sp1-and-server-2008-r2-sp1-5ef38dda-8e6c-65dc-c395-62d2df58715a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://support.microsoft.com/en-us/topic/support-for-tls-system-default-versions-included-in-the-net-framework-3-5-1-on-windows-7-sp1-and-server-2008-r2-sp1-5ef38dda-8e6c-65dc-c395-62d2df58715a&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Support for TLS System Default Versions included in the .NET Framework 3.5.1 on Windows 7 SP1 and Server 2008 R2 SP1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The .NET framework version 3.5.1 and earlier versions did not provide support for applications to use Transport Layer Security (TLS) System Default Versions as a cryptographic protocol. This update enables the use of TLS v1.2 in the .NET Framework 3.5.1. N&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;support.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마지막으로 SslStream 에 대한 코드를 수정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;SslStream sslStream = new SslStream(new NetworkStream(socket, true), false, new RemoteCertificateValidationCallback(ServerCertPass));
sslStream.BeginAuthenticateAsServer(_certificate, true, SslProtocolsExtensions._Tls12, false, EndAuthenticate, state);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 링크가 없어졌을경우 테스트를 못하시는분들을 위해 미리 다운로드한 파일입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/mUYJ7/btrgMsl4pZG/9daWb0hH9cUBXKM6CV5kk0/TLS%201.2.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;TLS 1.2.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;2.23MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/CSharp</category>
      <category>TLS12</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/186</guid>
      <comments>https://soultomind.tistory.com/186#entry186comment</comments>
      <pubDate>Mon, 15 Jun 2020 10:14:57 +0900</pubDate>
    </item>
    <item>
      <title>[Dev Note] - Firefox security.enterprise_roots.enabled;true 설정</title>
      <link>https://soultomind.tistory.com/183</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Firefox 브라우저는 신뢰되는 인증기관에서 발급한 인증서만 인증이 되는 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;필자가 OpenSSL을 통하여 만든 루트 인증서는 HTTPS, WSS 통신이 실패 하였습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만든 인증서를 인증이 되게 하기 위해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Firefox 주소창에서 &lt;b&gt;about:config&lt;/b&gt; 설정에 들어가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;security.enterprise_roots.enabled&lt;/b&gt; 값을 &lt;b&gt;true&lt;/b&gt;로 설정 후에는 HTTPS, WSS 통신이 잘 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로그램을 배포시에는 해당 값을 security.enterprise_roots.enabled;true 설정이 필요한데 해당값은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;C:\Users\사용자이름\AppData\Roaming\Mozilla\Firefox\Profiles 디렉토리에서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;?.default 로 시작하는 디렉토리 안에 user.js 안에 해당 값을 추가하면 되겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Dev Note</category>
      <category>Firefox</category>
      <category>인증서</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/183</guid>
      <comments>https://soultomind.tistory.com/183#entry183comment</comments>
      <pubDate>Tue, 19 Nov 2019 16:31:11 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - WinForm 특정 윈도우 Show, TopMost 처리</title>
      <link>https://soultomind.tistory.com/181</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;웹 브라우저에서 웹 소켓을 통하여 특정 프로그램을 실행하는 프로그램을 개발 중에 있다. 해당 프로그램은 프로그램을 실행 후에는 실행된 프로세스와 소켓 통신(TCP/IP)을 통하여 데이터를 주고받고 프로세스에서 데이터를 받으면 웹 소켓을 통하여 데이터를 웹 브라우저 쪽으로 내려주는 구조로 되어있다. 또&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로세스가 하나 이상 실행이 되지 않는 구조로 되어 있다. 그러다 보니 실행되어 있는 상태에서 다시 실행 요청을 하였을 때 해당 프로세스의 메인 윈도우가 축소되어 있거나 다른 윈도우에 가려져 있을 때 처리가 필요하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다행히&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;User32.dll&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;IsIconic&lt;/b&gt;&amp;nbsp;함수를 통하여 프로세스의 메인 핸들을 넘겨 해당 프로세스 메인 핸들의 창이&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최소화 여부를 알 수 있었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로세스의 메인 윈도우가 최소화 되어 있을 경우&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최소화 되어 있을 경우 User32.dll ShowWindow 함수를 통하여 창을 뛰운다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로세스의 메인 윈도우가 다른창에 가려졌을 경우&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 WinForm 에서는 Shown 이벤트에서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TopMost&lt;/b&gt; = true;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처리....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TopMost&lt;/b&gt; = false;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처리를 하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;Shown 이벤트에서 했던 처리를 비슷하게 처리해야만 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; letter-spacing: 0px;&quot;&gt;다른 창에 가려져 있을 경우 Shown 이벤트에서 처리하는 방식과&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비슷하게 TopMost=true;, 처리..., TopMost=false; 처리가 필요하였고&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;User32.&lt;b&gt;SetWindowPos&lt;/b&gt; 함수를 통하여 TopMost 처리를 할수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;csharp&quot;&gt;&lt;code&gt;IntPtr handle = _process.MainWindowHandle;
if (User32.IsIconic(handle))
{
	User32.ShowWindow(handle, User32.SW_SHOWNORMAL);
}
else
{
	Rectangle rect = Rectangle.Empty;
	
	User32.SetWindowPos(handle,
		User32.HWND_TOPMOST,
		rect.X, 
		rect.Y,
		rect.Width, 
		rect.Height,
		User32.SWP_NOMOVE | User32.SWP_NOSIZE | User32.SWP_SHOWWINDOW);

	Thread.Sleep(100);

	User32.SetWindowPos(handle,
		User32.HWND_NOTOPMOST,
		rect.X, 
		rect.Y,
		rect.Width, 
		rect.Height,
		User32.SWP_NOMOVE | User32.SWP_NOSIZE | User32.SWP_SHOWWINDOW);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/CSharp</category>
      <category>Win32</category>
      <category>WinForm</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/181</guid>
      <comments>https://soultomind.tistory.com/181#entry181comment</comments>
      <pubDate>Mon, 7 Oct 2019 18:02:40 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - Working Directory</title>
      <link>https://soultomind.tistory.com/178</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;WorkingDirectory&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;다른 회사 프로그램에서 내가 개발중인 프로그램을 실행 하게하는 작업을 하고 있었다.&amp;nbsp; 이상하게도 정상 적으로 작동이 되질 않았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;기존에 개발을 해 두었던 내가 개발한 프로그램으로 실행 하였을 때에는 정상적으로 실행 되었던 상태로 이상하게 느껴졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;C# 개발을 오래했던 친구에게 물었더니 &lt;b&gt;WorkingDirectory&lt;/b&gt;를 설정 을 해보라고 하더라&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;csharp&quot;&gt;&lt;code&gt;public static void ProcessStart(string fileName)
{
     Process process = new Process();
     process.StartInfo.WorkingDirectory = new FileInfo(fileName).Directory.FullName;
     process.StartInfo.FileName = fileName;
     process.Start();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;임의의 테스트 프로그램을 만들고 위와 같이 샘플 코드를 작성하여 실행을 해보았다. 정상적으로 실행이 되는 거였다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;왜 정상적으로 실행이 되던 것이였을까? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;원인을 찾아보니 A프로세스에서 B프로세스를 실행 시킬때 &lt;b&gt;WorkingDirectory&lt;/b&gt;에 대한 설정이 없을경우 B프로세스의 &lt;b&gt;WorkingDirectory&lt;/b&gt;가 A프로세스가 위치한 프로그램 파일 위치 경로로 잡히는 거였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;문제가 있었기에 연동을 하던 회사 부장님께 WorkingDirectory 설정을 요청드렸다. 부장님께서는 회신 메일로 아래 샘플이 권장하는 방식이라면서 코드를 보내주셨다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;csharp&quot;&gt;&lt;code&gt;Process process = Process.GetCurrentProcess();
Directory.SetCurrentDirectory(Path.GetDirectoryName(process.MainModule.FileName));
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;메인 함수 상단에 위의 코드를 추가 하였다. 정상적으로 잘 작동 하였다. 시간 날때 &lt;b&gt;WorkingDirectory&lt;/b&gt; 에 대해서 더 자세하게 찾아봐야겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/CSharp</category>
      <category>Win32</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/178</guid>
      <comments>https://soultomind.tistory.com/178#entry178comment</comments>
      <pubDate>Tue, 16 Apr 2019 21:43:33 +0900</pubDate>
    </item>
    <item>
      <title>[VMware] - 듀얼 모니터 설정</title>
      <link>https://soultomind.tistory.com/177</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Use Multiple Monitors for One Virtual Machine&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;If the host system has multiple monitors, you can configure a virtual machine to use multiple monitors. You can use the multiple-monitor feature when the virtual machine is in full screen mode.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Note&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t53&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;You do not need to use the Windows display properties settings in a Windows guest operating system to configure multiple monitors.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Prerequisites&lt;/span&gt;&lt;/p&gt;
&lt;table id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__UL_50E8F8ACC3E14F26B4C4F7D90BA23FBF&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span&gt;■&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__LI_A4341FF9D5DC4E9D934B3D367FD66FC5&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t37&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Verify that the virtual machine is a Workstation 6.x or later virtual machine.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span&gt;■&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__LI_EB25CDD707DF4B79B4A9F0F037CCF621&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t40&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Verify that the latest version of VMware Tools is installed in the guest operating system.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span&gt;■&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__LI_A2010C66F7C243518B835EA44385BA3F&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t43&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Verify that the guest operating system is Windows XP, Windows Vista, Windows 7, or Linux.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span&gt;■&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__LI_88094D4756404578A7CF65EFA809CF7A&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t46&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Power off the virtual machine.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Procedure&lt;/span&gt;&lt;/p&gt;
&lt;table id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__STEPS_B481A9CA3ABC496FBAE74C9F11C2D3CF&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__STEP_3CC2FE6C80594357927D99E923132657&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__CMD_1AA24CE64821489D85B537F760728775&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Select&amp;nbsp;Edit&amp;nbsp;&amp;gt;&amp;nbsp;Preferences.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__STEP_0079E1CCE9244BE797C741E6D65F61CF&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__CMD_D33A9E7A13354CB69C4D4B9FC82D472E&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Select&amp;nbsp;Display, select&amp;nbsp;Autofit guest, and click&amp;nbsp;OK.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t87&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;This setting causes the virtual machine display settings to match the application window when the application window is resized.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__STEP_6DFEA7F8012D495782BF7DBEEF725DE4&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__CMD_2B09BA161C9F4421A9846624E4D87748&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;If the virtual machine is set to be restored from a snapshot and background snapshots are enabled, select&amp;nbsp;Edit&amp;nbsp;&amp;gt;&amp;nbsp;Preferences, select&amp;nbsp;Priority, deselect&amp;nbsp;Take&amp;nbsp;and restore snapshots in the background, and click&amp;nbsp;OK.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t111&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Displaying the virtual machine on two monitors might not work correctly if this setting is enabled.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__STEP_D01D060E4B744300A0225BA201868BD5&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__CMD_5EC83E1BAA704EF9A5C2AB2A0B0DF102&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Power on the virtual machine and select&amp;nbsp;View&amp;nbsp;&amp;gt;&amp;nbsp;Full Screen.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__STEP_9B344E2743844C8A8E5837286DC5B5A6&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__CMD_E3C4A94BC74748DB9F6F4BEAC2B8DE1C&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;On the full screen toolbar, click the&amp;nbsp;Cycle multiple monitors&amp;nbsp;button.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t137&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;On a Windows host, you can mouse over a button on the toolbar to see its name.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t140&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;The guest operating system desktop extends to the additional monitor or monitors.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;6&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__STEP_A2A035B4FC7C499781BE55E4D86E2204&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__CMD_21EDF606DD2844F0879B5146423C4C2B&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;If the virtual machine display does not resize correctly, select&amp;nbsp;View&amp;nbsp;&amp;gt;&amp;nbsp;Autosize&amp;nbsp;&amp;gt;&amp;nbsp;Autofit Guest.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;18pt&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;7&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__STEP_598AC05AEB0243AC81CFA11226035A1C&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot; width=&quot;100%&quot;&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__CMD_FB9B7131CB534CA79ACBF7C30F23A660&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;If the host system has more than two monitors and you want the virtual machine to use all of the monitors, click the&amp;nbsp;Cycle multiple monitors&amp;nbsp;button again.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;GUID-E51CADFC-31C3-491F-92D9-C9C1D9615668__d292t170&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;The order in which the virtual machine uses the monitors depends on the order in which the monitors were added to the host operating system. If you continue to click the button, you return to fewer monitors.&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;496&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSDRMh/btqxN6uz45Q/p2QcI1PVPD8sTcb5b5grtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSDRMh/btqxN6uz45Q/p2QcI1PVPD8sTcb5b5grtk/img.png&quot; data-alt=&quot;[ 그림 1 VMware 버전 정보 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSDRMh/btqxN6uz45Q/p2QcI1PVPD8sTcb5b5grtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSDRMh%2FbtqxN6uz45Q%2Fp2QcI1PVPD8sTcb5b5grtk%2Fimg.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;496&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 VMware 버전 정보 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;VMware Documation 문서설명을 토대로 현재 PC에 깔려있는 VMWare Workstation 14 Pro 로 설명 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. VMware Tools 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;듀얼 모니터를 할 VMware OS에 대해서 VMware Tools 를 설치 합니다.&amp;nbsp;듀얼 모니터를 할 VMware OS 부팅 후에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;메뉴 탭에서 VM/Install VMware Tools.... 클릭하여 VMware Tool를 설치 후 해당 VMWare OS 를 종료 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아무런 반응 이 없을 경우에 내컴퓨터 D:\VMware Tools 을 직접적으로 실행하여 설치합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;321&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edFYRI/btqxQo19RaW/GNwcFGzxHiAOaCi8QuWd80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edFYRI/btqxQo19RaW/GNwcFGzxHiAOaCi8QuWd80/img.png&quot; data-alt=&quot;[ 그림 2 VM/Install VMware Tools... 클릭 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edFYRI/btqxQo19RaW/GNwcFGzxHiAOaCi8QuWd80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedFYRI%2FbtqxQo19RaW%2FGNwcFGzxHiAOaCi8QuWd80%2Fimg.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;321&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2 VM/Install VMware Tools... 클릭 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. Edit/Prefrences Display/Autofit/Autofit guest 체크&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;331&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVErd3/btqxOIfYy9D/EVvsXtPKrszMomsecMlN31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVErd3/btqxOIfYy9D/EVvsXtPKrszMomsecMlN31/img.png&quot; data-alt=&quot;[ 그림 3 Edit/Preferences... 클릭 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVErd3/btqxOIfYy9D/EVvsXtPKrszMomsecMlN31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVErd3%2FbtqxOIfYy9D%2FEVvsXtPKrszMomsecMlN31%2Fimg.png&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;331&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 3 Edit/Preferences... 클릭 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;485&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW2ld5/btqxQo19Nji/kUx1FD67hNpte9JWvv5lK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW2ld5/btqxQo19Nji/kUx1FD67hNpte9JWvv5lK0/img.png&quot; data-alt=&quot;[ 그림 4 Autofit/Autofit guest 체크 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW2ld5/btqxQo19Nji/kUx1FD67hNpte9JWvv5lK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW2ld5%2FbtqxQo19Nji%2FkUx1FD67hNpte9JWvv5lK0%2Fimg.png&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;485&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 4 Autofit/Autofit guest 체크 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. Edit/Preferences/Priority/Snapshots Take And Restored 체크 해제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;485&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9X7R2/btqxOJstFtv/tdu0dyKaDKnP8AsiRW8M4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9X7R2/btqxOJstFtv/tdu0dyKaDKnP8AsiRW8M4K/img.png&quot; data-alt=&quot;[ 그림 5 Priority/Snapshots Take And Restore 체크 해제 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9X7R2/btqxOJstFtv/tdu0dyKaDKnP8AsiRW8M4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9X7R2%2FbtqxOJstFtv%2Ftdu0dyKaDKnP8AsiRW8M4K%2Fimg.png&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;485&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 5 Priority/Snapshots Take And Restore 체크 해제 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. 듀얼 모니터 할 VMware OS Enter full screen mode 후에 Cycle multiple monitors&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;86&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSFv5d/btqxNU83tss/wtfKsDivF2IC5X5imQ8XVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSFv5d/btqxNU83tss/wtfKsDivF2IC5X5imQ8XVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSFv5d/btqxNU83tss/wtfKsDivF2IC5X5imQ8XVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSFv5d%2FbtqxNU83tss%2FwtfKsDivF2IC5X5imQ8XVk%2Fimg.png&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;86&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[ 참고 ] - VMware Documation&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://pubs.vmware.com/workstation-9/index.jsp?topic=%2Fcom.vmware.ws.using.doc%2FGUID-E51CADFC-31C3-491F-92D9-C9C1D9615668.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pubs.vmware.com/workstation-9/index.jsp?topic=%2Fcom.vmware.ws.using.doc%2FGUID-E51CADFC-31C3-491F-92D9-C9C1D9615668.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>VMware</category>
      <category>VMware</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/177</guid>
      <comments>https://soultomind.tistory.com/177#entry177comment</comments>
      <pubDate>Mon, 8 Apr 2019 17:09:29 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - WinForm PropertyGrid 에 표시되는 Enum 값 이름 변경하기</title>
      <link>https://soultomind.tistory.com/175</link>
      <description>&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&lt;b&gt;&amp;nbsp;PropertyGrid &lt;/b&gt;를 활용하여 프로퍼티 설정하는 다이얼로그 창을 개발하던 중 Enum 에 해당 하는 값을 UI에 그대로 표현 하기에는 적당하지 않아 변경하는 방법을 찾아 보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;기본적으로 PropertyGrid 에 속성을 표현하기 위해서는 SelectedObject Property를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;자세한 활용법은 MSDN을 참고하시기 바란다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;MSDN PropertyGrid&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;a class=&quot;tx-link&quot; href=&quot;https://msdn.microsoft.com/ko-kr/library/aa302326.aspx&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://msdn.microsoft.com/ko-kr/library/aa302326.aspx&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&lt;b&gt;PropertyGridForm&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Test
{
    public partial class PropertyGridForm : Form
    {
        public PropertyGridForm()
        {
            InitializeComponent();

            _propertyGrid.SelectedObject = new PropertiesObject();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;PropertiesObject&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    internal class PropertiesObject
    {
        private TestOriginEnum testOriginEnum = TestOriginEnum.Test1;
        
        public TestOriginEnum TestOriginEnum
        {
            get { return testOriginEnum; }
            set { testOriginEnum = value; }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;TestOriginEnum&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    internal enum TestOriginEnum
    {
        Test1, Test2
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/992CAC455C2194A604?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/992CAC455C2194A604?original&quot; data-alt=&quot;[ 그림 1 - PropertyGridForm ]&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/992CAC455C2194A604&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F992CAC455C2194A604&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;288&quot; height=&quot;294&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 - PropertyGridForm ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: Verdana;&quot;&gt;&amp;nbsp;해&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-family: Verdana;&quot;&gt;당 PropertyGridForm 을 실행 하면 그림 1과 같이 표시된다. TestOriginEnum에 정의한 Test1, Test2가 그대로 표현 되는 걸 그림 1로 통해 확인 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: Verdana;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: Verdana;&quot;&gt;이젠 Test1 = 1, Test2 = 2 표시되게 Enum을 추가 해 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 16px; font-family: Verdana;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;TestConvertEnum&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace Test
{
    internal enum TestConvertEnum
    {
        [Description(&quot;1&quot;)]
        Test1,

        [Description(&quot;2&quot;)]
        Test2
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-size: 12pt;&quot;&gt;기존 TestOriginEnum 과 틀린점은 Description Attribute를 정의한다는 점이 틀립니다. 이젠 해당 TestConvertEnum을 화면에 표시하기 위해 PropertiesObject에 Property를 추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;PropertiesObject&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace Test
{
    internal class PropertiesObject
    {
        private TestOriginEnum testOriginEnum = TestOriginEnum.Test1;
        private TestConvertEnum testConvertEnum = TestConvertEnum.Test1;

        public TestOriginEnum TestOriginEnum
        {
            get { return testOriginEnum; }
            set { testOriginEnum = value; }
        }

        [TypeConverter(typeof(TestConverterEnum))]
        public TestConvertEnum TestConvertEnum
        {
            get { return testConvertEnum; }
            set { testConvertEnum = value; }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;&amp;nbsp;기존에 정의한 TestOriginEnum 과 틀린점은 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;[TypeConverter[typeof(TestConverterEnum))]&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt; Attribute 구문이 추가된 점입니다. 해당 선언을 통하여 화면에 표시될때 TestConvertEnum에서 정의한 &lt;/span&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;Description Attribute 값을 TestConverterEnum을 통하여 한다는 점입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;&lt;b&gt;TestConverterEnum&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;

namespace Test
{
    class TestConverterEnum : EnumConverter
    {
        private Type enumType;

        public TestConverterEnum(Type type) : base(type)
        {
            enumType = type;
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destType)
        {
            return destType == typeof(string);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture,
                                         object value, Type destType)
        {
            FieldInfo fi = enumType.GetField(Enum.GetName(enumType, value));
            DescriptionAttribute dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi,
                                        typeof(DescriptionAttribute));
            if (dna != null)
                return dna.Description;
            else
                return value.ToString();
        }

        public override bool CanConvertFrom(ITypeDescriptorContext context, Type srcType)
        {
            return srcType == typeof(string);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture,
                                           object value)
        {
            foreach (FieldInfo fi in enumType.GetFields())
            {
                DescriptionAttribute dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi,
                                            typeof(DescriptionAttribute));
                if ((dna != null) &amp;amp;&amp;amp; ((string)value == dna.Description))
                    return Enum.Parse(enumType, fi.Name);
            }
            return Enum.Parse(enumType, (string)value);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;&lt;b&gt;EnumConverter &lt;/b&gt;클래스를 상속받아 중요 메소드를 구현한 걸 보실 수 있습니다.&amp;nbsp; C#을 어느정도 하신 분이라면 대략 파악이 가능 하실 거라 생각합니다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: Verdana;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99A3D2485C21991A0B?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99A3D2485C21991A0B?original&quot; data-alt=&quot;[ 그림 2 - PropertyGridForm EnumConverter 적용한 프로퍼티 ]&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A3D2485C21991A0B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A3D2485C21991A0B&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;288&quot; height=&quot;294&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2 - PropertyGridForm EnumConverter 적용한 프로퍼티 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&lt;b&gt;[ 참고 ]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&lt;a class=&quot;tx-link&quot; href=&quot;https://stackoverflow.com/questions/7422685/edit-the-display-name-of-enumeration-members-in-a-propertygrid&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/7422685/edit-the-display-name-of-enumeration-members-in-a-propertygrid&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>.NET/CSharp</category>
      <category>Win32</category>
      <category>WinForm</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/175</guid>
      <comments>https://soultomind.tistory.com/175#entry175comment</comments>
      <pubDate>Tue, 25 Dec 2018 11:44:10 +0900</pubDate>
    </item>
    <item>
      <title>[DebugView] - 사용하기</title>
      <link>https://soultomind.tistory.com/173</link>
      <description>&lt;h1&gt;DebugView 사용하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/sysinternals/downloads/debugview&quot;&gt;https://docs.microsoft.com/en-us/sysinternals/downloads/debugview&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1639746970684&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;DebugView - Windows Sysinternals&quot; data-og-description=&quot;This program intercepts calls made to DbgPrint by device drivers and OutputDebugString made by Win32 programs.&quot; data-og-host=&quot;docs.microsoft.com&quot; data-og-source-url=&quot;https://docs.microsoft.com/en-us/sysinternals/downloads/debugview&quot; data-og-url=&quot;https://docs.microsoft.com/en-us/sysinternals/downloads/debugview&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c9ll1W/hyMJOxMBJS/hlbNCSH2pAYVZR3Qp1U1vk/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/sysinternals/downloads/debugview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.microsoft.com/en-us/sysinternals/downloads/debugview&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c9ll1W/hyMJOxMBJS/hlbNCSH2pAYVZR3Qp1U1vk/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;DebugView - Windows Sysinternals&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This program intercepts calls made to DbgPrint by device drivers and OutputDebugString made by Win32 programs.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DebugView&lt;/b&gt;는 .NET Framework로 Application 개발시 유용한 툴입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발시에 System.Diagnostics Namespace 에 있는 &lt;b&gt;Debug&lt;/b&gt;, &lt;b&gt;Trace&lt;/b&gt; 클래스를 활용하여 디버깅 용도로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C, C++ 에서는 &lt;b&gt;Windows.h&lt;/b&gt; 에서 제공하는 &lt;b&gt;OutputDebugString&lt;/b&gt; 함수를 사용하면 해당 DebugView에서 볼수있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Debug&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 디버깅에 도움이 되는 메서드 및 속성들을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/system.diagnostics.debug(v=vs.110).aspx&quot;&gt;https://msdn.microsoft.com/ko-kr/library/system.diagnostics.debug(v=vs.110).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Trace&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 집합을 제공 및 코드의 실행을 추적 하는데 도움이 되는 속성입니다. 이 클래스는 상속될 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/system.diagnostics.trace(v=vs.110).aspx&quot;&gt;https://msdn.microsoft.com/ko-kr/library/system.diagnostics.trace(v=vs.110).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Program.cs&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;using System;

namespace UseDebugView
{
    class Program
    {
        static void Main(string[] args)
        {
            Toolkit.DebugWriteLine(&quot;Debug!&quot;);
            Toolkit.TraceWriteLine(&quot;Trace!&quot;);

            Console.WriteLine(&quot;Press any key to continue..&quot;);
            Console.ReadKey();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Toolkit.cs&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;using System;
using System.Diagnostics;
using System.Reflection;

namespace UseDebugView
{
    internal class Toolkit
    {
        /// &amp;lt;summary&amp;gt;
        /// DebugView Filter 이름
        /// &amp;lt;para&amp;gt;Filter/Hightlight 메뉴 Include 항목에 사용될 값&amp;lt;/para&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        public static string IncludeFilterName
        {
            get { return _sIncludeFilterName; }
            set
            {
                if (!String.IsNullOrEmpty(value) &amp;amp;&amp;amp; value.Length &amp;gt; 1)
                {
                    _sIncludeFilterName = value;
                }
            }
        }
        public static string _sIncludeFilterName;

        /// &amp;lt;summary&amp;gt;
        /// &amp;lt;see cref=&quot;System.Diagnostics.Debug&quot;/&amp;gt;.WriteLine 메서드 출력 여부
        /// &amp;lt;/summary&amp;gt;
        public static bool IsDebugEnabled;

        /// &amp;lt;summary&amp;gt;
        /// &amp;lt;see cref=&quot;System.Diagnostics.Trace&quot;/&amp;gt;.WriteLine 메서드 출력 여부
        /// &amp;lt;/summary&amp;gt;
        public static bool IsTraceEnabled;

        /// &amp;lt;summary&amp;gt;
        /// 메시지 출력시 현재시간 출력 여부
        /// &amp;lt;/summary&amp;gt;
        public static bool UseNowToString;
        static Toolkit()
        {

#if DEBUG
            _sIncludeFilterName = CreateNamespace();
            IsDebugEnabled = true;
#else
            _sIncludeFilterName = &quot;ApplicationName&quot;;
            IsDebugEnabled = false;
#endif
            IsTraceEnabled = true;
            UseNowToString = false;
        }

        private static string CreateNamespace()
        {
            Assembly assembly = Assembly.GetAssembly(typeof(Toolkit));
            return assembly.GetName().Name;
        }

        private static string NowToString(string format = &quot;yyyy/MM/dd HH:mm:ss&quot;)
        {
            return DateTime.Now.ToString(format);
        }

        public static void DebugWriteLine(string message)
        {
            if (IsDebugEnabled)
            {
                string className = new StackFrame(1).GetMethod().ReflectedType.Name;
                string methodName = new StackFrame(1, true).GetMethod().Name;
                if (UseNowToString)
                {
                    message = String.Format(&quot;[{0}] [{1}.{2}] {3} DEBUG - {4}&quot;, 
                        _sIncludeFilterName, className, methodName, NowToString(), message);
                }
                else
                {
                    message = String.Format(&quot;[{0}] [{1}.{2}] DEBUG - {3}&quot;,
                        _sIncludeFilterName, className, methodName, message);
                }

                Debug.WriteLine(message);
            }
        }
        public static void TraceWriteLine(string message)
        {
            if (IsTraceEnabled)
            {
                string className = new StackFrame(1).GetMethod().ReflectedType.Name;
                string methodName = new StackFrame(1, true).GetMethod().Name;
                if (UseNowToString)
                {
                    message = String.Format(&quot;[{0}] [{1}.{2}] {3} TRACE - {4}&quot;,
                        _sIncludeFilterName, className, methodName, NowToString(), message);
                }
                else
                {
                    message = String.Format(&quot;[{0}] [{1}.{2}] TRACE - {3}&quot;, 
                        _sIncludeFilterName, className, methodName, message);
                }
                Trace.WriteLine(message);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LgqXv/btrnUIprp0J/OTHTtN6wqdspeZ7nICIcsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LgqXv/btrnUIprp0J/OTHTtN6wqdspeZ7nICIcsk/img.png&quot; data-alt=&quot;[ 그림 1 - Debug 실행 Visual Studio 출력 탭 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LgqXv/btrnUIprp0J/OTHTtN6wqdspeZ7nICIcsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLgqXv%2FbtrnUIprp0J%2FOTHTtN6wqdspeZ7nICIcsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;239&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 - Debug 실행 Visual Studio 출력 탭 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림1과 같이 디버깅시작(F5) 하면 출력탭에 Debug, Trace 클래스 WriteLine 메서드로 출력한 메시지가 보이는 걸 보실 수 있습니다. 프로그램 개발이 완료되어 베포되었을 때 오류가 났을 경우 DebugView로 Debug, Trace 클래스로 작성한 메시지를 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Debug&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Debug 모드일때 디버깅 시작(F5) 하여 실행 하거나 그냥 실행 하였을때 볼 수 있습니다. Release 모드 시에는 해당 클래스 메시지는 보이지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Toolkit.cs 파일 에서 볼 수 있듯이 &lt;b&gt;DEBUG&lt;/b&gt; 일 때만 True 로 설정하여 불 필요한 메소드 호출을 피할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buUyyk/btrnXZcs4oJ/blziK0VurI05hkOUi2TacK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buUyyk/btrnXZcs4oJ/blziK0VurI05hkOUi2TacK/img.png&quot; data-alt=&quot;[ 그림 2 - Debug 실행 DebugView ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buUyyk/btrnXZcs4oJ/blziK0VurI05hkOUi2TacK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuUyyk%2FbtrnXZcs4oJ%2FblziK0VurI05hkOUi2TacK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;293&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2 - Debug 실행 DebugView ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Trace&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Release 모드일때 실행 하였을 때 볼 수 있습니다. Debug 클래스를 활용한 메시지는 볼 수 없으며 해당 클래스의 메시지만 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RZaiL/btrnQ5FJI0r/vlj3VJlRKv2Dli7SRMqjt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RZaiL/btrnQ5FJI0r/vlj3VJlRKv2Dli7SRMqjt0/img.png&quot; data-alt=&quot;[ 그림 3 - Release 실행 DebugView ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RZaiL/btrnQ5FJI0r/vlj3VJlRKv2Dli7SRMqjt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRZaiL%2FbtrnQ5FJI0r%2Fvlj3VJlRKv2Dli7SRMqjt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;311&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 3 - Release 실행 DebugView ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Release 모드에서는 Debug 모드와 다르게 앞에 출력되는 값이 아래와 같이 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IncludeFilterName&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Debug&lt;/b&gt; : UseDebugView&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Release&lt;/b&gt; : ApplicationName&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 설정하는 이유는 필자는 개발시에 DebugView를 보면서 프로그램에서 버그가 발생하였을 경우 디버깅을 해야 될 상황이 있어 각각의 프로젝트 이름별로 이름을 정합니다. 위와 같이 Toolkit 클래스를 프로젝트별로 만듭니다. 그리하여 접근지정자 또한 Internal 로 지정합니다. 특정 부분에서 에러가 발생하였을 경우 어느모듈에서 발생하는지 파악이 쉽기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 실제 운영시(Release)에는 &lt;b&gt;IncludeFilterName&lt;/b&gt; 값을 모든 프로젝트의 Toolkit 클래스에 동일하게 적용합니다. 상황에 따라서는 개발시(Debug)에도 동일하게 &lt;b&gt;IncludeFilterName&lt;/b&gt; 값을 모든 프로젝트의 Toolkit 클래스에 동일하게 적용이 필요 할 경우도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금융권같은 경우에는 보안프로그램이 워낙 많기 때문에 DebugView를 실행해보면 1초단위로 엄청나게 많은 로깅메시지가 출력됩니다. 워낙 많은 로깅 메시지가 출력이 되기때문에 작업을 진행하기 힘듭니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EzWXA/btrnVbydj5U/QLKz4tdRkhmK0JWwDWHCFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EzWXA/btrnVbydj5U/QLKz4tdRkhmK0JWwDWHCFK/img.png&quot; data-alt=&quot;[ 그림 4 - DebugView Filter 적용 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EzWXA/btrnVbydj5U/QLKz4tdRkhmK0JWwDWHCFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEzWXA%2FbtrnVbydj5U%2FQLKz4tdRkhmK0JWwDWHCFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;187&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 4 - DebugView Filter 적용 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 4와 같이 Include 항목에 Toolkit.&lt;b&gt;IncludeFilterName&lt;/b&gt;에 적용한 값을 입력하고 확인을 누르면 해당 [ApplicationName] 항목이 포함된 항목만 DebugView 로깅메시지가 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Include&lt;/b&gt; : [ApplicationName] 내용을 포함하고 있는 출력할 메시지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Exclude&lt;/b&gt; : 예) [Test] 내용을 포함하고 있는 제외할 메시지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzHv2Y/btrnR5Fc5kM/9CaNI3vkeN3raeTkfIAiW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzHv2Y/btrnR5Fc5kM/9CaNI3vkeN3raeTkfIAiW0/img.png&quot; data-alt=&quot;[ 그림 5 - DebugView Time Format 적용 전 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzHv2Y/btrnR5Fc5kM/9CaNI3vkeN3raeTkfIAiW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzHv2Y%2FbtrnR5Fc5kM%2F9CaNI3vkeN3raeTkfIAiW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;300&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 5 - DebugView Time Format 적용 전 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lTLIT/btrnXZQ4AJs/fyNqKLngA2kUZ37sLO0ymk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lTLIT/btrnXZQ4AJs/fyNqKLngA2kUZ37sLO0ymk/img.png&quot; data-alt=&quot;[ 그림 6 - DebugView Time Format 적용 후 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lTLIT/btrnXZQ4AJs/fyNqKLngA2kUZ37sLO0ymk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlTLIT%2FbtrnXZQ4AJs%2FfyNqKLngA2kUZ37sLO0ymk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;291&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 6 - DebugView Time Format 적용 후 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 5는 Time Format 을 적용 전, 그림 6은 Time Format 적용 후 입니다. Time Format 이 적용 후 시간이 출력 되는걸 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DebugView&lt;/b&gt; 의 자세한 내용은 최 상단에 링크를 통해 확인해 주시기 바랍니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GitHub Source&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/soultomind/Blog/tree/develop/UseDebugView&quot;&gt;https://github.com/soultomind/Blog/tree/develop/UseDebugView&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>.NET/Tools, Library</category>
      <category>DebugView</category>
      <category>Win32</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/173</guid>
      <comments>https://soultomind.tistory.com/173#entry173comment</comments>
      <pubDate>Fri, 14 Sep 2018 10:04:37 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - WinForm Form Esc 키 눌렀을때 종료하기</title>
      <link>https://soultomind.tistory.com/172</link>
      <description>&lt;p style=&quot;text-align: left; clear: none; float: none;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/9926033A5B99F1B526?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/9926033A5B99F1B526?original&quot; data-alt=&quot;[ 그림 1 - Form KeyPreview 속성 True 설정 ]&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9926033A5B99F1B526&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9926033A5B99F1B526&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;374&quot; height=&quot;386&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 - Form KeyPreview 속성 True 설정 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Form에서 해당 키를 받기 위해서는 그림1과 같이 속성 창에서&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;KeyPreview&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;속성을 True로 설정해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/994A18365C15E9E610?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/994A18365C15E9E610?original&quot; data-alt=&quot;[ 그림 2 - Form KeyDown 이벤트 등록 ]&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994A18365C15E9E610&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994A18365C15E9E610&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;371&quot; height=&quot;366&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2 - Form KeyDown 이벤트 등록 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&lt;b&gt;KeyPreview&lt;/b&gt; 속성을 True로 설정후에는 그림2와 같이&amp;nbsp;&lt;b&gt;KeyDown&lt;/b&gt; 이벤트롤 등록한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;Esc 키가 눌렀을때 &lt;b&gt;Form.Close() &lt;/b&gt;함수를 호출한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;private void TestForm_KeyDown(object sender, KeyEventArgs e)
{
        if ((Keys)e.KeyValue == Keys.Escape)
        {
                this.Close();
        }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/CSharp</category>
      <category>Win32</category>
      <category>WinForm</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/172</guid>
      <comments>https://soultomind.tistory.com/172#entry172comment</comments>
      <pubDate>Thu, 13 Sep 2018 14:22:45 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - Debug 모드 일때 실행과 디버그 구분하기</title>
      <link>https://soultomind.tistory.com/171</link>
      <description>&lt;pre&gt;&lt;code class=&quot;c#&quot;&gt;if (Debugger.IsAttached)
{
    System.Diagnostics.Debug.WriteLine(&quot;디버그&quot;);
}
else
{
    System.Diagnostics.Trace.WriteLine(&quot;실행&quot;);
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>.NET/CSharp</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/171</guid>
      <comments>https://soultomind.tistory.com/171#entry171comment</comments>
      <pubDate>Thu, 13 Sep 2018 14:00:34 +0900</pubDate>
    </item>
    <item>
      <title>[C#] - WinForm 사용자 정의 컨트롤 사용하기</title>
      <link>https://soultomind.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; font-size: 12pt;&quot;&gt;&amp;nbsp;사용자 정의 컨트롤은 보통 사용자 만의 컨트롤을 만들거나 ActiveX 컨트롤 을 만들 때 주로 사용됩니다. 개발하면서 겪었던 특징점들을 정리해보고자 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;1. Load 이벤트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99E790355C15EB5B16?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99E790355C15EB5B16?original&quot; data-alt=&quot;[ 그림 1 사용자 컨트롤 Load 이벤트 ]&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E790355C15EB5B16&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E790355C15EB5B16&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;337&quot; height=&quot;369&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 1 사용자 컨트롤 Load 이벤트 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;보통 Load 이벤트는 Form에 추가하여 주로 사용합니다. Form에 추가하여 사용할 경우에는 UserControl 에서 Load 이벤트를 정의하여 사용할 경우는 많지 않다. Load 이벤트가 필요하신분은 아래의 코드를 참고 하시기 바랍니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;해당 Form 에서 Load 이벤트를 받으면 되기 때문이다. 해당 Load 이벤트는 UserControl 을 ActiveX 컨트롤로 만들어 Internet Explorer 브라우저에 올릴경우에 사용된다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;개발하면서 겪었던 에러&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;///////////////////////&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;그러나 UserControl에&amp;nbsp;WebBrowser 컨트롤을 추가 할 경우에는 상황이 틀려진다. WebBrowser 컨트롤을 올릴 경우에 에러가 발생한다. 해당 컨트롤을 추가하지만 Dispose 메소드가 호출되고 &lt;b&gt;ObjectDisposedException&lt;/b&gt; 예외가 나면서 에러창을 표시된다.&amp;nbsp; 왜 에러가 나는지는 자세하게 찾아 보 질 못하였다. 여유가 있을 때 찾아봐 해당 글에 내용을 추가하겠다. 그리하여 MFC ActiveX 컨트롤 안에 .NET ActiveX 컨트롤을 올려 작업을 하였다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;///////////////////////&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;//////////////////////&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;MFC ActiveX 컨트롤에 C# ActiveX 컨트롤 올렸더니 Load 이벤트가 호출되지 않았다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; font-size: 12pt;&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2220483/usercontrol-load-event-not-fired&quot;&gt;https://stackoverflow.com/questions/2220483/usercontrol-load-event-not-fired&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1610093598659&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;UserControl Load event not fired&quot; data-og-description=&quot;I have WinForms application. My Form derived class has UserControl derived class. I simply put several controls into one UserControl to simplify reuse. The Load event of UserControl is not fired. D...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/2220483/usercontrol-load-event-not-fired&quot; data-og-url=&quot;https://stackoverflow.com/questions/2220483/usercontrol-load-event-not-fired&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b252H7/hyIQ19tiO3/AbX4kERQjNDyHCc7spkiX0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2220483/usercontrol-load-event-not-fired&quot; data-source-url=&quot;https://stackoverflow.com/questions/2220483/usercontrol-load-event-not-fired&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b252H7/hyIQ19tiO3/AbX4kERQjNDyHCc7spkiX0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;UserControl Load event not fired&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I have WinForms application. My Form derived class has UserControl derived class. I simply put several controls into one UserControl to simplify reuse. The Load event of UserControl is not fired. D...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;line-height: 1.8; font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Verdana; font-size: 12pt;&quot;&gt;&amp;nbsp;해결은 위에 링크를 통하여 해결 하였다. 부모 컨트롤 OnLoad 이벤트에서 base.OnLoad(e) 호출을 하지 않았기 때문 이였다. UserControl의 Load 이벤트를 정의 하고 싶을 경우에는 OnLoad 이벤트를 재정의 하고 base.OnLoad(e)를 최상단에 정의하자.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    MessageBox.Show(&quot;OnLoad&quot;);
}

private void TestUserControl_Load(object sender, EventArgs e)
{
    MessageBox.Show(&quot;TestUserControl_Load&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; font-size: 12pt;&quot;&gt;TestUserControl_Load 메시지 박스 후 OnLoad 메시지 박스 가 호출된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; font-size: 14pt;&quot;&gt;&lt;b&gt;2. 키 이벤트 받기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;UserControl 키 이벤트를 받는 &lt;b&gt;KeyDown&lt;/b&gt;, &lt;b&gt;KeyPress&lt;/b&gt;, &lt;b&gt;PreviewKeyDown &lt;/b&gt;가 있다. 허나 해당 이벤트를 등록해도 해당 이벤트가 타지 않는 거였다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;a class=&quot;tx-link&quot; href=&quot;https://stackoverflow.com/questions/1152784/capturing-keydown-events-in-a-usercontrol&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/1152784/capturing-keydown-events-in-a-usercontrol&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1613821698876&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Capturing KeyDown events in a UserControl&quot; data-og-description=&quot;I have a user control with several child controls. I need the user interface to react to keypresses, so I decided to put the handling code in a MainControl_KeyDown event. However, when I press a ke...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/1152784/capturing-keydown-events-in-a-usercontrol&quot; data-og-url=&quot;https://stackoverflow.com/questions/1152784/capturing-keydown-events-in-a-usercontrol&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e8Lw9/hyJkYcyOcN/Z9IpKCURlh0IYLJn2pmBC0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/1152784/capturing-keydown-events-in-a-usercontrol&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/1152784/capturing-keydown-events-in-a-usercontrol&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e8Lw9/hyJkYcyOcN/Z9IpKCURlh0IYLJn2pmBC0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Capturing KeyDown events in a UserControl&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I have a user control with several child controls. I need the user interface to react to keypresses, so I decided to put the handling code in a MainControl_KeyDown event. However, when I press a ke...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;위에 StackOverflow 정보를 통하여 해결하였다. ProcessCmdKey 메소드를 재정의 하여 특정 키에 대한 입력이 들어왔을때 처리해준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    Keys keys = Keys.Control | Keys.Shift | Keys.Z;
    if (keys == keyData)
    {
        MessageBox.Show(&quot;Ctrl + Shift + Z&quot;);
        return true;
    }
    else
    {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; font-size: 12pt;&quot;&gt;해당 코드는 Ctrl + Shift + Z 조합키가 눌렸을때 메시지 박스를 띄어주고 아닐때에는 기존 정의되어 있는 부모 클래스의 &lt;b&gt;ProcessCmdKey &lt;/b&gt;함수를 호출해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;line-height: 1.8;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/CSharp</category>
      <category>MFC</category>
      <category>Win32</category>
      <category>WinForm</category>
      <author>BitterVitae</author>
      <guid isPermaLink="true">https://soultomind.tistory.com/169</guid>
      <comments>https://soultomind.tistory.com/169#entry169comment</comments>
      <pubDate>Sun, 26 Aug 2018 10:08:13 +0900</pubDate>
    </item>
  </channel>
</rss>