سؤال

لدي نموذج واحد ، رسم مخصص ، لا عناصر تحكم.

عندما أحتاج إلى الحصول على الإدخال من المستخدم ، أذهب إلى OnKeyDown ، ثم قم بتخطيط KeyData الخاص بالحدث إلى سلسلة ** - حتى أتمكن من إدراك أن المستخدم قد ضغط على "Ctrl X" ، إلخ ، لذلك كل شيء على ما يرام ... المشكلة هي مع إعدادات لوحة المفاتيح المختلفة وخطابات خاصة باللغة - لذلك اليوم يحصل المستخدمون على

ã -> أ

ó -> o

لذلك أنا بحاجة إلى حدث keypress أليس كذلك؟ ولكن كيف أعرف أن المستخدم مكتوب على سبيل المثال "ł" وليس Alt+L؟ لا يمكنني الحصول على رأسي حول ذلك لفترة من الوقت الآن ...

** - أحتاج إلى القيام بذلك على هذا النحو لأنني سمحت للمستخدمين بتكوين اختصارات واستخدام .ToString () لا ينتج نصًا سهل الاستخدام مثل "Oemperiod ، التحكم" أو حتى أفضل: "ControlKey ، Control"

هل كانت مفيدة؟

المحلول

نعم ، ستحتاج إلى حدث keypress. أو بالأحرى ، تجاوز onkeypress. من الصعب للغاية تعيين رموز المفاتيح الافتراضية في حدث KeyDown إلى السكتات الدماغية الرئيسية ، يجب أن تكون على دراية بتخطيط لوحة المفاتيح الحالي. ألق نظرة على مستندات MSDN لـ Tounicodeex () لمعرفة ما أنت عليه.

لا داعي للقلق بشأن مجموعات ضغط المفاتيح مثل Alt+L. إنهم لا يولدون حدث Keypress.

إليك مثال. ابدأ مشروع Windows Forms جديد وجعل الرمز يبدو مثل هذا:

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }
    StringBuilder mText = new StringBuilder();

    protected override void OnKeyPress(KeyPressEventArgs e) {
      if (e.KeyChar == '\b') {
        if (mText.Length > 0) mText.Remove(mText.Length - 1, 1);
      }
      else mText.Append(e.KeyChar);
      Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e) {
      TextFormatFlags fmt = TextFormatFlags.Left;
      TextRenderer.DrawText(e.Graphics, mText.ToString(), this.Font, this.ClientRectangle, Color.Black, fmt);
    }
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top