안녕하세요
문의사항이 자주 생겨 자주 글을 쓰네요 ^^ ;
다름이 아니라 C++을 이용해서 오토메이션 중인데 한글 객체 하나에 Document를 여러개 생성하여 MDI로 사용하고 있습니다.
그런데 이전에 포커스 문제 때문에 SetActive_XHwpDocument를 사용하지 말라는 가이드를 받아서 SetActive_XHwpDocument를 사용하지 않는 방향으로 개발을 진행하고 있습니다.
Document에 직접적으로 호출하는 api 외에 HwpObject api를 호출해야하는 경우(예를 들어 GetTextFile) SetActive_XHwpDocument를 하지 않으면 Document가 꼬여버리는 문제가 생겨버립니다.
SetActive_XHwpDocument를 한번 호출하면 다른 프로그램에서 계속 포커스를 뺏겨 문제가 발생해서 안쓰고 싶은데 어떤식으로 개발하면 좋을지 모르겠습니다.
좋은 방법이 있는지 문의드립니다.
항상 노고 감사드려요!
안녕하세요.
한글 오토메이션은 MDI 방식을 고려하지 않아서 멀티 도큐먼트 구조로 창을 만들면 포커스 문제가 발생할 수 있을 것 같습니다.
한글 오토메이션 기능 실행 후 포커스를 내부적으로 관리하는 ActiveDocument로 포커스를 이동시키는 동작 포함되어 있어서 외부에서 관리하는 Document와 Active 상태를 일치시키지 않으면 포커스 문제가 발생할 수 있을 것 같습니다.
(모든 기능, API은 아님) 
도움 드리지 못해 죄송합니다.
감사합니다.
답변 감사합니다.
혹시 HwpObject api 호출 시 SetActive_XHwpDocument 함수 외에 어떤 Document에 적용할 건지 지정하는 함수가 있을까요?
HwpObject
┗ XHwpDocuments
┗ XHwpDocument
┗ XHwpRange
┗ XHwpSelection
┗ ...
XHwpDocuments 컨테이너 개체에서 docid(int 타입)로 HwpDocument 받아올 수 있는데요.
XHwpDocument에서 제공하는 API는 HwpObject에서 제공하는 유틸리티 함수보다 적어 문서 핸들링이 쉽지는 않을 것 같습니다.
그리고 한글 오토메이션은 스레드 세이프(Thread Safe)하지 않기 때문에 스레드에서 멀티 도큐먼트 핸들링을 할 경우에 문제가 발생할 소지도 있습니다. 
1개의 좋아요
위에 기술해주신 것처럼 MDI에서는 Document에 SetActive를 해주지 않으면 정상 동작하지 않는 모습을 확인했습니다.
그래서 SetActive를 안 쓸 수는 없을 것 같고,
SetActive 다음에 Window의 핸들을 얻어서 KillFocus와 InActive를 SendMessage로 날려주는데
이게 먹히는 것 같지 않은데 한번 확인 부탁드려도 될까요?
테스트 방법은
문서 2개를 열면서 메모장에 타이핑을 하는데 InActive시 메모장에 커서가 돌아오는지 확인하는 방법으로 진행했습니다.
1개의 좋아요
추가 질문 드려요
HwpObj 밑으로 XHwpDocument 가 두개있는 상태에서
SetActive_XHwpDocument를 하지 않을 경우 마지막으로 작업한 Document가 Active가 되어 동작이 진행될 것 같은데 그렇지만도 않은것 같습니다.
Document가 여러개 일경우 항상 SetActive_XHwpDocument를 하고 HwpObj의 Api를 호출해야 할까요?
1개의 좋아요
여러 문서가 있을 경우에 핸들링하고자 하는 문서가 있으면 명시적으로 액티브시킨 후에
API를 호출하는 것이 안정적입니다.
그렇지 않은 것 같다고 하셨는데요.
혹시 클라이언트에서 Automation API를 Active를 했지만,
서버(한글)에서 직접 UI로 문서 Active가 바뀌는 경우는 없는지 확인해 보실 필요는 있을 것 같습니다.
1개의 좋아요