저장된 파일을 불러와 조작하는 것이 아닌
이미 실행 중인 한글 파일을 조작하기 위해 여기저기 찾아보던 중
한글과 컴퓨터 공식 사이트에 아래와 같이 해결 방법이 나와 있었습니다.
https://forum.developer.hancom.com/t/topic/564
우선 제가 구현하고자 했던 것은
실행 중인 한글 프로그램에
간단한 텍스트를 입력하는 것이었습니다.
이 블로그는 제가 현재까지 해결했던 방법을 기록해 놓기 위함이며,
지나가시던 고수분께 조언을 얻기 위해 작성하는 블로그입니다.
최 종 코 드
import pythoncom
import win32com.client as win32
def get_running_hwp():
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
max_value = -1
result_moniker = None
for moniker in monikers:
name = moniker.GetDisplayName(context, moniker)
if name.startswith("!HwpObject"):
parts = name.split(".")
try:
number = int(parts[-1])
if number > max_value:
max_value = number
result_moniker = moniker
except ValueError:
continue
if result_moniker is not None:
hwp_object = running_coms.GetObject(result_moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
hwp = win32.Dispatch(hwp_dispatch)
return hwp
return None
hwp = get_running_hwp()
action = hwp.CreateAction("InsertText")
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", "111")
action.Execute(parameter_set)
과 정
먼저 한글에 간단한 텍스트를 입력하는 코드는 알고 있었습니다.
action = hwp.CreateAction("InsertText")
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", "111")
action.Execute(parameter_set)
한컴 디벨로퍼에 나온 코드 부분 중
아래 부분이 한글 2022 버전인 경우라는 것을 확인하였습니다.
if name == '!HwpObject.120.1':
하지만 제가 사용하는 것은 한글 2020이고
아래 댓글 중 어느분께서 한글2020을 사용하고 계시기에
!HwpObject.110.1
으로 변경하셨다고 작성하셔서 코드 작성
import pythoncom
import win32com.client as win32
def get_hwp_objects_and_insert_text():
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
for moniker in monikers:
name = moniker.GetDisplayName(context, moniker)
if name == "!HwpObject.110.1":
hwp_object = running_coms.GetObject(moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
hwp = win32.Dispatch(hwp_dispatch)
action = hwp.CreateAction("InsertText")
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", "111")
action.Execute(parameter_set)
get_hwp_objects_and_insert_text()
하지만 실행이 안되었습니다.
아래와 같이 코드를 작성하고 name을 모두 출력해 보았습니다.
import pythoncom
import win32com.client as win32
def get_hwp_objects_and_insert_text():
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
for moniker in monikers:
name = moniker.GetDisplayName(context, moniker)
print(name)
get_hwp_objects_and_insert_text()
결과는 다음과 같았습니다.
!HwpObject.110.59
!HwpObject.110.60
!HwpObject.110.2
!HwpObject.110.32
!HwpObject.110.74
!HwpObject.110.42
!HwpObject.110.81
!HwpObject.110.53
!HwpObject.110.23
!HwpObject.110.58
!HwpObject.110.61
!HwpObject.110.1
!HwpObject.110.31
!HwpObject.110.48
!HwpObject.110.73
!HwpObject.110.43
!HwpObject.110.52
!HwpObject.110.15
!HwpObject.110.62
!HwpObject.110.79
!HwpObject.110.30
!HwpObject.110.49
!HwpObject.110.9
!HwpObject.110.72
!HwpObject.110.39
!HwpObject.110.40
!HwpObject.110.55
!HwpObject.110.14
!HwpObject.110.86
!HwpObject.110.63
!HwpObject.110.24
!HwpObject.110.78
!HwpObject.110.37
!HwpObject.110.8
!HwpObject.110.71
!HwpObject.110.38
!HwpObject.110.41
!HwpObject.110.54
!HwpObject.110.17
!HwpObject.110.64
!HwpObject.110.25
!HwpObject.110.36
!HwpObject.110.7
!HwpObject.110.70
!HwpObject.110.46
!HwpObject.110.57
!HwpObject.110.16
!HwpObject.110.84
!HwpObject.110.65
!HwpObject.110.26
!HwpObject.110.35
!HwpObject.110.6
!HwpObject.110.47
!HwpObject.110.56
!HwpObject.110.11
!HwpObject.110.28
!HwpObject.110.85
!HwpObject.110.66
!HwpObject.110.27
!HwpObject.110.34
!HwpObject.110.5
!HwpObject.110.44
!HwpObject.110.77
!HwpObject.110.10
!HwpObject.110.29
!HwpObject.110.82
!HwpObject.110.67
!HwpObject.110.19
!HwpObject.110.20
!HwpObject.110.4
!HwpObject.110.45
!HwpObject.110.76
!HwpObject.110.13
!HwpObject.110.83
!HwpObject.110.51
!HwpObject.110.68
!HwpObject.110.18
!HwpObject.110.21
!HwpObject.110.3
!HwpObject.110.33
!HwpObject.110.75
!HwpObject.110.12
!HwpObject.110.80
!HwpObject.110.50
!HwpObject.110.69
!HwpObject.110.22
우선 한컴 디벨롭 문서의 내용으로 유추했을 때
이게 버전이 아닌가 생각하고
끝자리가 제일 큰 숫자를 찾았습니다.
※ 다시 확인해보니 버전이 아닌
한글이 제대로 종료되지 않고 백그라운드 프로세스에 남아있을 때
이런 현상이 발생하는 것 같습니다.
우선 저의 경우는
!HwpObject.110.86
이것을 대입해서 다시 코드 작성 후 프로그램 실행
import pythoncom
import win32com.client as win32
def get_hwp_objects_and_insert_text():
context = pythoncom.CreateBindCtx(0)
running_coms = pythoncom.GetRunningObjectTable()
monikers = running_coms.EnumRunning()
for moniker in monikers:
name = moniker.GetDisplayName(context, moniker)
if name == "!HwpObject.110.86":
hwp_object = running_coms.GetObject(moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
hwp = win32.Dispatch(hwp_dispatch)
action = hwp.CreateAction("InsertText")
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", "111")
action.Execute(parameter_set)
get_hwp_objects_and_insert_text()
실행 중인 한글 파일에 정상적으로
111이 입력이 되었습니다.
이후 몇 가지 확인을 거쳤습니다.
엑셀과 같은 것을 추가로 실행하고 name을 출력해 보니
한글프로그램만 !HwpObject로 시작한다는 것
그리고 끝자리 숫자는 정상적일 경우 1이지만,
비정상적인 한글프로그램 종료 등의 상황에서 끝자리가 바뀔 수 있다는 점을 고려
그래서 !HwpObject로 시작하고,
마지막 숫자가 제일 큰 것을 찾았습니다.
그리고 그것에 해당하는 moniker 값을 result_moniker 변수에 입력하였습니다.
max_value = -1
result_moniker = None
for moniker in monikers:
name = moniker.GetDisplayName(context, moniker)
if name.startswith("!HwpObject"):
parts = name.split(".")
try:
number = int(parts[-1])
if number > max_value:
max_value = number
result_moniker = moniker
except ValueError:
continue
그리고 result_moniker를 넘겨 hwp 객체 생성
if result_moniker is not None:
hwp_object = running_coms.GetObject(result_moniker)
hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
hwp = win32.Dispatch(hwp_dispatch)
return hwp
return None
호출 후 실행중인 한글 파일에 텍스트 입력
그리고 함수 이름도 적절하게 변경
hwp = get_running_hwp()
action = hwp.CreateAction("InsertText")
parameter_set = action.CreateSet()
parameter_set.SetItem("Text", "111")
action.Execute(parameter_set)
실 행 결 과
우선 텍스트를 입력하는 것은 정상적으로 작동이 되고
여러개의 한글 파일이 열려있는 경우
활성화 되어 있는 한글 파일에만 텍스트가 입력이 됩니다.
마 치 며
최종적인 결과만 적으니 간단히 해결한 것 같지만
기초지식이 부족하다보니 많은 시행착오가 있었습니다.
혹시 문제가 있거나 조언해주실 부분이 있으면 댓글 부탁드립니다.
여기를 방문하시면 더 많은 파이썬 관련 자료를 확인할 수 있습니다.
'파이썬(Python)' 카테고리의 다른 글
[ 파이썬 한글 자동화 ] 한글 문서의 위치 : GetPos(), SetPos() (0) | 2024.10.11 |
---|---|
[ 파이썬 한글 자동화 ] 한글 문서(Hwp) 안의 표 개수 확인하기 (0) | 2024.10.11 |
[ Tkinter ] 파이썬(Python) Tkinter에서 Treeview 정렬 기능 구현하기 : 헤더(제목) 클릭 시 오름차순/내림차순 정렬 (0) | 2024.10.08 |
[ Tkinter ] 파이썬(Python) Tkinter 달력에서 날짜 선택하기 : 달력 표시하기 Tkcalendar (0) | 2024.10.07 |
[ Basic ] 파이썬(Python) or 연산자로 값 할당하기 : If문 대신 or 연산자 사용하기 (0) | 2024.10.06 |