获取我在进程中编写的char的unicode

时间:2016-01-08 18:39:05

标签: c#

我在WindowForm中有Form。

我想捕获已编写的特定字符(unicode)

我想只允许用1种语言写作。

作为示例我想在我的程序中只允许使用英语和希伯来语。

我怎么能这样做?当别的东西写完时我怎么处理?

我知道

  

的OnKeyPress

     

的onkeydown

但是只有当英文字母被写入时我才能e.handle

我如何通过unicode或其他任何语言来完成它?

提前谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用KeyPress并检查角色的范围。您可以查看范围表,例如here

然后代码变得容易(这都是未经测试的):

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    var unicodeValue = (int)e.KeyChar;
    if(unicodeValue >= 0 && unicodeValue <= 0x024F) // it's latin
      return;
    if(unicodeValue >= 0x0590 && unicodeValue <= 0x05FF) // it's hebrew
      return;
    // otherwise, don't allow it
    e.Handled = true;
}

你当然可以创建一个表和辅助函数(并删除这两个ifs并将它们放在一起)但我会把它留给你。

要小心:这不能处理副本&amp;粘贴或其他在文本框中输入文本的方法(例如,抓住文本框句柄并发送WM_SETTEXT)。

如果您想禁止键盘输入字符,

KeyPress就可以了,但您应该始终在TextChanged上验证您的整个输入。

这可以通过类似的东西来完成(再次,完全未经测试并在堆栈溢出编辑器上直接写入,小心处理):

private bool IsCharAllowed(char c)
{
    var unicodeValue = (int)c;
    if(unicodeValue >= 0 && unicodeValue <= 0x024F) // it's latin
      return true;
    if(unicodeValue >= 0x0590 && unicodeValue <= 0x05FF) // it's hebrew
      return true;
    // otherwise, don't allow it
    return false;
}

private bool _parsingText = false;
private void textBox1_TextChanged(object sender, EventArgs e)
{
    // if we changed the text from within this event, don't do anything
    if(_parsingText) return;

    var textBox = sender as TextBox;
    if(textBox == null) return;

    // if the string contains any not allowed characters
    if(textBox.Text.Any(x => !IsCharAllowed(x))
    {        
      // make sure we don't reenter this when changing the textbox's text
      _parsingText = true;
      // create a new string with only the allowed chars
      textBox.Text = new string(textBox.Text.Where(IsCharAllowed).ToArray());         
      _parsingText = false;
    }
}

你也可以使用正则表达式,但老实说,我从来没有做过任何一种非拉丁语的unicode正则表达式,所以我无法帮助那里。

PS:因为我发布的TextChanged事件重建了整个字符串,如果有任何不允许的字符(如果字符串足够长,这可能会变慢),我还有这个 KeyPress处理

PS2:reentry-prevention并不是必需的,因为字符串在重新输入时是正确的并且不会被修改,但是我们避免Any()检查(它迭代字符串的每个字符) ,并且 - 如果字符串很长,则可能很慢)

答案 1 :(得分:0)

您可以使用正则表达式(

)简单验证输入的文本
 Plugin.call(this, this, [], '', null);

并在text_changed事件中捕获它。