Personally, I'd go with R. Bemrose's suggestion above to use a MaskedTextBox; maybe I'd put a label near it (or show a label whenever the TextBox became active and had focus) telling the user to enter numbers only.
But ... if you are "determined" to show the end-user a message, let me suggest an alternative to 'MessageBox which is much less "disruptive" to the flow of the application, imho.
Consider that using a MaskedTextBox you have access to events like :
private void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
Console.WriteLine("rejected char");
}
private void maskedTextBox1_TextChanged(object sender, EventArgs e)
{
Console.WriteLine("accepted char");
}
When the user enters a character that doesn't meet the criteria defined by the Mask : the MaskInputRejected event will fire : you could show a label if that happens, for example, as an alternative to MessageBox.
You could even maintain a counter variable of how many times the MaskInputRejected event has been called in the "current session," and put up an "ominous" MessageBox :) if the user has entered invalid characters a certain number of times.
When a valid character is entered, in your case a number, the TextChanged event is triggered : you could then hide the label.
If this is a "game," you could do something with a "winking blinking label" with a transparent background (use a Timer or something to make it wink or blink).
For any given UI design, imho, there is no "one size fits all" answer, but I would urge you, if you are a newcomer to WinForms .NET, and its controls, to spend some time studying and using the MaskedTextBox which is really a very handy control with many features.
Just in the odd case you are working in WPF here (if so, please add that tag to your question) see : SO thread on WPF and MaskedTextBox