Chinesische Eingabe auf einem leeren Formular unter C#
Schlüsselwörter: PS-ähnliches Texttool, chinesische Eingabe Wiederholtes Abfangen von Chinesisch
Vor kurzem habe ich nach einem PS-ähnlichen Texttool gesucht und viele Leute gefragt. Endlich hat sich die harte Arbeit gelohnt Schreiben Sie es auf, damit es jeder besprechen kann.
Das leere Fenster in C# ist nein Egal was. Auch wenn this.ImeMode= ImeMode.NoControl eingestellt ist, kann das Eingabemethoden-Aufzeichnungsfenster nicht geöffnet werden. Ich habe dem Moderator Zhou Xuefeng und Riquel_Dong einige Fragen gestellt Moderator für ihren Rat. Ich habe die API verwendet: ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); Ihre Funktion besteht darin, die Eingabe mit dem angegebenen Fenster zu verknüpfen >
Der Code lautet wie folgt:
f (m.Msg == WM_IME_SETCONTEXT && m .WParam.ToInt32() == 1)
{
ImmAssociateContext(this.Handle, m_hImc);
}
Wenn die Eingabemethode zur Eingabe von Text aktiviert ist, wird die WM_IME_CHAR-Nachricht gesendet, indem wir diese Nachricht verarbeiten
Sie können die IMM-Funktion verwenden: ImmGetCompositionString(IntPtr hIMC, int dwIndex, StringBuilder lpBuf, int dwBufLen); um die chinesischen Zeichen oder den NUICODE-Typ zu erhalten Natürlich werden wir sie hier nicht studieren. Sprechen Sie nur über chinesische Schriftzeichen Das Extrahieren von Zeichen lautet wie folgt:
case WM_IME_CHAR:
ImmGetCompositionString( m_hImc, GCS_RESULTSTR, str, size);
sb.Append(str.ToString());
MessageBox.Show(str.ToString());
intoText();// Drucken. Text
>
OK, . Nach dem Testen habe ich festgestellt, dass es sich bei allen gedruckten Wörtern um wiederholte Wörter handelt „People“, was ausgedruckt wird „Serve the People“. Oh mein Gott, es gibt ein Problem. Wo ist es?
Ich habe MSDN überprüft . Es gibt diese Beschreibung von WM_IME_CHAR:
Die WM_IME_CHAR-Nachricht enthält ein Doppelbyte-Zeichen und die Anwendung übergibt diese Nachricht an DefWindowProc
Ist das ein Problem? Da kommt es ins Spiel. Es ist ein Problem, eine Nachricht zweimal zu senden.
Nachdem ich eine Online-Diskussion gelesen hatte, kam ich auf eine Lösung: Urteil hinzufügen
if (m.WParam.ToInt32 () == PM_REMOVE)
{
}
Test endlich gibt es keine Probleme
Code-Post
unter Verwendung von System;
unter Verwendung von System.Collections .Generic;
unter Verwendung von System.ComponentModel;
unter Verwendung von System.Drawing;
mit System.Windows.Forms;
mit System.Runtime .InteropServices;
öffentliche Teilklasse 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;
private 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 statischer externer intptr musiciateContext (intptr hwnd, intptr himc); , int dwIndex, StringBuilder lpBuf, int dwBufLen);
private const int HC_ACTION = 0;
private const int PM_REMOVE = 0x0001;
Font Schriftart = new Font("宋体", 14, FontStyle.Regular);
public UserControl1()
{
private void UserControl1_Load(object sender, EventArgs e)
{
m_hImc = ImmGetContext(this.Handle);
中文
CS_COMPSTR, null, 0);
size += sizeof(Char);
isshowchina = true;
}
Pause; {>
{Grafiken g = this.creategraphics ();
G.Drawstring (sb.tostring (), Schriftart, Brushes.Black, 10, 10); >
Implementieren Sie PS-ähnlichen Text Für verwandte Artikel beachten Sie bitte die chinesische PHP-Website!