<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>numerictextbox &#8211; Sanity Free Coding</title>
	<atom:link href="http://sanity-free.org/tag/numerictextbox/feed" rel="self" type="application/rss+xml" />
	<link>http://sanity-free.org</link>
	<description>Methods to the Madness</description>
	<lastBuildDate>Fri, 24 Oct 2025 07:47:08 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>http://sanity-free.org/wp-content/uploads/2025/10/sanity-free-512-150x150.jpg</url>
	<title>numerictextbox &#8211; Sanity Free Coding</title>
	<link>http://sanity-free.org</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Numeric Text Box: A Number Only Text Box Control in C#</title>
		<link>http://sanity-free.org/numeric_text_box_number_only_text_box_control_in_csharp.html</link>
		
		<dc:creator><![CDATA[steve]]></dc:creator>
		<pubDate>Thu, 14 Apr 2005 18:00:57 +0000</pubDate>
				<category><![CDATA[C# Articles]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[customcontrol]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[numerictextbox]]></category>
		<guid isPermaLink="false">http://dev.sanity-free.org/?p=32</guid>

					<description><![CDATA[Here&#8217;s my numeric only text control. I&#8217;ll admit there&#8217;s not much too it, and there are masked edit controls, but for those who dare&#8230; What this does, is watch the Windows Message Queue for incoming messages (specifically WM_KEYDOWN and WM_PASTE). If a key has been pressed, it will look to see if the key is [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Here&#8217;s my numeric only text control. I&#8217;ll admit there&#8217;s not much too it, and there are masked edit controls, but for those who dare&#8230;<br></p>



<div class="wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers cbp-highlight-hover" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(3 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(0, 0, 0, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#FFFFFF"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#000000;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/******************************************************/
/*          NULLFX FREE SOFTWARE LICENSE              */
/******************************************************/
/*  NumericTextBox Library                            */
/*  by: Steve Whitley                                 */
/*  © 2005 NullFX Software                            */
/*                                                    */
/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */
/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */
/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */
/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */
/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */
/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */
/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */
/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */
/*                                                    */
/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */
/* AND LICENSES (MEANING THIS TEXT).                  */
/*                                                    */
/******************************************************/

namespace NullFX.Controls {
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Windows.Forms;

    public class NumericTextBox : TextBox {
        static NumberFormatInfo CurrentNumberFormat = 
               CultureInfo.CurrentCulture.NumberFormat;
        const int WM_KEYDOWN = 0x0100,
                  WM_PASTE = 0x0302;

        public decimal Value {
            set { Text = value.ToString ( ); }
            get {
                decimal.TryParse ( Text, out decimal tmpValue );
                return tmpValue;
            }
        }

        public override bool PreProcessMessage ( ref Message msg ) {
            if ( msg.Msg == WM_KEYDOWN ) {
                Keys keys = ( Keys ) msg.WParam.ToInt32 ( );
                bool isPaste = keys == Keys.V &amp;&amp; ModifierKeys == Keys.Control;
                bool isNumeric = IsNumeric ( keys );
                bool isKeyValid = IsKeyValid ( keys );
                if ( isNumeric | isKeyValid ) {
                    return false;
                } else if ( isPaste ) {
                    IDataObject obj = Clipboard.GetDataObject ( );
                    string input = ( string ) obj.GetData ( typeof ( string ) );
                    if ( !IsInputOrTextNumeric ( input ) ) {
                        return true;
                    }
                    return false;
                } else {
                    return true;
                }
            } else {
                return base.PreProcessMessage ( ref msg );
            }
        }

        protected override void WndProc ( ref Message m ) {
            if ( m.Msg == WM_PASTE ) {
                IDataObject obj = Clipboard.GetDataObject ( );
                string input = ( string ) obj.GetData ( typeof ( string ) );
                if ( !IsInputOrTextNumeric ( input ) ) {
                    m.Result = ( IntPtr ) 0;
                    return;
                }

            }
            base.WndProc ( ref m );
        }

        private bool IsNumeric ( Keys key ) {
            return ( ( key >= Keys.D0 &amp;&amp; key &lt;= Keys.D9 ) ||
                   ( key >= Keys.NumPad0 &amp;&amp; key &lt;= Keys.NumPad9 ) ) &amp;&amp;
                   ModifierKeys != Keys.Shift;
        }

        private bool IsKeyValid ( Keys key ) {
            bool ctrl = key == Keys.Control;
            bool ctrlZ = key == Keys.Z &amp;&amp; ModifierKeys == Keys.Control,
                 ctrlX = key == Keys.X &amp;&amp; ModifierKeys == Keys.Control,
                 ctrlC = key == Keys.C &amp;&amp; ModifierKeys == Keys.Control,
                 ctrlV = key == Keys.V &amp;&amp; ModifierKeys == Keys.Control,
                 homeEnd = key == Keys.Home | key == Keys.End,
                 del = key == Keys.Delete,
                 bksp = key == Keys.Back,
                 arrows = ( key == Keys.Up ) | ( key == Keys.Down ) | 
                          ( key == Keys.Left ) | ( key == Keys.Right );
            bool standardTests = ctrl | del | bksp | arrows | homeEnd | 
                                 ctrlC | ctrlX | ctrlV | ctrlZ;
            bool containsTokenChar = false;
            if ( !standardTests ) {
                string token = VKtoChar ( key );
                containsTokenChar = validTokens.ContainsKey ( token );
                if ( token != CurrentNumberFormat.CurrencyGroupSeparator &amp;&amp; 
                    Text.Contains ( token ) ) {
                    containsTokenChar = false;
                }
                if ( !IsInputOrTextNumeric ( token ) ) {
                    containsTokenChar = false;
                }
            }
            return standardTests | containsTokenChar;
        }

        private bool IsInputOrTextNumeric ( string tokenOrInput ) {
            string tmp = Text;
            string inserted = tmp.Insert ( SelectionStart, tokenOrInput );
            if ( !decimal.TryParse ( inserted, out decimal result ) ) {
                return false;
            }
            return true;
        }

        private static string VKtoChar ( Keys key ) {
            StringBuilder sb = new StringBuilder ( 256 );
            byte[] keystate = new byte&#91;256&#93;;
            if ( GetKeyboardState ( keystate ) ) {
                uint scanCode = MapVirtualKey ( ( uint ) key, 2 );
                int res = ToUnicode ( ( uint ) key, scanCode, keystate, sb, 256, 2 );
            }
            return sb.ToString ( );
        }

        static Dictionary&lt;string, string> validTokens = 
                                      new Dictionary&lt;string, string> ( );

        static NumericTextBox ( ) {
            validTokens.Add ( CurrentNumberFormat.NegativeSign, "" );
            validTokens.Add ( CurrentNumberFormat.NumberDecimalSeparator, "" );
            validTokens.Add ( CurrentNumberFormat.CurrencyGroupSeparator, "" );
        }

        &#91;DllImport ( "user32.dll", SetLastError = true )&#93;
        private static extern bool GetKeyboardState ( byte[] receivingBuffer );

        &#91;DllImport ( "user32.dll", SetLastError = true )&#93;
        private static extern int ToUnicode ( uint virtualKey, uint scanCode, 
            byte[] keyState, &#91;Out, MarshalAs ( UnmanagedType.LPWStr, SizeConst = 256 )&#93;  
            StringBuilder buffer, int bufferSize, uint flags );
        &#91;DllImport ( "user32.dll" )&#93;
        private static extern uint MapVirtualKey ( uint keyCode, uint mapType );
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*          NULLFX FREE SOFTWARE LICENSE              */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"><span style="color: #008000">/*  NumericTextBox Library                            */</span></span>
<span class="line"><span style="color: #008000">/*  by: Steve Whitley                                 */</span></span>
<span class="line"><span style="color: #008000">/*  © 2005 NullFX Software                            */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */</span></span>
<span class="line"><span style="color: #008000">/* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */</span></span>
<span class="line"><span style="color: #008000">/* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */</span></span>
<span class="line"><span style="color: #008000">/* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */</span></span>
<span class="line"><span style="color: #008000">/* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */</span></span>
<span class="line"><span style="color: #008000">/* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */</span></span>
<span class="line"><span style="color: #008000">/* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */</span></span>
<span class="line"><span style="color: #008000">/* AND LICENSES (MEANING THIS TEXT).                  */</span></span>
<span class="line"><span style="color: #008000">/*                                                    */</span></span>
<span class="line"><span style="color: #008000">/******************************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #0000FF">namespace</span><span style="color: #000000"> </span><span style="color: #267F99">NullFX</span><span style="color: #000000">.</span><span style="color: #267F99">Controls</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Collections</span><span style="color: #000000">.</span><span style="color: #267F99">Generic</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Globalization</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Runtime</span><span style="color: #000000">.</span><span style="color: #267F99">InteropServices</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Text</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #AF00DB">using</span><span style="color: #000000"> </span><span style="color: #267F99">System</span><span style="color: #000000">.</span><span style="color: #267F99">Windows</span><span style="color: #000000">.</span><span style="color: #267F99">Forms</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">    </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">class</span><span style="color: #000000"> </span><span style="color: #267F99">NumericTextBox</span><span style="color: #000000"> : </span><span style="color: #267F99">TextBox</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #267F99">NumberFormatInfo</span><span style="color: #000000"> </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000"> = </span></span>
<span class="line"><span style="color: #000000">               </span><span style="color: #001080">CultureInfo</span><span style="color: #000000">.</span><span style="color: #001080">CurrentCulture</span><span style="color: #000000">.</span><span style="color: #001080">NumberFormat</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">const</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">WM_KEYDOWN</span><span style="color: #000000"> = </span><span style="color: #098658">0x0100</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                  </span><span style="color: #001080">WM_PASTE</span><span style="color: #000000"> = </span><span style="color: #098658">0x0302</span><span style="color: #000000">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">decimal</span><span style="color: #000000"> </span><span style="color: #001080">Value</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">set</span><span style="color: #000000"> { </span><span style="color: #001080">Text</span><span style="color: #000000"> = </span><span style="color: #001080">value</span><span style="color: #000000">.</span><span style="color: #795E26">ToString</span><span style="color: #000000"> ( ); }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">get</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">decimal</span><span style="color: #000000">.</span><span style="color: #795E26">TryParse</span><span style="color: #000000"> ( </span><span style="color: #001080">Text</span><span style="color: #000000">, </span><span style="color: #0000FF">out</span><span style="color: #000000"> </span><span style="color: #0000FF">decimal</span><span style="color: #000000"> </span><span style="color: #001080">tmpValue</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">tmpValue</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">public</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">PreProcessMessage</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">msg</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">msg</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">WM_KEYDOWN</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">Keys</span><span style="color: #000000"> </span><span style="color: #001080">keys</span><span style="color: #000000"> = ( </span><span style="color: #267F99">Keys</span><span style="color: #000000"> ) </span><span style="color: #001080">msg</span><span style="color: #000000">.</span><span style="color: #001080">WParam</span><span style="color: #000000">.</span><span style="color: #795E26">ToInt32</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isPaste</span><span style="color: #000000"> = </span><span style="color: #001080">keys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">V</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isNumeric</span><span style="color: #000000"> = </span><span style="color: #795E26">IsNumeric</span><span style="color: #000000"> ( </span><span style="color: #001080">keys</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">isKeyValid</span><span style="color: #000000"> = </span><span style="color: #795E26">IsKeyValid</span><span style="color: #000000"> ( </span><span style="color: #001080">keys</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">isNumeric</span><span style="color: #000000"> | </span><span style="color: #001080">isKeyValid</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">isPaste</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #267F99">IDataObject</span><span style="color: #000000"> </span><span style="color: #001080">obj</span><span style="color: #000000"> = </span><span style="color: #001080">Clipboard</span><span style="color: #000000">.</span><span style="color: #795E26">GetDataObject</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">input</span><span style="color: #000000"> = ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> ) </span><span style="color: #001080">obj</span><span style="color: #000000">.</span><span style="color: #795E26">GetData</span><span style="color: #000000"> ( </span><span style="color: #0000FF">typeof</span><span style="color: #000000"> ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> ) );</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #795E26">IsInputOrTextNumeric</span><span style="color: #000000"> ( </span><span style="color: #001080">input</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                        </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    }</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            } </span><span style="color: #AF00DB">else</span><span style="color: #000000"> {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">PreProcessMessage</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">msg</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">protected</span><span style="color: #000000"> </span><span style="color: #0000FF">override</span><span style="color: #000000"> </span><span style="color: #0000FF">void</span><span style="color: #000000"> </span><span style="color: #795E26">WndProc</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #267F99">Message</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Msg</span><span style="color: #000000"> == </span><span style="color: #001080">WM_PASTE</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #267F99">IDataObject</span><span style="color: #000000"> </span><span style="color: #001080">obj</span><span style="color: #000000"> = </span><span style="color: #001080">Clipboard</span><span style="color: #000000">.</span><span style="color: #795E26">GetDataObject</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">input</span><span style="color: #000000"> = ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> ) </span><span style="color: #001080">obj</span><span style="color: #000000">.</span><span style="color: #795E26">GetData</span><span style="color: #000000"> ( </span><span style="color: #0000FF">typeof</span><span style="color: #000000"> ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> ) );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #795E26">IsInputOrTextNumeric</span><span style="color: #000000"> ( </span><span style="color: #001080">input</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">m</span><span style="color: #000000">.</span><span style="color: #001080">Result</span><span style="color: #000000"> = ( </span><span style="color: #267F99">IntPtr</span><span style="color: #000000"> ) </span><span style="color: #098658">0</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #AF00DB">return</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">WndProc</span><span style="color: #000000"> ( </span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsNumeric</span><span style="color: #000000"> ( </span><span style="color: #267F99">Keys</span><span style="color: #000000"> </span><span style="color: #001080">key</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> ( ( </span><span style="color: #001080">key</span><span style="color: #000000"> &gt;= </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">D0</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">key</span><span style="color: #000000"> &lt;= </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">D9</span><span style="color: #000000"> ) ||</span></span>
<span class="line"><span style="color: #000000">                   ( </span><span style="color: #001080">key</span><span style="color: #000000"> &gt;= </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">NumPad0</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">key</span><span style="color: #000000"> &lt;= </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">NumPad9</span><span style="color: #000000"> ) ) &amp;&amp;</span></span>
<span class="line"><span style="color: #000000">                   </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> != </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Shift</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsKeyValid</span><span style="color: #000000"> ( </span><span style="color: #267F99">Keys</span><span style="color: #000000"> </span><span style="color: #001080">key</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">ctrl</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">ctrlZ</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Z</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">ctrlX</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">X</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">ctrlC</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">C</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">ctrlV</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">V</span><span style="color: #000000"> &amp;&amp; </span><span style="color: #001080">ModifierKeys</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Control</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">homeEnd</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Home</span><span style="color: #000000"> | </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">End</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">del</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Delete</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">bksp</span><span style="color: #000000"> = </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Back</span><span style="color: #000000">,</span></span>
<span class="line"><span style="color: #000000">                 </span><span style="color: #001080">arrows</span><span style="color: #000000"> = ( </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Up</span><span style="color: #000000"> ) | ( </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Down</span><span style="color: #000000"> ) | </span></span>
<span class="line"><span style="color: #000000">                          ( </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Left</span><span style="color: #000000"> ) | ( </span><span style="color: #001080">key</span><span style="color: #000000"> == </span><span style="color: #001080">Keys</span><span style="color: #000000">.</span><span style="color: #001080">Right</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">standardTests</span><span style="color: #000000"> = </span><span style="color: #001080">ctrl</span><span style="color: #000000"> | </span><span style="color: #001080">del</span><span style="color: #000000"> | </span><span style="color: #001080">bksp</span><span style="color: #000000"> | </span><span style="color: #001080">arrows</span><span style="color: #000000"> | </span><span style="color: #001080">homeEnd</span><span style="color: #000000"> | </span></span>
<span class="line"><span style="color: #000000">                                 </span><span style="color: #001080">ctrlC</span><span style="color: #000000"> | </span><span style="color: #001080">ctrlX</span><span style="color: #000000"> | </span><span style="color: #001080">ctrlV</span><span style="color: #000000"> | </span><span style="color: #001080">ctrlZ</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #001080">standardTests</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">token</span><span style="color: #000000"> = </span><span style="color: #795E26">VKtoChar</span><span style="color: #000000"> ( </span><span style="color: #001080">key</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000"> = </span><span style="color: #001080">validTokens</span><span style="color: #000000">.</span><span style="color: #795E26">ContainsKey</span><span style="color: #000000"> ( </span><span style="color: #001080">token</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #001080">token</span><span style="color: #000000"> != </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000">.</span><span style="color: #001080">CurrencyGroupSeparator</span><span style="color: #000000"> &amp;&amp; </span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">Text</span><span style="color: #000000">.</span><span style="color: #795E26">Contains</span><span style="color: #000000"> ( </span><span style="color: #001080">token</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #795E26">IsInputOrTextNumeric</span><span style="color: #000000"> ( </span><span style="color: #001080">token</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                    </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000"> = </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">                }</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">standardTests</span><span style="color: #000000"> | </span><span style="color: #001080">containsTokenChar</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">IsInputOrTextNumeric</span><span style="color: #000000"> ( </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">tokenOrInput</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">tmp</span><span style="color: #000000"> = </span><span style="color: #001080">Text</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #001080">inserted</span><span style="color: #000000"> = </span><span style="color: #001080">tmp</span><span style="color: #000000">.</span><span style="color: #795E26">Insert</span><span style="color: #000000"> ( </span><span style="color: #001080">SelectionStart</span><span style="color: #000000">, </span><span style="color: #001080">tokenOrInput</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( !</span><span style="color: #0000FF">decimal</span><span style="color: #000000">.</span><span style="color: #795E26">TryParse</span><span style="color: #000000"> ( </span><span style="color: #001080">inserted</span><span style="color: #000000">, </span><span style="color: #0000FF">out</span><span style="color: #000000"> </span><span style="color: #0000FF">decimal</span><span style="color: #000000"> </span><span style="color: #001080">result</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">false</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #0000FF">true</span><span style="color: #000000">;</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">string</span><span style="color: #000000"> </span><span style="color: #795E26">VKtoChar</span><span style="color: #000000"> ( </span><span style="color: #267F99">Keys</span><span style="color: #000000"> </span><span style="color: #001080">key</span><span style="color: #000000"> ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">StringBuilder</span><span style="color: #000000"> </span><span style="color: #001080">sb</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">StringBuilder</span><span style="color: #000000"> ( </span><span style="color: #098658">256</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">keystate</span><span style="color: #000000"> = </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #0000FF">byte</span><span style="color: #000000">&#91;</span><span style="color: #098658">256</span><span style="color: #000000">&#93;;</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">if</span><span style="color: #000000"> ( </span><span style="color: #795E26">GetKeyboardState</span><span style="color: #000000"> ( </span><span style="color: #001080">keystate</span><span style="color: #000000"> ) ) {</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">scanCode</span><span style="color: #000000"> = </span><span style="color: #795E26">MapVirtualKey</span><span style="color: #000000"> ( ( </span><span style="color: #0000FF">uint</span><span style="color: #000000"> ) </span><span style="color: #001080">key</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">                </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">res</span><span style="color: #000000"> = </span><span style="color: #795E26">ToUnicode</span><span style="color: #000000"> ( ( </span><span style="color: #0000FF">uint</span><span style="color: #000000"> ) </span><span style="color: #001080">key</span><span style="color: #000000">, </span><span style="color: #001080">scanCode</span><span style="color: #000000">, </span><span style="color: #001080">keystate</span><span style="color: #000000">, </span><span style="color: #001080">sb</span><span style="color: #000000">, </span><span style="color: #098658">256</span><span style="color: #000000">, </span><span style="color: #098658">2</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            }</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #AF00DB">return</span><span style="color: #000000"> </span><span style="color: #001080">sb</span><span style="color: #000000">.</span><span style="color: #795E26">ToString</span><span style="color: #000000"> ( );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #267F99">Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; </span><span style="color: #001080">validTokens</span><span style="color: #000000"> = </span></span>
<span class="line"><span style="color: #000000">                                      </span><span style="color: #0000FF">new</span><span style="color: #000000"> </span><span style="color: #267F99">Dictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000FF">string</span><span style="color: #000000">, </span><span style="color: #0000FF">string</span><span style="color: #000000">&gt; ( );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #795E26">NumericTextBox</span><span style="color: #000000"> ( ) {</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">validTokens</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000"> ( </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000">.</span><span style="color: #001080">NegativeSign</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">validTokens</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000"> ( </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000">.</span><span style="color: #001080">NumberDecimalSeparator</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #001080">validTokens</span><span style="color: #000000">.</span><span style="color: #795E26">Add</span><span style="color: #000000"> ( </span><span style="color: #001080">CurrentNumberFormat</span><span style="color: #000000">.</span><span style="color: #001080">CurrencyGroupSeparator</span><span style="color: #000000">, </span><span style="color: #A31515">&quot;&quot;</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;user32.dll&quot;</span><span style="color: #000000">, </span><span style="color: #001080">SetLastError</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000"> )&#93;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">bool</span><span style="color: #000000"> </span><span style="color: #795E26">GetKeyboardState</span><span style="color: #000000"> ( </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">receivingBuffer</span><span style="color: #000000"> );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #000000">        &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;user32.dll&quot;</span><span style="color: #000000">, </span><span style="color: #001080">SetLastError</span><span style="color: #000000"> = </span><span style="color: #0000FF">true</span><span style="color: #000000"> )&#93;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #795E26">ToUnicode</span><span style="color: #000000"> ( </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">virtualKey</span><span style="color: #000000">, </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">scanCode</span><span style="color: #000000">, </span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #0000FF">byte</span><span style="color: #000000">[] </span><span style="color: #001080">keyState</span><span style="color: #000000">, &#91;</span><span style="color: #267F99">Out</span><span style="color: #000000">, </span><span style="color: #267F99">MarshalAs</span><span style="color: #000000"> ( </span><span style="color: #001080">UnmanagedType</span><span style="color: #000000">.</span><span style="color: #001080">LPWStr</span><span style="color: #000000">, </span><span style="color: #001080">SizeConst</span><span style="color: #000000"> = </span><span style="color: #098658">256</span><span style="color: #000000"> )&#93;  </span></span>
<span class="line"><span style="color: #000000">            </span><span style="color: #267F99">StringBuilder</span><span style="color: #000000"> </span><span style="color: #001080">buffer</span><span style="color: #000000">, </span><span style="color: #0000FF">int</span><span style="color: #000000"> </span><span style="color: #001080">bufferSize</span><span style="color: #000000">, </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">flags</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">        &#91;</span><span style="color: #267F99">DllImport</span><span style="color: #000000"> ( </span><span style="color: #A31515">&quot;user32.dll&quot;</span><span style="color: #000000"> )&#93;</span></span>
<span class="line"><span style="color: #000000">        </span><span style="color: #0000FF">private</span><span style="color: #000000"> </span><span style="color: #0000FF">static</span><span style="color: #000000"> </span><span style="color: #0000FF">extern</span><span style="color: #000000"> </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #795E26">MapVirtualKey</span><span style="color: #000000"> ( </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">keyCode</span><span style="color: #000000">, </span><span style="color: #0000FF">uint</span><span style="color: #000000"> </span><span style="color: #001080">mapType</span><span style="color: #000000"> );</span></span>
<span class="line"><span style="color: #000000">    }</span></span>
<span class="line"><span style="color: #000000">}</span></span></code></pre><span style="display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#FFFFFF;color:#0d0d0d;font-size:12px;line-height:1;position:relative">C#</span></div>



<p>What this does, is watch the Windows Message Queue for incoming messages (specifically <code>WM_KEYDOWN</code> and <code>WM_PASTE</code>). If a key has been pressed, it will look to see if the key is actually a number. It also looks to see if a paste command has been sent. if a key has been pressed and it is a numeric key (there are a few more keys for convenience sake) or the paste operation has been invoked (the contents of the paste operation are checked to make sure that anything that gets pasted is a number, else it fails to paste in the data) and its contents are numeric, allows that data to be pasted into the textbox.</p>



<p>Since originally posting this control on my older website, I&#8217;ve made some minor updates, checking the key pressed against its text character, checking to see if the resulting value will parse as a decimal and adding a few more keystroke character checks in there.<br><br>For Clarity sake, <code>PreProcessMessage</code> is invoked before the Message is sent into the message queue. If the control handles this message, it returns true, and the message ends there. If it returns false, it will send the Message into the message pump for further processing. <code>WndProc</code> is similar to <code>WindowProc</code> in win32, and one can filter messages sent here like they used to in standard windows programming. In this sample, we&#8217;re peeking at the <code>KEYDOWN</code> message, in the <code>PreProcessMessage</code> function. Commands are not sent through here, but are passed in <code>WndProc</code>, where we can listen, and handle this Message ourselves (because we need to check the contents of the clip board for numeric data).<br><br>If <code>PreProcessMessage</code>&#8216;s Message contains numeric or one of our allowed keys, it returns false which forces the base TextBox to handle the instruction like normal, if not it returns true meaning we&#8217;ve handled it and it doesn&#8217;t get passed into the base TextBox control and nothing flows to the textbox. If <code>WndProc</code> receives a numeric only string in the clip board, then it sends the message to the base TextBox</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#000000;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><pre class="shiki light-plus" style="background-color: #FFFFFF" tabindex="0"><code><span class="line"><span style="color: #0000FF">base</span><span style="color: #000000">.</span><span style="color: #795E26">WndProc</span><span style="color: #000000">(</span><span style="color: #0000FF">ref</span><span style="color: #000000"> </span><span style="color: #001080">m</span><span style="color: #000000">);</span></span></code></pre></div>
</blockquote>



<p>if the clipboard contains alpha or other data, it sets the <code>LResult</code> to <code>0</code>, and returns without passing the message to the base TextBox effectively saying we&#8217;ve handled the message, and there&#8217;s no need to process it any further.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
