한/영 자동 전환 프로그램 (iDwgTab)

Auto CAD/Tip|2023. 5. 14. 19:59

LEE 리습 2024A5버전부터 한영전환 지원추가

파이썬 업데이트이후 딜레이없이 전환이 가능하여 프로그램에 추가함

@options에서 On/Off 적용 가능

https://leelisp.tistory.com/entry/Options

 

 

현재 한/영자동 전환은 iDwgTab에서 가능합니다 (최신버전 유료)

(오토테스크 앱스토어 : Express Document Tab으로 등록되어 있습니다.

- 한/영 자동전환외 여러가지 기능을 포함하고 있습니다.

- DT_HIDE : 탭의 UI는 보이지 않게 되지만 기능은 그대로 사용이 가능합니다.
- DT_SHOW : 탭의 UI가 보이게 변경합니다.
- DT_LKD : 작업 도면을 수정하지 못하게 변경합니다. (패스워드 설정)
- DT_ULD : 작업이 가능하도록 도면을 원래 상태로 변경합니다. (패스워드 입력)

 

 

apps.autodesk.com/ACD/ko/Detail/Index?id=6897317942183966705&appLang=en&os=Win32_64

 

Express Document Tab

The Express Document Tab program is a utility program that makes it easy to switch between DWG drawings in Autodesk® AutoCAD®.

apps.autodesk.com

 

네이버 카페

cafe.naver.com/idwgtab.cafe

 

iDwgTab 카페 : 네이버 카페

iDwgTab의 기능을 설명하고 사용법을 공유하는 카페입니다 (이글루스에서 이사중입니다.)

cafe.naver.com

홈페이지

arx119.egloos.com/tag/idwgtab

 

ARX119의 BIM/CAD 연구소

AEC분야의 자동화 설계 도구 소식과 자체 개발한 응용프로그램들을 소개하는 블로그 입니다.

arx119.egloos.com

 

리습으로 한/영 전환하기 

ime상태를 직접확인하는 소스를 검색중입니다

 

BOOL ImmGetConversionStatus(
                  HIMC    unnamedParam1,
  [out, optional] LPDWORD lpfdwConversion,
  [out, optional] LPDWORD lpfdwSentence
);

C++


1. 한글모드로 전환하는 방법

[code]
void CHanengClass::SetHanMode(HWND hWnd)
{
    HIMC hIMC = ImmGetContext(hWnd);
    DWORD dwConv, dwSent;
    DWORD dwTemp;

    ImmGetConversionStatus(hIMC,&dwConv,&dwSent);

    dwTemp = dwConv & ~IME_CMODE_LANGUAGE;
    dwTemp |= IME_CMODE_NATIVE;
    dwConv = dwTemp;
         ImmSetConversionStatus(hIMC,dwConv,dwSent);
    ImmReleaseContext(hWnd,hIMC);
}[/code]

2. 영문모드로 전환하는 방법
[code]
void CHanengClass::SetEngMode(HWND hWnd)
{
    HIMC hIMC = ImmGetContext(hWnd);
    DWORD dwConv, dwSent;
    DWORD dwTemp;

    ImmGetConversionStatus(hIMC,&dwConv,&dwSent);

    dwTemp = dwConv & ~IME_CMODE_LANGUAGE;
    dwTemp |= IME_CMODE_ALPHANUMERIC;
    dwConv = dwTemp;
         ImmSetConversionStatus(hIMC,dwConv,dwSent);

         ImmReleaseContext(hWnd,hIMC);
}
[/code]


//  한영 자동 변환
#define IME_HANMODE   1              // 한글 모드로 전환
#define IME_ENGMODE   2              // 영문 모드로 전환

 

//  한영 변환 함수
void __fastcall ImeChangeMode(HWND Handle, int iMode)
{
    HIMC            hIMC;
    unsigned long   Conversion, Sentense;

    hIMC = ImmGetContext(Handle);
    ImmGetConversionStatus(hIMC, &Conversion, &Sentense);

    switch(iMode)   {
        case IME_HANMODE    :   Conversion = IME_CMODE_NATIVE;          break;
        case IME_ENGMODE    :   Conversion = IME_CMODE_ALPHANUMERIC;    break;
    }

    ImmSetConversionStatus(hIMC, Conversion, Sentense);
}

 

//  사용

void __fastcall TCardDetailDlg::EdtChangeHanClick(TObject *Sender)
{
    ImeChangeMode(Handle, IME_HANMODE);
}

 

 

------------------------------------------------

아래코드는 한/영 전환을 키보드를 눌러서 변환한 카운터로 확인하는 코드로 확인됩니다

 

한/영자동 전환 문의가 많아 리습으로 만들다 보니 2가지 문제점 있어 중단하면서 기록을 남깁니다.

현재 windows10환경에서 한글ime는 실행되는 프로그램별로 한영전환이 되는것으로 확인

각종 프로그램별 한영전환 (win32api 활용)

C# --------------------------------------------------------------------------------------

[DllImport("user32.dll)]

public static extern void Keybd_event(byte vk, byte scan, int flags, ref int extrainfo);

 

※ ex)

const byte AltKey = 18;

const int KEYUP = 0x0002;

int Info=0;

keybd_event(AltKey, 0, 0, ref Info); // ALT key 다운

keybd_event(AltKey, 0, KEYUP, ref Info); // ALT key 업


#include <stdio.h>

#include <windows.h> //keybo_event() 함수 사용을 위해

#pragma warning(disable:4996)//비쥬얼 스튜디오 2013 scanf 사용시 오류 막음

int KEYINPUT();

void main(){

 char a[128];

 

 printf("English : ");

 scanf("%s", a);

 printf("%s\n\n", a);

 KEYINPUT(); //한영키 자동 누름 함수 호출

 printf("한글 :");

 scanf("%s", a);

 printf("%s\n\n", a);

}

 

//한영키 자동 변환

int KEYINPUT(){

 keybd_event(VK_HANGEUL, 0, 0, 0);//누름

 keybd_event(VK_HANGEUL, 0, KEYEVENTF_KEYUP, 0);// 누름 해제

 return 0;

 

 

// C++ 코드 --------------------------------------------------------------------------------------

void __fastcall ToggleHanMode(void)

{

    unsigned long Conversion, Sentence;

    HIMC Mode = ImmGetContext(Application->Handle);

    ImmGetConversionStatus(Mode, &Conversion, &Sentence);

    if (Conversion == IME_CMODE_HANGEUL)

        ImmSetConversionStatus(Mode, IME_CMODE_ALPHANUMERIC, IME_CMODE_ALPHANUME

RIC);

    else

        ImmSetConversionStatus(Mode, IME_CMODE_HANGEUL, IME_CMODE_HANGEUL);

}



// 델파이 코드 --------------------------------------------------------------------------------------

procedure ToggleHanMode;

var

  Mode: HIMC;

  Conversion, Sentence: dword;

begin

  Mode := ImmGetContext(Application.Handle);

  ImmGetConversionStatus(Mode, Conversion, Sentence);

  if Conversion = IME_CMODE_ALPHANUMERIC then

    ImmSetConversionStatus(Mode, IME_CMODE_HANGEUL, IME_SMODE_NONE)

  else

    ImmSetConversionStatus(Mode, IME_CMODE_ALPHANUMERIC, IME_SMODE_NONE);

end;

 

 

//VBA --------------------------------------------------------------------------------------

‘키보드 상태확인을 위한 선언하기

Private Declare Function GetAsyncKeyState Lib “user32” (ByVal vKey As Long) As Integer

 

‘키입력을 위한 선언하기

Const KEYEVENTF_EXTENDKEY = &H1

Const KEYEVENTF_KEYUP = &H2

Private Declare Sub keybd_event Lib “user32.dll” (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

 

‘시간지연(슬립)을 위한 선언하기

Public Declare Sub Sleep Lib “kernel32.dll” (ByVal dwMilliseconds As Long)

 

Sub Macro1()

‘ Macro1 Macro

‘ 바로 가기 키: Ctrl+k

 

‘ A를 입력하고 엔터를 누른다.

Sleep (1000)

Call typeA

Call typeEnter

 

‘해당 값을 기억후, 삭제한다.

Dim tmpVal

tmpVal = ActiveCell.Offset(-1, 0).Value

 

ActiveCell.Offset(-1, 0).Select

Call typeDelete

 

‘결과 표시

If tmpVal = “ㅁ” Then

    Call changeHangul

    MsgBox (“영문으로 전환되었습니다.”)

Else

    MsgBox (“이미 영문 상태입니다.”)

End If

 

End Sub

 

//Python --------------------------------------------------------------------------------------

import ctypes

import time

from ctypes import wintypes

wintypes.ULONG_PTR = wintypes.WPARAM

hllDll = ctypes.WinDLL ("User32.dll"use_last_error=True)

VK_HANGUEL = 0x15

 

class MOUSEINPUT(ctypes.Structure):

    _fields_ = (("dx",          wintypes.LONG),

                ("dy",          wintypes.LONG),

                ("mouseData",   wintypes.DWORD),

                ("dwFlags",     wintypes.DWORD),

                ("time",        wintypes.DWORD),

                ("dwExtraInfo"wintypes.ULONG_PTR))

 

class HARDWAREINPUT(ctypes.Structure):

    _fields_ = (("uMsg",    wintypes.DWORD),

                ("wParamL"wintypes.WORD),

                ("wParamH"wintypes.WORD))

 

class KEYBDINPUT(ctypes.Structure):

    _fields_ = (("wVk",         wintypes.WORD),

                ("wScan",       wintypes.WORD),

                ("dwFlags",     wintypes.DWORD),

                ("time",        wintypes.DWORD),

                ("dwExtraInfo"wintypes.ULONG_PTR))

 

class INPUT(ctypes.Structure):

    class _INPUT(ctypes.Union):

        _fields_ = (("ki"KEYBDINPUT),

                    ("mi"MOUSEINPUT),

                    ("hi"HARDWAREINPUT))

    _anonymous_ = ("_input",)

    _fields_ = (("type",   wintypes.DWORD),

                ("_input"_INPUT))

 

def get_hanguel_state():

    return hllDll.GetKeyState(VK_HANGUEL)

 

def change_state():

    x = INPUT(type=1 ,ki=KEYBDINPUT(wVk=VK_HANGUEL))

    y = INPUT(type=1ki=KEYBDINPUT(wVk=VK_HANGUEL,dwFlags=2))

    hllDll.SendInput(1ctypes.byref(x), ctypes.sizeof(x))

    time.sleep(0.02)

    hllDll.SendInput(1ctypes.byref(y), ctypes.sizeof(y))

 

 

인터넷 검색결과 대부분 한/영전환이 win32api에 키이벤트를 전송해서 전환을 합니다.

리습에서 진행이 가능한지 검색해보면

 

www.cadtutor.net/forum/topic/36400-wanted-vb-code-to-vlisp-migration/

(vl-load-com)

(defun ChangeLanguage (lang / shell)

(setq shell (vlax-get-or-create-object "WScript.Shell"))

(vlax-invoke shell "run" (strcat "rundll32.exe user32.dll, LoadKeyboardLayout " lang " 1") ) (vlax-release-object shell) )

(defun C:Persian () (ChangeLanguage "00000429") )

(defun C:English () (ChangeLanguage "00000409") )

 

www.theswamp.org/index.php?topic=38606.0

(setq shell (vlax-create-object "WScript.Shell"))
;Lock workStation
(vlax-invoke shell "run" "rundll32.exe user32.dll,LockWorkStation")
;Mouse propreties
(vlax-invoke shell  "run" "rundll32.exe shell32.dll,Control_RunDLL main.cpl @0")
;system propreties
(vlax-invoke shell  "run" "rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2")
;New network connection drive
(vlax-invoke shell  "run" "rundll32.exe user.dll,wnetconnectdialog")
;XP=(vlax-invoke shell  "run" "RunDll32.exe shell32.dll,SHHelpShortcuts_RunDLL Connect")
;Graphic propreties
(vlax-invoke shell  "run" "RUNDLL32.EXE SHELL32.DLL,Control_RunDLL desk.cpl,,0")
;Printer options
(vlax-invoke shell  "run" "RUNDLL32 PRINTUI.DLL,PrintUIEntry /?")
;System info
(vlax-invoke shell  "run" "rundll32.exe shell32.dll,ShellAboutA Info-Box" )
;Time date panel
(vlax-invoke shell  "run" "RUNDLL32 SHELL32.DLL,Control_RunDLL TIMEDATE.CPL,@0,1")
;Funny thing..
(vlax-invoke shell  "run" "RUNDLL32.EXE USER32.DLL,SwapMouseButton")

 

리습으로도 USER32.DLL를 사용할수는 있었지만 한/영전환하려면 

(vlax-invoke shell "run" "RUNDLL32.EXE USER32.DLL,keybd_event (VK_HANGUL, 0, 0 , 0 ), Sleep(1), keybd_event(VK_HANGUL, 0 ,KEYEVENTF_KEYUP, 0)")이런식으로 키이벤트를 발생시켜야 되고

VK_HANGUL에 0x15 (16진수)입력되야 하는데  16진수 입력방법을 모릅니다. 

 

외부프로그램으로 우선 파이썬으로 테스트로 해보니 한영전환은 가능했습니다.

하지만 외부프로그램으로 인해 속도가 느렸습니다. (CAD->-파이썬->CAD->한/영전환)

CAD에서 지원하는 프로그램으로 작성하면 빠르게 될듯(닷넷)

 

캐드 명령어 종료시 한/영전환 확인

한/영 자동전환은 캐드명령어 종료후 키보드상태가 한글이면 전환이 이루워 집니다.

리습 명령들은 한/영전환이 바로적용 가능하지만 CAD 자체 명령어(text,mtext)에 대해 일방적인 방식은 힘들고

리액터를 이용하면 가능한것으로 테스트됨

현재까지 순수 리습으로 한/영전환은 불가능, 닷넷등으로 가능하다

결론은 순수 리습으론 한/영전환이 현재는 불가능하고

win32api이 사용가능한 닷넷등으로 한/영전환 가능한것으로 정리합니다

댓글()