2017-01-30 16 views
10

Tôi muốn nhập văn bản tiếng Hàn trong khu vực ediatble của tôi bên trong một ứng dụng winform.Làm thế nào để có đầu vào Hàn Quốc trong Winform?

Nhưng Ký tự lặp lại, tôi đã cố ghi đè mặc định WndProc nhưng không có tác dụng.

switch (m.WParam.ToInt32()) 
       { 
case Common.Interop.Window.WM_IME_CHAR: 
       break; 

      case Common.Interop.Window.WM_IME_ENDCOMPOSITION: 
        PassCharToScreen(m); 
       break; 

      case Common.Interop.Window.WM_CHAR: 
        PassCharToScreen(m); 
       break; 

      case Common.Interop.Window.WM_IME_NOTIFY: 
       break; 
      case Common.Interop.Window.WM_IME_COMPOSITION: 
       PassCharToScreen(m); 
       break; 
      case Common.Interop.Window.WM_IME_COMPOSITIONFULL: 
       break; 

Khi tôi gõ bằng tiếng Anh, hit breakpoint WM_CHAR, Nhưng Khi tôi gõ bằng tiếng Hàn nó chạm WM_IME_COMPOSITION vào ký tự đầu tiên, và sau đó sau khi nhân vật đầu tiên nó chạm WM_IME_COMPOSITION đầu tiên và sau đó chạm WM_CHAR.

Tôi đã quan sát thấy rằng loại ký tự đầu tiên là chính xác. ví dụ: ㅁ (Ký tự Hàn Quốc) Khi nhập ký tự thứ hai. ㅁㅂㅁ (char đầu tiên, char thứ hai, char đầu tiên). Tôi muốn có hành vi vì nó nằm trong notepad

+0

cũng hiển thị câu lệnh chuyển đổi. –

+2

Có lẽ liên kết này sẽ giúp bạn. http://stackoverflow.com/questions/3287180/putting-ime-in-a-custom-text-box-derived-from-control –

+0

loại điều khiển nào? một tiêu chuẩn 'TextBox'? nó được phân lớp bằng cách nào đó? bởi vì nếu không nó được cho là hoạt động tốt. khu vực văn bản trong notepad cũng dựa trên một điều khiển EDIT đơn giản, trong đó có dây lên tất cả các công cụ yêu cầu IME theo mặc định. WPF sẽ là một câu chuyện khác, nhưng không phải là WinForms. – dlatikay

Trả lời

0

Tôi đã giải quyết được vấn đề bằng cách nào đó, tôi đang viết ở đây để trợ giúp người khác. Vui lòng cho tôi biết nếu có bất kỳ lỗi nào trong mã.

private bool mIsImeProcessed = true; 
private bool mIsImeContinue = false; 

case WM_IME_COMPOSITION: 
       { 
        if (mKoreanInput == true) 
        { 
         long lParam = m.LParam.ToInt64(); 
         long wParam = m.WParam.ToInt64(); 
         char c = (char)m.WParam; 
         if (lParam == 24600) 
         { 
          if (mIsImeProcessed) 
          { 
           mIsImeProcessed = false; 
           mIsImeContinue = false; 
           PassCharToThirdParty(m); 
          } 
          else 
          { 
           PassCharToThirdPartyWithBackSpace(((char)m.WParam).ToString()); 
          } 
          mIsImeContinue = true; 
         } 
        } 
        else if (lParam == 2048) 
        { 
         if (mIsImeProcessed) 
         { 
         } 
         else 
         { 
          if (mIsImeContinue == true) 
          { 

           PassCharToThirdPartyWithBackSpace(((char)m.WParam).ToString()); 
          } 
         } 

         mIsImeProcessed = true; 

        } 
        else 
        { 
          PassBackSpaceToThirdParty(); 
        } 
       } 
       break; 
case Common.Interop.Window.WM_IME_ENDCOMPOSITION: 
       if (mKoreanInput == true) 
       { 
        mIsImeProcessed = true; 
        mIsImeContinue = false; 
       } 
       break; 

Trước tiên hãy kiểm tra xem ngôn ngữ là tiếng Hàn hay ngôn ngữ khác, Vì vậy, nếu tiếng Hàn của ngôn ngữ đó, bạn phải xử lý ngôn ngữ khác.

Bạn phải nhận thông tin về thành phần Bắt đầu và Kết thúc và bạn phải luôn kiểm tra xem sự tiếp tục của nhân vật hoặc sáng tác. Đặt mIsImeProcessed thành truemIsImeContinue tới false sau khi bạn kết thúc thành phần trong WndProc.

Chúng tôi cũng cần xử lý trường hợp cho backspace.

Các vấn đề liên quan