在如今这个时代,对这个功能的需求量可能已经很少了,但是这也不妨碍我们或多或少的会碰到一些稀奇古怪的需求,多接触一些总归是没错的。 本篇主要是用到了Microsoft。Ink来实现一个手写输入,也就是类似于手机输入法中的手写功能。 实现功能: 用鼠标或者手指在屏幕上写字并识别输入到文本框 开发环境: 开发工具:VisualStudio2013 。NETFramework版本:4。5 实现代码: InkC RecognizerCpublicinputFrm(){ InitializeComponent(); Control。ControlCollectionbtnListpanel3。Cforeach(ControlcinbtnList) { (casButton)。Click(s,e) {if(textBox1。Text。Length0) {intintStarttextBox1。SelectionS textBox1。TexttextBox1。Text。Remove(intStart1,1); textBox1。TexttextBox1。Text。Insert(intStart1,(sasButton)。Text); textBox1。SelectionStartintS } }; } }privatevoidinputFrmLoad(objectsender,EventArgse){创建笔画采集器inknewInkCollector(picText。Handle); ink。E ink。StrokenewInkCollectorStrokeEventHandler((s,e1) { recogn。StopBackgroundRecognition(); recogn。Strokes。Add(e1。Stroke); recogn。BackgroundRecognizeWithAlternates(0); });创建识别器RecognizersrecsnewRecognizers(); Recognizerrecrecs。GetDefaultRecognizer(); recognrec。CreateRecognizerContext(); recogn。RecognitionFlagsRecognitionModes。WordM recogn。Strokesink。Ink。S recogn。RecognitionWithAlternatesnewRecognizerContextRecognitionWithAlternatesEventHandler((s,e1) { RecognitionAif(e1。RecognitionStatusRecognitionStatus。NoError) { altse1。Result。GetAlternatesFromSelection();foreach(RecognitionAlternatealtinalts) { resultalt。ToString(); } } resultresult。Trim(); Control。CheckForIllegalCrossThreadCstring〔〕arrresult。Split();for(inti0;iarr。Li) {stringstrbtnSelect(i1); Controlbtnpanel3。Controls。Find(str,false)。First(); btn。Textarr〔i〕; } Control。CheckForIllegalCrossThreadC }); }privatevoidpicTextMouseUp(objectsender,MouseEventArgse){ timer1。E }privatevoidpicTextMouseDown(objectsender,MouseEventArgse){ timer1。E }privatevoidtimer1Tick(objectsender,EventArgse){ Write();if(!ink。CollectingInk) { StrokesstrokesToDeleteink。Ink。S recogn。StopBackgroundRecognition(); ink。Ink。DeleteStrokes(strokesToDelete); recogn。Strokesink。Ink。S ink。Ink。DeleteStrokes(); picText。Refresh(); } timer1。Stop(); }privatevoidWrite(){ ListlstPointsnewList();foreach(varstrokeinink。Ink。Strokes) { lstPoints。AddRange(stroke。GetPoints()); } ink。Ink。DeleteStrokes(); Strokeskink。Ink。CreateStroke(lstPoints。ToArray()); recogn。Strokes。Add(sk); textBox1。SelectedTextink。Ink。Strokes。ToString(); }privatevoidbtnDelClick(objectsender,EventArgse){if(!string。IsNullOrEmpty(textBox1。Text)) textBox1。TexttextBox1。Text。Substring(0,textBox1。Text。Length1); }privatevoidbtnClearClick(objectsender,EventArgse){if(!ink。CollectingInk) { StrokesstrokesToDeleteink。Ink。S recogn。StopBackgroundRecognition(); ink。Ink。DeleteStrokes(strokesToDelete); recogn。Strokesink。Ink。S ink。Ink。DeleteStrokes(); picText。Refresh(); textBox1。Clear(); } } 实现效果: 最后附上一个关于Microsoft。Ink的API说明文档:https:docs。microsoft。comenuspreviousversionsdotnetnetframework3。5ms581553(vvs。90),以方便大家更加详细的了解以及使用。 有需要源代码的朋友们可私信:手写输入获取 由简入繁,拿来即用 后续精彩,持续关注