获取我在进程中编写的字符的unicode
本文关键字:字符 unicode 进程 获取 | 更新日期: 2023-09-27 18:29:29
我在WindowForm中有Form。
我想捕获编写的特定字符(unicode)
我只想被允许用一种语言写作。
例如,我想在我的程序中只允许英语和希伯来语。
我怎么能这么做?当写了其他东西时,我该怎么处理??
我知道那里有
OnKeyPress
OnKeyDown
但我只能在写英文字符的情况下才能e.handle
。
我如何通过unicode或其他方式为任何语言做这件事?
提前感谢
您可以使用KeyPress
并检查字符的范围。你可以在这里查看范围表,例如
然后代码变得简单了(这都是未经测试的):
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
并将其全部放在一起),但我将把它留给您。
小心:这不处理复制&粘贴或在文本框中输入文本的其他方式(例如,抓住文本框句柄并发送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:防止重新进入并不是真正必要的,因为字符串在重新进入时是正确的,不会被修改,但我们避免了Any()
检查(它在字符串的每个字符上迭代,如果字符串很长,可能会很慢)
您可以使用这样的正则表达式简单地验证输入的文本
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"[^a-zA-Z]+", options);
tempo = regex.Replace(tempo, @" ");
并在text_changed事件中捕获它。