Enforce valid tag syntax during input.

diff --git a/programs/winetest/gui.c b/programs/winetest/gui.c
index 357676d..97e365d 100644
--- a/programs/winetest/gui.c
+++ b/programs/winetest/gui.c
@@ -41,6 +41,8 @@
  */
 int progressGroup;
 
+WNDPROC DefEditProc;
+
 char *
 renderString (va_list ap)
 {
@@ -319,21 +321,35 @@
 }
 
 BOOL CALLBACK
+EditTagProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    switch (msg) {
+    case WM_CHAR:
+        if (wParam == 8) break; /* backspace is OK */
+        if (GetWindowTextLengthA (hwnd) == MAXTAGLEN ||
+            !goodtagchar (wParam)) return TRUE;
+        break;
+    }
+    return CallWindowProcA (DefEditProc, hwnd, msg, wParam, lParam);
+}
+
+BOOL CALLBACK
 AskTagProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     int len;
 
     switch (msg) {
+    case WM_INITDIALOG:
+        DefEditProc = (WNDPROC)SetWindowLongPtr
+            (GetDlgItem (hwnd, IDC_TAG), GWLP_WNDPROC, (LONG_PTR)EditTagProc);
+        return TRUE;
     case WM_COMMAND:
         switch (LOWORD (wParam)) {
         case IDOK:
             len = GetWindowTextLengthA (GetDlgItem (hwnd, IDC_TAG));
-            if (len <= MAXTAGLEN) {
-                tag = xmalloc (len+1);
-                GetDlgItemTextA (hwnd, IDC_TAG, tag, len+1);
-                if (!badtagchar (tag)) EndDialog (hwnd, IDOK);
-                else free (tag);
-            }
+            tag = xmalloc (len+1);
+            GetDlgItemTextA (hwnd, IDC_TAG, tag, len+1);
+            EndDialog (hwnd, IDOK);
             return TRUE;
         case IDABORT:
             EndDialog (hwnd, IDABORT);