C#의 빈 양식에 중국어 입력
키워드: PS와 같은 텍스트 도구, 중국어 입력 반복
최근 PS와 같은 텍스트 도구를 만들기 위해 연구하고 많은 정보를 확인하고 많은 사람들에게 물어봤습니다. 마침내 노력이 결실을 맺었습니다. 모두가 토론할 수 있도록 작성하세요.
빈 양식에서 입력 방법을 엽니다. 무슨 일이 있어도 입력 방법을 열 수 없습니다. this.ImeMode= ImeMode.NoControl 을 설정해도 입력 방법 기록 창이 열리지 않습니다. Microsoft 개발 포럼에 가서 질문을 해주신 Zhou Xuefeng 님께 감사드립니다. Riquel_Dong은 API를 사용했습니다. 함수: ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); 마지막으로 입력 방법이 호출되어 지정된 창에 연결됩니다.
코드는 다음과 같습니다.
f (m.Msg == WM_IME_SETCONTEXT && m .WParam.ToInt32() == 1)
{
ImmAssociateContext(this.Handle, m_hImc)
}
이제 입력 방법을 호출할 수 있지만 입력 방법 기록 창에서 단어를 가져오는 방법에 대한 새로운 문제가 발생했습니다.
텍스트를 입력할 때 입력 방법을 켜면 WM_IME_CHAR 메시지가 전송됩니다.
ImmGetCompositionString(IntPtr hIMC, int dwIndex, StringBuilder lpBuf, int dwBufLen)을 사용하여 중국어 문자 또는 NUICODE 유형을 얻을 수 있습니다. 물론 여기서는 한자에 대해서만 다루지는 않습니다.
문자 추출은 다음과 같습니다:
case WM_IME_CHAR:
size += sizeof(Char);
ImmGetCompositionString( m_hImc, GCS_RESULTSTR, str, size);
sb.Append(str.ToString());
MessageBox.Show(str.ToString());
intoText();// 텍스트 인쇄
>
알겠습니다. 테스트한 결과 인쇄된 단어가 모두 반복되는 단어인 것으로 나타났습니다. People", 출력되는 것은 "Serve the People"입니다. 맙소사, 문제가 있습니다. 어디에 있습니까?
MSDN을 확인했습니다. WM_IME_CHAR에 대한 설명은 다음과 같습니다.
WM_IME_CHAR 메시지에는 2바이트 문자가 포함되어 있으며 애플리케이션은 이 메시지를 DefWindowProc에 전달합니다
이게 문제인 걸까요. 메시지를 두 번 보내는 문제입니다.
System.드로잉 사용;
System.Data 사용;
System.Text 사용;
System.Windows.Forms 사용;
System.Runtime .InteropServices 사용;
네임스페이스 WindowsApplication2
공개 부분 클래스 UserControl1 : UserControl {
IntPtr m_hImc;
bool isShowChina = false;
public const int WM_IME_SETCONTEXT = 0x0281;
private const int WM_IME_CHAR = 0x0286;
private const int WM_CHAR = 0x0102;
비공개 const int WM_IME_COMPOSITION = 0x010F;
private const int GCS_COMPSTR = 0x0008;
[DllImport( "Imm32.dll" )]
public static extern IntPtr ImmGetContext(IntPtr hWnd);
[DllImport("Imm32.dll")]
public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC);
[DllImport("imm32.dll")]
static extern int ImmGetCompositionString(IntP tr hIMC , int dwIndex, StringBuilder lpBuf, int dwBufLen);
private int GCS_RESULTSTR = 0x0800;
private const int HC_ACTION = 0;
private const int PM_REMOVE = 0x0001;
StringBuilder sb = new StringBuilder();
Font 글꼴 = new Font("宋体", 14, FontStyle.Regular);
public UserControl1()
{
InitializeComponent();
}
private void UserControl1_Load(객체 전송자, EventArgs e)
{
m_hImc = ImmGetContext(this.Handle);
}
보호됨 void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_IME_SETCONTEXT && m.WParam.ToInt32 ( ) == 1)
{
ImmAssociateContext(this.Handle, m_hImc);
}
스위치(m. Msg)
{
case WM_CHAR:
KeyEventArgs e = new KeyEventArgs(((키)((int)((long)m.WP 아람))) | ModifierKeys);
char a = (char)e.KeyData; //영어
sb.Append(a);
intoText();
isShowChina = false;
휴식;
case WM_IME_CHAR:
if (m.WParam.ToInt32() == PM_REMOVE) //如果不做这个判断.会打印复的中文
> GCS_COMPSTR, null, 0);
size += sizeof(Char);
ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size);
sb.Append(str.ToString());
MessageBox.Show(str.ToString()) ;
intoText();
isshowchina = true;
}
중단 >
~ {>{
그래픽 g = this.creategraphics ();
G.Drawstring(sb.tostring (), 글꼴, Brushes.black, 10, 10) >
여러 C#에서 빈 양식에 중국어 입력을 구현하면 PS와 유사한 텍스트를 구현할 수 있습니다. 도구 관련 기사는 PHP 중국어 웹사이트를 참고하세요!