I would start by handling the TextChanged event for the TextBox - ignore the key events, as they will still allow unwanted data in via Paste (form keyboard or mouse).
In the TextChanged event, replace all unwanted characters with empty strings.
private void MyTextBox_TextChanged(object sender, EventArgs e)
{
TextBox tb = sender as TextBox;
if (tb != null)
{
string original = tb.Text;
string revised = Regex.Replace(original, "[^\\w]", "");
if (original != revised)
{
int cursor = tb.SelectionStart;
tb.Text = revised;
tb.SelectionStart = cursor;
}
}
}