2015-01-18 6 views
0

와 assosiated 또는 PictureBox를 로케일 영어 1033 (국가 및 언어 설정에서 설정 가능)에서 ANSI 창입니다. WM_IME_CHAR 또는 WM_UNICHAR 또는 WM_CHAR에서 MS IME 또는 Baidu 입력을 통해 유니 코드를 입력 할 때 wParam은 항상 63 (Char '?')입니다.C 번호 :받는 방법 IME 유니 코드 숯불는 VB6, UserControl을 또는 형태의 ANSI 창 (UC 또는 PictureBox를)

비교를 위해 IsWindowUnicode API가 CreateWindowExW API에서 사용하는 SDK TextBox를 만듭니다. 유니 코드 창이므로 유니 코드 창이므로 wParam이 유니 코드 키 코드임을 알 수 있습니다. WM_UN_CHAR 및 WM_UNICHAR 및 WM_CHAR을 하위 클래스로 만들 때 볼 수 있습니다. 그래서 유니 코드 문자를 쉽게 얻을 수 있습니다.

나는 ANSI 윈도우와 OS 계약을 생각하고 유니 코드 창 다릅니다. IME 유니 코드 문자를 얻으려면 어떻게해야합니까?

C#에서 동일한 코드가 작동 어떤 로케일 중 1033 (영어, 미국) 또는 2052 (중국어 PRC), C#을 윈도우 유니 코드 항상 때문이다. http://support.microsoft.com/kb/193540/en-us :

+0

어렵지만 여전히 실행 가능합니다. - vbforums의 [이 긴 스레드의 14 페이지] (http://www.vbforums.com/showthread.php?698563-CommonControls- (MS 대체 공통 컨트롤)/14 페이지 참조)를 참조하십시오. 유니 코드 메시지 펌프를 검색하십시오 (필요하지 않음). – wqw

+0

링크를 제공해 주셔서 감사합니다. 하지만 Krool의 TextBox는 유니 코드 창이므로 wParam은 유니 코드 키 코드입니다. UC 또는 Form 또는 PictureBox의 경우 유니 코드를 입력 할 때 locale = 1033 (영어, 미국)의 ANSI 창입니다. Subclass 프로 시저에서 wParam은 항상 63입니다. 이것이 루트 문제입니다. 유일한 방법은 IMM 윈도우를 서브 클래스화할 수 있습니다. 쉽게 테스트 됨 : 개인 선언 함수 IsWindowUnicode Lib "user32"(ByVal hWnd As Long) 긴 숫자로 – Jonney

+0

GetWithowLong ** W ** 'GWL_WNDPROC'를 사용하여 모든 hWnd를 유니 코드로 "전환"할 수 있으므로 IsWindowUnicode 테스트 이것이 당신 문제라고 생각한다면 긍정적입니다. VB의 ANSI 메시지 펌프는 여전히 더 큰 문제 IMHO입니다. Krool은 (내가 프로젝트에서했던 것처럼) 좋은 메시지 고리를 얻기 위해 의지하지 않고 유니 코드 지원을 해킹했다. 코드가 정상적으로 작동하는 이유와 문제가 발생한 이유를 알아 내야합니다. – wqw

답변

0

protected override void WndProc(ref Message m) 
 
    int msg = m.Msg; 
 
    if (msg == WM_IME_SETCONTEXT) //associated IME with our UserControl 
 
     { 
 
     if (!m.WParam.Equals(IntPtr.Zero)) 
 
      { 
 
      bool flag = ImmAssociateContextEx(m.HWnd, IntPtr.Zero, 16); 
 
      IntPtr hIMC = ImmGetContext(m.HWnd); 
 
      flag = ImmSetOpenStatus(hIMC, true); 
 
      flag = ImmReleaseContext(m.HWnd, hIMC); 
 
      } 
 
     } 
 
    } 
 
    else 
 
    if (msg == WM_IME_CHAR) //Intercept Message to get Unicode Char 
 
     { 
 
     KeyPress(this, new KeyPressEventArgs(Strings.ChrW(m.WParam.ToInt32()))); 
 
     return; 
 
     } 
 
    } 
 
    base.WndProc(ref m); 
 
} 
 

 
In VB6 UserControl: 
 
Private Function WindowProcUserControl(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 
 
    Select Case wMsg 
 
    Case WM_IME_SETCONTEXT '//associated IME with our UserControl 
 
     If Not wParam = 0 Then 
 
      Dim flag As Boolean 
 
      flag = ImmAssociateContextEx(hWnd, 0, 16) 
 
      If flag Then 
 
       Dim hIMC As Long 
 
       hIMC = ImmGetContext(hWnd) 
 
       flag = ImmSetOpenStatus(hIMC, True) 
 
       flag = ImmReleaseContext(hWnd, hIMC) 
 
      End If 
 
     End If 
 
    Case WM_IME_CHAR '//Intercept Message to get Unicode Char 
 
     Call KeyPress(ChW$(wParam And &HFFFF&)) 
 
     Exit Function 
 
    End Select 
 
End Function

나는 당신의 질문에 대한 관계에서이 기사를 발견했다.

+0

번. 이 기사에서는 "Microsoft Forms 2.0 Object Library"컨트롤을 사용하여 유니 코드를 표시하고 txt 파일을 여는 방법에 대해 설명했습니다. 내 질문은 IME 유니 코드 문자를 얻는 방법입니다. – Jonney

+0

내가 받고있는 것은이 기사를 바탕으로하고 싶지 않을 수도 있다는 것입니다. 이러한 이유로 Visual Basic에서는 두 가지 폼 컨트롤 집합을 제공하고 ANSI 집합을 기본 컨트롤로 사용합니다. ANSI 집합의 폼 컨트롤에 전달 된 문자열은 내부 유니 코드 표현에서 ANSI 표현으로 변환되며 유니 코드 문자열 올바르게. "이 올바르게 읽는 경우 유니 코드 문자는 Visual Basic 폼 개체에 의해 가로 채기 전에 ANSI 문자로 변환됩니다. –

+0

이것이 Visual Basic 6의 제한 사항이라면 Visual Studio 2012 또는 2013에서 동일한 시각적 기본 코드를 사용해 보셨습니까? –

0

내가 생각하기에 근본적인 문제는 VB6 창이 ANSI이고, IME 창을 연결할 때 VB6가 ANSI API (VB의 ANSI 펌프가 그것을 먹을 것임)로 처리 할 때입니다. 이 문제는 내 능력과 대부분의 프로그래머 능력을 넘어서므로이 스레드를 '해결'하게됩니다.