AI 채팅과 오피스 문서를 단일 화면에 5:5 완벽 밀착: ZeliOffice의 WinUI 3와 Win32 기하학 스냅(SnapSideBySide) 및 GA_ROOT 역추적 아키텍처

듀얼 모니터가 없는 교실 컴퓨터실과 야전 지휘소에서 단일 화면 생산성을 극대화하다. 한글(HWP) 본문 편집창 찌그러짐을 해결한 GetAncestor(GA_ROOT) 프레임 역추적, 4대 오피스 HWND 다형성 추상화, 그리고 태스크바 제외 순수 작업 영역(WorkArea) 0ms 분할 도킹을 공개합니다.

"AI에게 보고서 작성을 지시했는데, 완성된 문서 창이 AI 창 뒤에 가려져 보이지 않는다면 사용자는 불안해집니다. 좌측에는 문서가 실시간으로 타이핑되는 오피스 화면, 우측에는 AI와 소통하는 채팅창. 단일 모니터 환경에서도 듀얼 모니터 수준의 직관성을 선사하는 5:5 사이드 바이 사이드 도킹은 ZeliOffice가 추구하는 인간 중심 데스크톱 공학의 정수입니다."

1. 단일 모니터의 한계: 왜 사이드 바이 사이드(Side-by-Side) 도킹인가?

일선 초·중·고등학교 컴퓨터실의 학생 PC, 교사 연구실의 노트북, 그리고 군 야전 지휘소의 단말기는 대부분 단 1대의 모니터만을 갖추고 있습니다.

이러한 환경에서 생성 AI 기반 오피스 도구를 사용할 때 가장 치명적인 UX 저해 요소는 '창 가림(Window Occlusion) 현상'입니다. 사용자가 AI 창에서 "3학년 과학 평가 기준표 만들어줘"라고 입력하면, 백그라운드에서 실행된 한글이나 엑셀 창이 AI 창 뒤로 숨어버려 결과물이 제대로 생성되고 있는지 확인하기 위해 마우스로 창을 일일이 클릭하고 크기를 조절해야 했습니다.

ZeliDesk의 ZeliOffice(ZeliOfficeWindow.xaml.cs)는 오피스 문서가 열리는 즉시 좌측 50%에는 활성 오피스 창, 우측 50%에는 WinUI 3 AI 창을 0초 만에 완벽 밀착시키는 네이티브 윈도우 스냅 엔진(SnapSideBySide)을 구축했습니다.

비교 항목 기존 수동 조작 및 일반 AI 도구 ZeliOffice SnapSideBySide 엔진
창 분할 조작 횟수 마우스 드래그 및 리사이즈 8회 이상 소요 문서 생성 즉시 0ms 자동 정렬 (조작 0회)
한글(HWP) 창 제어 편집 영역만 줄어들고 메뉴바가 찌그러지는 버그 GetAncestor(GA_ROOT)로 최상위 프레임 완벽 이동
4대 오피스 HWND 획득 프로그램마다 프로퍼티가 달라 예외 빈발 GetOfficeHwnd 다형성 래퍼로 100% 안전 추출
작업 표시줄(Taskbar) 보정 작업 표시줄 아래로 창이 파묻히는 현상 발생 DisplayArea.WorkArea 기하학으로 1px 오차 없이 제외
다중 모니터 대응 항상 1번 모니터로 강제 튀어버림 현재 창이 위치한 활성 디스플레이 자동 추적

2. 핵심 난제 1: 한글(HWP) 편집창의 함정과 GA_ROOT 프레임 역추적

윈도우 기하학 제어에서 개발자들을 가장 큰 혼란에 빠뜨리는 소프트웨어가 바로 아래아한글(HWP)입니다.

한글 COM Automation에서 hwp.XHwpWindows.Active_XHwpWindow.Hwnd를 조회하면 HWND 핸들이 정상적으로 반환됩니다. 하지만 이 핸들은 한글 프로그램 전체 창이 아니라, 문서 본문이 그려지는 자식 윈도우(Child Window)의 핸들입니다. 이 핸들에 Win32 MoveWindow를 호출하면, 상단 메뉴바와 도구상자는 그대로 멈춘 채 오직 글 쓰는 하얀색 도화지 영역만 화면 왼쪽으로 찌그러져 UI가 흉측하게 파괴되는 치명적인 버그가 발생합니다.

ZeliOffice는 Win32 커널 API인 GetAncestor를 동원하여 자식 창으로부터 최상위 루트 프레임 창(Root Frame Window)을 역추적합니다.

C# - ZeliOfficeWindow.xaml.cs (GetOfficeHwnd & GA_ROOT 역추적)
private const uint GA_ROOT = 2;

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr GetAncestor(IntPtr hwnd, uint gaFlags);

private IntPtr GetOfficeHwnd(OfficeAppEntry app)
{
    try
    {
        dynamic instance = app.ComInstance;
        switch (app.Id)
        {
            case "excel":
                // 엑셀: Application.Hwnd (정수 핸들)
                return new IntPtr((int)instance.Hwnd);

            case "word":
                // 워드: ActiveWindow.Hwnd (x64/x86 듀얼 캐스팅 안전망)
                try { return new IntPtr((long)instance.ActiveWindow.Hwnd); }
                catch { try { return new IntPtr((int)instance.ActiveWindow.Hwnd); } catch { } }
                break;

            case "powerpoint":
                // 파워포인트: 대문자 HWND 프로퍼티
                return new IntPtr((int)instance.HWND);

            case "hwp":
                try
                {
                    // [핵심] XHwpWindow.Hwnd는 문서 편집 영역(자식 창)의 핸들!
                    // MoveWindow에는 최상위 프레임 윈도우 핸들이 필요하므로 GetAncestor(GA_ROOT) 사용
                    IntPtr childHwnd = new IntPtr((int)instance.XHwpWindows.Active_XHwpWindow.Hwnd);
                    IntPtr rootHwnd = GetAncestor(childHwnd, GA_ROOT);
                    return rootHwnd != IntPtr.Zero ? rootHwnd : childHwnd;
                }
                catch { }
                break;
        }
    }
    catch { }
    return IntPtr.Zero;
}

GetAncestor(childHwnd, GA_ROOT)는 자식 윈도우의 부모 체인을 거슬러 올라가 OS 셸이 관리하는 최상위 부모 프레임을 정확히 낚아챕니다. 이를 통해 한글 2024의 타이틀바, 리본 메뉴, 상태표시줄을 포함한 전체 애플리케이션 프레임을 좌측 50% 영역에 오차 없이 부드럽게 배치할 수 있게 되었습니다.

3. 핵심 난제 2: 4대 오피스 HWND 인터페이스 다형성(Polymorphism) 극복

마이크로소프트 오피스와 한글과컴퓨터 오피스는 수십 년에 걸쳐 독자적으로 발전해 온 탓에, 윈도우 핸들을 노출하는 COM 프로퍼티의 명칭과 타입이 완전히 제각각입니다.

ZeliOffice는 위 GetOfficeHwnd 메서드 하나로 4대 오피스의 이질적인 인터페이스를 단일 IntPtr로 완전히 캡슐화하여, 상위 레이아웃 엔진이 오피스 종류에 구애받지 않고 일관된 윈도우 도킹을 수행하도록 설계했습니다.

4. 기하학 연산: DisplayArea.WorkArea 기반 0ms 스냅 도킹

윈도우 화면 분할에서 가장 중요한 기하학적 요소는 작업 표시줄(Taskbar)의 위치와 두께, 그리고 현재 창이 어느 모니터에 떠 있는가입니다.

ZeliOffice의 SnapSideBySide는 Windows App SDK의 최신 기하학 API인 Microsoft.UI.Windowing.DisplayArea를 활용합니다.

C# - ZeliOfficeWindow.xaml.cs (SnapSideBySide 레이아웃 엔진)
private void SnapSideBySide(IntPtr officeHwnd)
{
    try
    {
        // 1. 현재 창이 위치한 활성 디스플레이 영역 획득 (다중 모니터 완벽 지원)
        var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(
            WinRT.Interop.WindowNative.GetWindowHandle(this));
        var displayArea = Microsoft.UI.Windowing.DisplayArea.GetFromWindowId(
            windowId, Microsoft.UI.Windowing.DisplayAreaFallback.Primary);

        // 2. 작업 표시줄(Taskbar) 높이가 정확히 제외된 순수 작업 영역(WorkArea) 추출
        int screenW = displayArea.WorkArea.Width;
        int screenH = displayArea.WorkArea.Height;
        int screenX = displayArea.WorkArea.X;
        int screenY = displayArea.WorkArea.Y;

        // 3. 5:5 화면 분할 너비 연산
        int halfW = screenW / 2;

        // 4. [좌측 50%] 레거시 Win32 오피스 창 스냅 (최소화 해제 후 이동)
        ShowWindow(officeHwnd, SW_RESTORE);
        MoveWindow(officeHwnd, screenX, screenY, halfW, screenH, true);

        // 5. [우측 50%] 최신 WinUI 3 zOffice AI 창 스냅
        AppWindow?.MoveAndResize(new Windows.Graphics.RectInt32(
            screenX + halfW, screenY, halfW, screenH));

        AppendLog($"[레이아웃] 사이드 바이 사이드 배치 완료");
    }
    catch (Exception ex)
    {
        AppendLog($"[레이아웃] 배치 실패: {ex.Message}");
    }
}

작업 표시줄이 화면 하단에 있든, 상단에 있든, 혹은 보조 모니터에 창이 떠 있든 간에 displayArea.WorkArea는 실제 창이 놓일 수 있는 가용 사각 영역(X, Y, Width, Height)을 1픽셀의 오차도 없이 실시간 반환합니다. 그 결과 작업 표시줄 아래로 창이 파묻히거나 화면 밖으로 삐져나가는 결함이 0%로 박멸됩니다.

5. 아키텍처 토폴로지: 문서 오픈부터 5:5 윈도우 스냅까지

아래 다이어그램은 사용자가 오피스 문서를 열거나 생성했을 때, ZeliOffice가 HWND를 추출하고 화면 기하학을 연산하여 좌우 5:5로 0ms 분할 스냅을 완성하는 전체 데이터 플로우를 보여줍니다.

1. 문서 오픈 / 탭 전환 한글·엑셀·워드·PPT Document Activated 2. GetOfficeHwnd 추상화 한글: GetAncestor(GA_ROOT) 워드: int/long 듀얼 캐스팅 Excel / PPT HWND 리턴 3. DisplayArea 기하학 활성 모니터 자동 판정 태스크바 제외 WorkArea halfW = screenW / 2 4. 5:5 완벽 밀착 도킹 [좌] Win32 MoveWindow(Office) [우] WinUI 3 AppWindow(zOffice) [Architecture] Active HWND ➔ GA_ROOT Root Frame ➔ DisplayArea WorkArea ➔ 50:50 Seamless Docking

6. 현장 도입 성과 및 B2B/B2G 임팩트

ZeliDesk ZeliOffice의 SnapSideBySide 윈도우 스냅 아키텍처는 교실과 행정 현장의 업무 경험을 완전히 바꾸어 놓았습니다.

7. 결론: 화면의 경계를 지우는 네이티브 윈도우 엔지니어링

진정한 데스크톱 생산성 소프트웨어는 운영체제(Windows OS)의 윈도우 매니저와 완벽하게 호흡해야 합니다. WinUI 3라는 최신 GUI 프레임워크에 안주하지 않고, Win32 레거시 오피스의 HWND 깊숙한 곳까지 파고들어 GA_ROOT 역추적과 DisplayArea 기하학 연산을 완성한 ZeliOffice.

이 정밀한 윈도우 스냅 도킹이야말로, ZeliDesk가 단순한 AI 래퍼가 아닌 대한민국 공공·교육·국방 현장에 최적화된 진정한 네이티브 OS 셸 플랫폼임을 증명합니다.

← 이전 기술 백서 #883 연구 보고서와 학술 논문 서식의 0초 자동화: ZeliOffice의 워드(Word) COM 인터롭 RCW 메모리 관리 및 표 스타일 파이프라인 아키텍처 다음 기술 백서 → #881 자연어 지시를 70종 오피스 Win32 COM 명령으로 완벽 번역: ZeliOffice의 AI Command Dispatcher 및 원자적 액션 실행 아키텍처
⚡ ZeliDesk 5:5 듀얼 스냅 스마트 오피스 체험하기

단일 모니터에서도 듀얼 모니터처럼 동작하는 0초 창 스냅과 올인원 오피스 자동화를 지금 경험하세요.

ZeliDesk Suite 무료 다운로드