Конвертировать любой символ в верхний регистр глобально во всех пользовательских элементах управления - PullRequest
0 голосов
/ 27 октября 2019

Вместо того, чтобы пытаться обрабатывать события набора клавиш в каждой ячейке TextBox / TextArea / GridView, я хотел бы добавить глобальный прослушиватель событий, который преобразует все ключевые символы в верхний регистр.

Переопределяет метод ниже, но не может заменить символ типа на верхний регистр.

protected override bool ProcessCmdKey(ref Message m, Keys keys)
{
    var typed = new KeysConverter().ConvertToString(keys);
    if (!String.IsNullOrEmpty(typed))
    {
        SendCharKey('M');
        return true;
    }
    return base.ProcessCmdKey(ref m, keys);
}

private void SendCharKey(char c)
{
    Message msg = new Message();
    msg.HWnd = this.Handle;
    msg.Msg = 0x0102;
    msg.WParam = (IntPtr)c;
    msg.LParam = IntPtr.Zero;
    base.WndProc(ref msg);
}

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Я хотел бы добавить глобальный прослушиватель событий, который преобразует все ключевые символы в верхний регистр.

Относительно простой способ сделать это - зарегистрировать фильтр сообщений приложения. Это делается с помощью метода Application.AddMessageFilter (IMessageFilter) . В этом примере форма сама реализует интерфейс IMessageFilter .

Метод PreFilter перехватывает сообщение WM_CHAR s и определяет, является ли сообщение символом нижнего регистра. Если он в нижнем регистре, сообщение отменяется, и в окно отправляется новый беспорядок [возраст с эквивалентом в верхнем регистре.

Фильтр устанавливается / удаляется при активации / деактивации формы, так что он толькоактивен для данной формы.

public partial class Form1 : Form, IMessageFilter
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnActivated(EventArgs e)
    {
        base.OnActivated(e);
        // install filter on form activation
        Application.AddMessageFilter(this);
    }

    protected override void OnDeactivate(EventArgs e)
    {
        base.OnDeactivate(e);
        // remove filter on form deactivation
        Application.RemoveMessageFilter(this);
    }
    public bool PreFilterMessage(ref Message m)
    {
        const Int32 WM_CHAR = 0x102;
        bool ret = false;
        if (m.Msg == WM_CHAR)
        {
            char c = (char)m.WParam.ToInt32();
            if (char.IsLower(c))
            {
                char upper = char.ToUpper(c);
                SendMessage(m.HWnd, m.Msg, new IntPtr(upper), m.LParam);
                ret = true;
            }
        }
        return ret;
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public extern static IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

}
0 голосов
/ 27 октября 2019

Чтобы изменить текст во всех элементах управления, просто определите рекурсивную функцию и вызовите ее в значении события, например:

private void Button2_Click(object sender, EventArgs e)
{
  // I assume this code will be placed inside Form class :)
  ControlTextToUpper(this);
}

private void ControlTextToUpper(Control control)
{
  control.Text = control.Text.ToUpper();
  foreach (Control ctrl in control.Controls)
    ControlTextToUpper(ctrl); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...