찾아 바꾸기 여쭙니다.

안녕하세요.
c#으로 프로그래밍하구요.
한글을 컨트롤 하는 재미가 쏠쏠합니다.
업무적으로 잘 이용하고 있기도 하구요.

이번에는 찾아 바꾸기를 하려고 합니다. 예를 들어 ‘(’ 와 ')'를 다 제거하고 싶을 때
ActionObject.hwp를 잠고해 보아도 잘 안 되어서
할 수 없이 단순 무식하게 SendKeys명령을 조합해서 하고 있는데,
원하는 대로 실행은 됩니다.
그렇지만 일일이 코딩하는 게 비효율적인데, 바로 변환할 수 있는 건 없는지요?

부끄럽지만 현재 제 코드는 이렇습니다. 텍스트에 범위 블록 지정한 상태이구요.

//찾아 바꾸기 창 열기
ExecuteHwpCommands(hwp, "ReplaceDlg");// 괄호 '(' 찾아 바꾸기

// 찾아 바꾸기 창에 괄호 넣기
string unicode3 = "\u0028";    // '' 입력
SendKeys.SendWait("{" + unicode3 + "}");

SendKeys.SendWait("{Tab}{Tab}"); // 탭하기, 바꿀 내용 입력창으로 포커스 옮김 
                 
SendKeys.SendWait("{DEL}"); // 내용 지우기

SendKeys.SendWait("{Tab}"); // 탭하기

//모두 바꾸기
SendKeys.SendWait(“+A”);

SendKeys.SendWait(“{ESC}{ESC}”); // 블록 밖에서도 찾으시겠습니까? 창 닫기 찾아 바꾸기 창 닫기

Thread.Sleep(100); // 100ms 대기

//찾아 바꾸기 창 열기
ExecuteHwpCommands(hwp, "ReplaceDlg");// 괄호 ')' 찾아 바꾸기

// 찾아 바꾸기 창에 괄호 넣기
string unicode4 = "\u0029";    // ')' 입력
SendKeys.SendWait("{" + unicode4 + "}");

SendKeys.SendWait("{Tab}{Tab}"); // 탭하기                   

SendKeys.SendWait("{DEL}"); // 지우기

SendKeys.SendWait("{Tab}"); // 탭하기

//모두 바꾸기
SendKeys.SendWait("+A");

SendKeys.SendWait(“{ESC}{ESC}{ESC}”); // 블록 밖에서도 찾으시겠습니까? 창 닫기 찾아 바꾸기 창 닫기 복사 해제

이 범주에서는 한글 오토메이션에 대한 다른 사용자의 기술 지원을 제공받을 수 있습니다.

  1. 한글 오토메이션의 API 사용/연동은 개발 가이드를 참조하세요.
  2. 일반 문의는 한글과컴퓨터 웹사이트의 고객 지원을 이용하세요.
  3. 개인정보가 포함되지 않도록 유의하세요. 게시글 또는 댓글에 개인정보가 포함된 내용이 있을 경우 게시물이 숨김처리 될 수 있습니다.
1개의 좋아요

편법이지만、 폼에 richTextBox를 보이지 않게 추가하고,
거기에 모두 복사해 넣은 다음
문자식으로 처리하니까 깔끔하고 빠르게 해결이 되네요.
if문으로 다양하게 옵션도 줄 수 있어서
훨씬 좋은 것 같습니다.

1개의 좋아요

스크립트매크로 방식으로 AllReplace 실행하는 방법을 찾으시는 것 같았는데, 좋은 방법 찾아서 쓰고 계시니 다행입니다.

참고로 모두 찾아바꾸기는 아래처럼 코딩하시면 됩니다.

녹화_2024_10_06_01_31_13_763

pset = hwp.HParameterSet.HFindReplace
for i in ["(", ")"]:
    hwp.HAction.GetDefault("AllReplace", pset.HSet)
    pset.Direction = hwp.FindDir("AllDoc")
    pset.FindString = i
    pset.ReplaceString = ""
    pset.IgnoreMessage = 1
    hwp.HAction.Execute("AllReplace", pset.HSet)
2개의 좋아요

앗. AllReplace 명령이 바로 가능하군요.
방식도 훨씬 깔끔하구요.
감사합니다.
딱 제가 원하던 해법이었습니다.^^

1개의 좋아요

하나만 더 여쭤봐도 될지요?

저는 c#에 익숙해서 c#으로 위의 코드를 구현했더니,
잘 실행이 되었습니다.
그런데 전체 문서가 아니라,
범위를 지정한 경우에는 어떻게 해야 할지 모르겠습니다.
그리고 AllDoc라는 말은 어디에서 참조할 수 있는지요?
ActionObject라는 문서에도 없어서 여쭙니다.

즐거운 한 주 되세요.

// HWP에서 Find & Replace를 사용하여 괄호 제거
var pset = hwp.HParameterSet.HFindReplace;

// 제거할 괄호 리스트
string parenthesesToRemove = { “(”, “)” };

// 모든 괄호 제거
foreach (var paren in parenthesesToRemove)
{
// “AllReplace” 액션의 기본 설정 가져오기
hwp.HAction.GetDefault(“AllReplace”, pset.HSet);

// 모든 문서에서 찾기
pset.Direction = hwp.FindDir("AllDoc");
pset.FindString = paren;  // 현재 괄호를 찾기 위한 문자열 설정
pset.ReplaceString = "";   // 찾은 문자열을 빈 문자열로 교체
pset.IgnoreMessage = 1;    // 메시지 무시 설정

// 액션 실행
hwp.HAction.Execute("AllReplace", pset.HSet);

}

1개의 좋아요

1. 선택 범위에서만 바꾸기

위 코드가 선택범위를 무시하는 이유는 pset.IgnoreMessage를 1로 설정했기 때문입니다.
(IgnoreMessage가 1인 경우에는 블록 밖까지 바꿀지 묻는 팝업에 자동으로 확인을 눌러버립니다.)

선택범위만 바꾸고 싶은 경우에는 IgnoreMessage = 0으로 바꾸고, SetMessageBoxMode를 별도로 설정하는 방식으로 코드를 짜시면 됩니다.

공식문서 HwpCtrl API 중 SetMessageBoxMode를 참고하시면,
[Yes/No] 형태의 팝업에 No를 자동선택하려면
0x20000으로 설정하면 된다고 나와 있습니다.

위 정보를 참고하여 코드를 작성해보면,

녹화_2024_10_06_23_21_15_217

pset = hwp.HParameterSet.HFindReplace
hwp.SetMessageBoxMode(0x20000)
for i in ["(", ")"]:
    hwp.HAction.GetDefault("AllReplace", pset.HSet)
    pset.Direction = hwp.FindDir("AllDoc")
    pset.FindString = i
    pset.ReplaceString = ""
    pset.IgnoreMessage = 0
    hwp.HAction.Execute("AllReplace", pset.HSet)
hwp.SetMessageBoxMode(0xF0000)

2. AllDoc이라는 문자열은 어디서?

이 부분은 별도의 문서가 만들어져 있지는 않습니다.
하지만, 원하는 동작의 스크립트 매크로 녹화를 해보시면
해당 정수 옵션값을 알려주는데요.
친절하게 함수로 설정이 되어 있어 의미파악이 쉽습니다.

예를 들어 hwp.FindDir()은 찾기방향의 설정값을 리턴하는 함수인데
"Forward", "Backward", "AllDoc" 문자열을 넣으면 각각 정수로
0, 1, 2를 리턴합니다.
코드를 매번 재사용하는 우리 유저들 입장에서는 고마운 기능이죠.
2를 "문서 전체"라고 외우기는 쉽지 않으니까요.

1개의 좋아요

아아. 님은 정말 단비와 같은 분이십니다.^^

1개의 좋아요