|
안녕하세요.
제가 질문을 신중하게 읽지 못해서 조금 실수를 하였네요.
일단, 키 이벤트가 3개가 있는데, 각각 한글을 처리할때 조금씩 틀립니다.
1. OnKeyDown
한글을 입력하면 VK_PROCESSKEY 라는 Key 값만 발생함
2. OnKeyPress
한글 한자를 모두 입력시에만 발생. 흔히 입력을 하는 도중의 상황을 Caret 이라고 표현을 하는데, 이 상태에서는 표현되지 않습니다.
3. OnKeyUp
한글 코드가 영문과 동일하게 키 값으로 바뀌어서 출력.
가장 간단한 방법은, KeyUp 등에서 한글모드일때, 전의 문자를 비교하는 방법입니다.
void __fastcall TForm1::Memo1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
unsigned char chChar;
if(Memo1->SelStart <= 0) return;
chChar = Memo1->Lines->Text[Memo1->SelStart];
if(chChar > 128) Label1->Caption = Memo1->Lines->Text.SubString(Memo1->SelStart - 1, 2);
else Label1->Caption = (char)chChar;
}
물론, 다른 방식으로 처리를 하는 방법도 있습니다. 후킹이나 메세지 처리를 하는 방법입니다.
어떤 작업을 하시려는지 알려주시면, 그에 가장 맞는 방법을 추천해 드리기가 더욱 쉬울것 같습니다.
홍석구 님이 쓰신 글 :
: 답변을 해주셔서 감사합니다.
: 그러면 Keypress 이벤트에서 파라미터로 넘어오는 char &Key 값은 무엇을 의미하는지요.
: 한글 입력 상태에서 메모 컴포넌트에서 "가"를 입력해서 Keypress 이벤트를 발생시키고
: 다시 "나"를 입력해서 Keypress 이벤트를 발생시키면
: 두글다 영문 'K' 한글 'ㅏ'가 마지막으로 입력되었는데 그러면 '가' 와 '나'를 구분할수 있는
: 방법은 없는지요.
:
: 제가 입력해서 확인해보니
: 한글모드에서 '가' 입력시 Key 값은 0xB0 (176)
: 한글모드에서 '나' 입력시 Key 값은 0xB3 (179)
: 영문모드에서 K 입력시 Key 값은 0x4B (75)
: 이렇게 Key값이 읽여집니다.
:
: 하지만 '가'라는 한글코드는 임프님이 쓰신것처럼 2Byte로 0xB0 0xA1
: '나' 는 '0xB3 0xAA 입니다.
:
: Keypress에서는 첫번째 바이트 값만 읽어오는데 2번째 바이트 값을 읽을 방법은 없는건지요.
:
: 개발환경
: Windows XP
: C++Builder 5.0 Enterprise
: Memo 컴포넌트 설정값
: Font Charset HANGEUL_CHARSET
: imeMode imDontCare
: imeName 한국어 입력 시스템(IME 2000)
:
: 방법을 알고 있으시면 꼭 답변 부탁드립니다.
: 감사합니다.
:
:
: 유영인.Chris 님이 쓰신 글 :
: : 한글 코드가 꼭 따로 아스키 코드로 있는것은 아닙니다. 예를 들어, '하' 의 경우, KeyPress 가 2번 작동되겠지만, '늘' 의 경우에는 3번 작동됩니다.
: :
: : 따라서, 석구님께서 말씀하신대로 한글 코드가 2Byte 인것과는 KeyPress와는 상관이 없습니다. KeyPress에서는 눌려진 키 값을 반환해 줍니다. 이것은 편하게 그냥 키보드의 위치 값과 똑같다고 생각하시면 됩니다.
: :
: : 따라서, 'a' 와 'ㅁ' 의 경우 똑같은 아스키 값을 넘겨주게 됩니다. 다른 처리를 원하신다면, 한글 상태인지 영문 상태인지 알아본 다음, 처리를 따로 해주셔야 합니다
: :
: : 한글 영문 상태를 강제로 치환하는 방법은, 아래와 같이 처리하시면 됩니다.
: :
: :
: : HIMC hiMode = ImmGetContext(Application->Handle);
: :
: : // 영문 자판
: : ImmSetConversionStatus(hiMode, IME_CMODE_ALPHANUMERIC, IME_CMODE_ALPHANUMERIC);
: : // 한글 자판
: : ImmSetConversionStatus(hiMode, IME_CMODE_HANGEUL, IME_CMODE_HANGEUL);
: :
: :
: :
: :
: :
: : 홍석구 님이 쓰신 글 :
: : : memo 컴포넌트에서 keypress 이벤트 등록했습니다.
: : : char로 넘어오는 키값을 한글에 대해서 읽을수 있나요.
: : : Q&A 찾아보고 Tip'N Tricks을 찾아봐도 keypress 이벤트에서
: : : 한글코드를 읽어오는 것은 못찾겠습니다.
: : : Tip'N Tricks에 임프님이 쓴글도 char [] 배열에 한글코드가 들어가 있는
: : : 데서 시작해서 sendmessage 하는 것인데 한글코드 자체를 읽어오지 못하니
: : :
: : : 아시는 분있으시면 꼭 답변 부탁합니다.
: : : c++builder 5.0
: : : windows xp 에서 개발하고 있습니다.
: : :
: : : void __fastcall TForm1::memoKeyKeyPress(TObject *Sender, char &Key)
: : : {
: : : // Key 영문에 대해서는 작동하지만 한글코드는 알아내지 못하고 있습니다.
: : : // 한글코드는 2byte인데 파라미터는 char로 넘어옵니다.
: : : // 해결방법을 아시는 분이 계십니까
: : : }
: : :
: : : 감사합니다.
|