본문 바로가기

Language/C#

WPF 에서 ActiveX 사용하기

 
개요

 

WPF 내에서 ActiveX를 사용하도록 구성하는 것은 어려운 일이 아니다. 하지만 현재 버전의 WPF 에서는 ActiveX를 사용하려면 Windows Forms의 기능을 이용해서 추가적인 작업을 해야 한다. 들리는 말에 의하면 WPF 개발팀은 Windows Forms에 구현되어 있는 ActiveX 관련 기능이 매우 훌륭하여, 이 기능을 굳이 WPF에 그대로 복사해서 구현할 필요는 없다고 판단했다. 그래서 WPF 에서 ActvieX를 사용하려면 Windows Forms의 기능을 이용하도록 결정을 했단다. 어찌되었든 WPF에서 ActiveX를 사용하려면 Windows Forms의 도움이 필요하다는 사실이 중요하다.

 

Interop 어셈블리

 

.NET에서 ActiveX를 사용하려면 Interop 어셈블리가 필요하다. 하지만 위에서 언급한 이유로 WPF 프로젝트는 ActiveX 컴포넌트에 대한 Interop 어셈블리 파일을 자동으로 생성해 주지 않는다. 이 파일을 생성하기 위해서는 두가지 방법이 있다.

  • AXIMP.EXE 유틸리티 사용
  • Windows Forms 기능 사용

대부분의 ActiveX 컴포넌트는 물리적인 파일이 어디에 위치하고 있는지 잘 모른다. 따라서 두번째 방법으로 Interop 어셈블리를 얻어내는것이 이것저것 신경쓸거 없이 편리하다.  

 

Windows Forms 으로 Interop 어셈블리 생성하기

  1. Windows Forms 프로젝트를 추가한다.
  2. Form1의 다지인 화면에서 Toolbox에 Windows Media Player Component를 추가한다.

     

  3. Windows Media Player 컴포넌트를 폼에 추가한다.
    이때 Visual Studio 는 자동으로 해당 ActiveX 에 대한 Interop 어셈블리 파일들을 생성하고 참조에 추가한다.
    AxInterop.WMPLib.dll / Interop.WMPLib.dll 
WPF 애플리케이션

 

Windows Media Player ActiveX 에 대한 Interop 어셈블리를 얻어냈으므로 WPF 애플리케이션에서는 해당 어셈블리를 참조에 추가하여 Windows Media Player를 사용하면 된다.

  1. WPF Application 프로젝트를 추가한다.
  2. 앞에서 만든 AxInterop.WMPLib.dll / Interop.WMPLib.dll  어셈블리를 참조에 추가하고, WindowsFormsIntegration 어셈블리를 참조에 추가한다. 

     

  3. Windows1.xaml 코드를 다음과 같이 작성한다.
    <Window x:Class="WPFApp.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <WindowsFormsHost Name="hostContainer" />
        </Grid>
    </Window>

     

  4. Windows1.xaml.cs 코드를 다음과 같이 작성한다.

            public Window1()

            {

                InitializeComponent();

     

                AxWMPLib.AxWindowsMediaPlayer wmp = new AxWMPLib.AxWindowsMediaPlayer();

                hostContainer.Child = wmp;

            }

     

  5. 실행하자.

실행하면 정상적으로 Windows Media Player가 표시된다. 주의할 점은 WPF에서 WindowsFormsHost 컨트롤은 ZIndex의 영향을 받지 않고 항상 TopMost로 동작한다는 사실이다. 복잡한 구조의 애플리케이션을 개발할 때 WindowsFormsHost 컨트롤과 WPF 컨트롤이 중첩되는 경우가 있는데 이런 경우에 WindowsFormsHost를 Hide 시키는 방식과 같이 Workaround 방법을 고려해야 한다.


'Language > C#' 카테고리의 다른 글

날짜(DateTime) 문자열을 내맘대로 만들기  (0) 2016.02.04
C#에서 COM 컴포넌트(or Active X) 사용  (0) 2016.02.04
ActiveX UAC 문제  (0) 2016.02.04
DEP 기능 비호환 ActiveX  (0) 2016.02.04
C# 리본메뉴  (0) 2016.02.04