Blog categories

Comments

[WPF, 키움 OpenAPI] WPF에 키움 OpenAPI ActiveX 컨트롤 호스팅하기

[WPF, 키움 OpenAPI] WPF에 키움 OpenAPI ActiveX 컨트롤 호스팅하기

개발 환경 : Microsoft Visual Studio 2015

기본적인 키움증권 OpenAPI 개발환경이 이미 갖추어져 있다고 가정하고 진행합니다. (OpenAPI 모듈 설치, 번개 설치 등)
본 글은 WinForm 프로젝트에서 사용 가능한 키움증권 OpenAPI Control을 WPF 프로젝트에서 사용하기 위한 방법을 간단히 소개합니다.

먼저 [WPF 응용 프로젝트]를 생성합니다. 프로젝트 이름은 간단히 기본값인 WpfApplication1 을 사용합니다.

Image module

좌측 솔루션 탐색기에서 솔루션에 우측 마우스를 클릭하여 새 프로젝트를 추가합니다.
이때 추가하는 프로젝트는 [Windows Form 컨트롤 라이브러리] 프로젝트 입니다.
프로젝트의 이름은 [KHAxLib] 라고 지정하도록 하겠습니다.

Image module

두 개의 프로젝트를 생성하고 나면 좌측 솔루션 탐색기의 모습은 다음과 같이 됩니다.

Image module

[KHAxLib] 프로젝트를 선택한 상태에서 상단 메뉴 [도구] > [도구 상자 항목 선택] 을 클릭합니다.
이후 뜨는 [도구 상자 항목 선택] 팝업 창에서 [COM 구성 요소] 탭을 클릭하고,
키움증권 OpenAPI Contorl 인 [KHOpenAPI Contorl]에 체크 합니다.

Image module

이제 UserContorl1.cs 디자인 파일 선택 상태에서 좌측 [도구 상자] > [일반] 을 보면 다음과 같이 [KHOpenAPI Control] 이 생겨있는 것을 볼 수 있습니다.
이를 우측 창에 배치합니다.

Image module

[KHOpenAPI Control]의 [Dock] 값을 [Fill]로 지정합니다.

Image module

[UserContorl1] 파일을 편집합니다.
외부에 UserControl 이 가지고 있는 KHOpenAPI의 인터페이스를 사용할 수 있도록 아래와 같이 퍼사드 패턴(Facade Pattern)을 사용해 인터페이스를 제공합니다.

Image module

[UserContorl1.cs] 파일명을 [KHAxControl] 로 변경합니다.
아래 창과 같이 팝업 창이 뜨면 [예]를 누릅니다.

Image module

이제 [WpfApplication1] 프로젝트로 넘어와서, 우측마우스 -> [추가] > [참조] 를 클릭합니다.
[참조 관리자]에서 [프로젝트] > [KHAxLib] 프로젝트를 참조 추가합니다.

Image module

[어셈블리] > [프레임워크] 란에서는 [System.Windows.Forms]와 [WindowsFormsIntegration]를 참조 추가해줍니다.

Image module

[MainWindow]에서 [Gird]에 [grid1] 이름을 지정하고, [Window] 에 대해서는 [Loaded] 이벤트를 추가합니다.

Image module

[MainWindows.xaml.cs] 파일에서 앞서 추가한 [Loaded] 이벤트에 대한 내용을 아래와 같이 작성합니다.
아래는 KHOpenAPI를 이용해 서버에 접속하는 코드 입니다.

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        System.Windows.Forms.Integration.WindowsFormsHost host =
            new System.Windows.Forms.Integration.WindowsFormsHost();

        KHAxLib.KHAxControl khAxCtr = new KHAxLib.KHAxControl();

        host.Child = khAxCtr;

        this.grid1.Children.Add(host);

        if(khAxCtr.CommConnect() == 0)
        {
            // Connection success
        }
        else
        {
            // Connection fail
        }
    }
Image module

만약 위와 같이 Warpper를 사용하고 싶지 않다면 바로 프로젝트에 WinForm Control 객체를 적용하셔도 됩니다.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        xmlns:fi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:kh="clr-namespace:KHAxLib;assembly=KHAxLib"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">

    <Grid>
        <fi:WindowsFormsHost>
            <kh:KHOpenAPIWrap x:Name="khAxCtr" />
        </fi:WindowsFormsHost>
    </Grid>

</Window>

올바르게 동작하면 MainWindow가 뜨면서 다음과 같이 키움 OpenAPI의 로그인 창이 같이 뜨게 됩니다.

Image module

만약 코드로 생성하지 않고 XAML로 작성하여 컨트롤을 생성하고 싶을 경우 XAML 파일에 다음과 같이 작성하면 됩니다.
이 경우 [KHAxLib] 프로젝트를 생성하실 필요 없으며,
[KHAxLib] 프로젝트에 적용한 참조 방식을 바로 [WpfApplication1] 프로젝트에 적용하시면 됩니다.
그럴 경우 XAML 파일은 아래와 같이 작성하시면 됩니다.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        xmlns:fi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:axkh="clr-namespace:AxKHOpenAPILib;assembly=AxInterop.KHOpenAPILib"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">

    <Grid>
        <fi:WindowsFormsHost>
            <axkh:AxKHOpenAPI x:Name="axKHOpenAPI" />
        </fi:WindowsFormsHost>
    </Grid>

</Window>

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

div#stuning-header .dfd-stuning-header-bg-container {background-color: #3f3f3f;background-size: cover;background-position: top center;background-attachment: initial;background-repeat: no-repeat;}#stuning-header div.page-title-inner {min-height: 350px;}