c#으로 키움증권 영웅문 글로벌 제어하기 – 종목 변경

영웅문 글로벌은 4와 비슷해 보이지만 다르게 작동한다. wm_settext와 wm_keydown을 연달아 보내면 전자만 작동하고 후자는 작동하지 않는다.

4와 달리 종목 코드를 입력하는 edit에 wm_settext로 문자열을 보내 입력하는 거로는 충분하지 않다. 이 에디트는 표준 윈도우즈 컨트롤이 아니다.

키를 하나씩 눌러 입력해 보면 각 동작에 드롭 다운 리스트가 작동하는 걸 확인할 수 있다. 이렇게 드롭 다운 리스트가 작동하는 상태에서 엔터를 눌러야 종목이 바뀐다. wm_settext로 문자열만 보내면 반응하지 않는다.

문자열을 보내 반응하게 하려면 wm_paste 즉 붙여넣기를 실행해야 한다. 하지만 이렇게 한 뒤 바로 엔터 키 다운을 실행해도 이 역시 작동하지 않는다. 드롭 다운 리스트가 작동할 짧은 시간을 줘야 한다.

2010 현재 가격창을 열고 실행한다. 관리자 권한으로 실행해야 한다.

[DllImport("user32")] static extern IntPtr FindWindowA(string lpClassName, string lpWindowName);
[DllImport("user32")] static extern IntPtr FindWindowExA(IntPtr hWndParent, IntPtr hWndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

private async void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    Clipboard.SetText("aapl"); // copy apple code to clipboard

    IntPtr handle1 = FindWindowA("_NFHeroMainClass", null);
    IntPtr handle2 = FindWindowExA(handle1, 0, "MDIClient", null);
    IntPtr handle3 = FindWindowExA(handle2, 0, null, "[2010] 해외주식 현재가");
    IntPtr handle4 = FindWindowExA(handle3, 0, "AfxFrameOrView110", null);
    IntPtr handle5 = FindWindowExA(handle4, 0, "AfxWnd110", null);
    IntPtr handle6 = FindWindowExA(handle5, 0, "AfxWnd110", null);
    IntPtr handle7 = FindWindowExA(handle5, handle6, "SysTabControl32", null);
    IntPtr handle8 = FindWindowExA(handle5, handle7, "SysTabControl32", null);
    IntPtr handle9 = FindWindowExA(handle5, handle8, "AfxWnd110", null);
    IntPtr handle10 = FindWindowExA(handle5, handle9, "AfxWnd110", null);
    IntPtr handle11 = FindWindowExA(handle5, handle10, "AfxWnd110", null);
    IntPtr handle12 = FindWindowExA(handle11, 0, "AfxWnd110", null);
    IntPtr handle13 = FindWindowExA(handle12, 0, "Edit", null);

    SendMessage(handle13, 0x0302, 0, 0); // wm_paste

    await Task.Delay(100);

    SendMessage(handle13, 0x0100, 0x0D, 0); // wm_keydown of enter
}