오토메이션 복사/붙여넣기를 변수활용 가능한가요?

안녕하세요?
c#으로 아래한글 오토메이션 하고 있습니다.

한글의 문서 1에서 일부 내용을 복사해서
새 탭을 열어서 문서 2에 붙여넣기 하고 있습니다.

단순하게 블럭 설정 후
hwp.Run(“Copy”);

새 문서 탭에서
hwp.Run(“Paste”);

해서 붙여넣기 하고 있습니다. 큰 문제는 없었는데…

오토메이션으로 오래걸리는 작업을 하는동안
윈도우에서 다른 작업을 할때 복사/붙여넣기를 하다보면 저도모르게 Ctrl-C, Ctrl-V 사용하다보니
아래한글에서 복사된 내용이 붙여넣기 되어서요

복사/붙여넣기가 윈도우의 공용 메모리를 사용하는것 같은데
hwp.Run(“Copy”);
hwp.Run(“Paste”);
대신에
변수에 저장해서 읽고 쓰고 할수 있는 방법이 있을까요?
stream 을 이용한다던지…

조언 주시면 고맙겠습니다.
감사합니다.

1개의 좋아요

안녕하세요.

클립보드 메모리를 사용하지 않고 선택한 영역의 데이터를 가져오고, 지정할 수 있는 API가 있습니다.

Object data = hwp.GetTextFile("HWP", "savablock");
...
hwp.SetTextFile(data, "HWP", "insertfile");

감사합니다.

1개의 좋아요

감사합니다… 원하는대로 잘 되는거 같아요
바로 답변 주셨는데 다른거 한다고 확인을 늦게 했네요

감사합니다.

2개의 좋아요

일반적인 상황에서는 잘 됐었는데요
선택 영역 이전에 조판부호가 있을때 선택영역 이전의 조판부호가 같이 복사가 됩니다

image

위 그림처럼 첫줄에 조판부호가 있을때
분명히 두번째 줄 시작부터 선택되어 있는데
변수를 활용하여 복사/붙여넣기 했을때는

image
위 그림처럼 윗줄의 조판부호까지 같이 복사가 되는데 뭐가 문제일까요?

코드는 아래와 같습니다.

 hwp.Run("MoveDocBegin");
 hwp.Run("MoveDown");
 hwp.Run("Select");
 hwp.Run("MoveDocEnd");
 MessageBox.Show("선택 영역 확인");
 object block = hwp.GetTextFile("HWP", "savablock");

 hwp.Run("FileNewTab");
 hwp.SetTextFile(block, "HWP", "insertfile");

같은 영역을
hwp.Run(“Copy”);
hwp.Run(“Paste”);
를 이용했을때는 정상적으로 선택된 영역만 복사가 되네요

일단 메뉴얼에 나와 있는대로
BlockSave 와 InsertFilet을 이용해서 처리하니까 설정한 블럭만 정확히 저장/붙여넣기 되네요 ^^;

코드는

/// 블럭 저장
string tempfile = @"C:\Temp\hwptempfile.hwp";
hwp.HAction.GetDefault("FileSaveBlock_S", hwp.HParameterSet.HFileOpenSave.HSet);
hwp.HParameterSet.HFileOpenSave.FileName = filename;
hwp.HParameterSet.HFileOpenSave.Format = "HWP";
hwp.HParameterSet.HFileOpenSave.Attributes = 1;
hwp.HAction.Execute("FileSaveBlock_S", hwp.HParameterSet.HFileOpenSave.HSet);

/// 새 탭 열기
hwp.Run("FileNewTab");

/// 끼워넣기
hwp.HAction.GetDefault("InsertFile", hwp.HParameterSet.HInsertFile.HSet);
var option = hwp.HParameterSet.HInsertFile;
option.Filename = tempfile;     // 끼워넣을 파일 이름
option.KeepCharshape = 1;   // 글자모양 유지
option.KeepParashape = 0;   // 문단모양 유지
option.KeepStyle = 0;       // 스타일 유지
option.KeepSection = 0;     // 쪽 모양 유지         
hwp.HAction.Execute("InsertFile", hwp.HParameterSet.HInsertFile.HSet); // 설정 옵션으로 실제 파일 끼워넣기 실행

원래 원했던거는 디스크를 읽고 쓰지 않고 메모리에서만 읽고 쓰기 위했던거였는데…
copy/paste 는 윈도우 공용 메모리를 사용하다보니 다른 윈도우 응용프로그램과의 문제가 있어서
변경하였는데 GetTextFile/SetTextFile도 내부적으로는 디스크에 저장/불러오기 방식인듯 하여
애매하긴 하네요…

제가 처음에 생각했던 방식은 이런 개념이었는데요

        // 문자열을 바이트 배열로 변환
        byte[] byteArray = Encoding.UTF8.GetBytes(data);

        // MemoryStream 생성 및 데이터 쓰기
        using (MemoryStream stream = new MemoryStream())
        {
            // 데이터를 MemoryStream에 쓰기
            stream.Write(byteArray, 0, byteArray.Length);

            // 스트림의 위치를 처음으로 설정
            stream.Seek(0, SeekOrigin.Begin);

            // MemoryStream에서 데이터 읽기
            byte[] readBuffer = new byte[byteArray.Length];
            stream.Read(readBuffer, 0, readBuffer.Length);

            // 읽은 데이터를 문자열로 변환
            string readData = Encoding.UTF8.GetString(readBuffer);
            Console.WriteLine("읽은 데이터: " + readData);
        }

이런식으로 가능할까요?

1개의 좋아요

네. 말씀하신대로 GetTextFile/SetTextFile도 내부 구현은
디스크 IO를 사용하는 방식을 사용하고 있습니다.

현재는 디스크 IO를 사용하지 않고 메모리 버퍼로만 데이터를 주고 받는 API는 없습니다. :sob:

감사합니다.

1개의 좋아요