Heim >Web-Frontend >PS-Tutorial >Durch die Implementierung chinesischer Eingaben in ein leeres Formular unter C# kann ein PS-ähnliches Texttool implementiert werden

Durch die Implementierung chinesischer Eingaben in ein leeres Formular unter C# kann ein PS-ähnliches Texttool implementiert werden

高洛峰
高洛峰Original
2017-02-15 10:23:441789Durchsuche

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);


}



Jetzt kann die Eingabemethode aufgerufen werden. Es ist jedoch ein neues Problem aufgetreten, wie die Wörter in das Aufnahmefenster der Eingabemethode gelangen.

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:


int size = ImmGetCompositionString(m_hImc, GCS_COMPSTR, null , 0);


size += sizeof(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;

unter Verwendung von System.Data;

unter Verwendung von System.Text;

mit System.Windows.Forms;


mit System.Runtime .InteropServices;

Namespace WindowsApplication2

{

ö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 int GCS_RESULTSTR = 0x0800;



        private const int HC_ACTION = 0;


       private const int PM_REMOVE  = 0x0001;


        StringBuilder sb = new StringBuilder();



        Font Schriftart = new Font("宋体", 14, FontStyle.Regular);

        public UserControl1()

        {

            InitializeComponent();

            

        }

        private void UserControl1_Load(object sender, EventArgs e)

        {

          m_hImc = ImmGetContext(this.Handle);

        }

        geschützt override void WndProc(ref Message m)

        {

            base.WndProc(ref m);

            if (m.Msg == WM_IME_SETCONTEXT && m.WParam.ToInt32( ) == 1)

            {

              ImmAssociateContext(this.Handle, m_hImc);

            

           }

            Schalter (m. Msg)

            {

                case WM_CHAR:

                  KeyEventArgs e = new. KeyEventArgs(((Keys)((int)((long)m.WPa Widder))) | ModifierKeys);

                    char a = (char)e.KeyData; //英文

                    sb.Append(a);

                    intoText();

                    isShowChina = false;

                    Pause;

case WM_IME_CHAR:

                    中文

                                                     CS_COMPSTR, null, 0);

                        size += sizeof(Char);

                        ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size);

                      sb.Append(str.ToString());

                       MessageBox.Show(str.ToString()) ;

                        intoText();

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PS-StapelkonvertierungNächster Artikel:PS-Stapelkonvertierung