diff --git a/unix/gtkwin.c b/unix/gtkwin.c
index ff08ec08..cb582164 100644
--- a/unix/gtkwin.c
+++ b/unix/gtkwin.c
@@ -729,19 +729,21 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
 	if (inst->cfg.nethack_keypad) {
 	    char *keys = NULL;
 	    switch (event->keyval) {
-	      case GDK_KP_1: case GDK_KP_End: keys = "bB"; break;
-	      case GDK_KP_2: case GDK_KP_Down: keys = "jJ"; break;
-	      case GDK_KP_3: case GDK_KP_Page_Down: keys = "nN"; break;
-	      case GDK_KP_4: case GDK_KP_Left: keys = "hH"; break;
-	      case GDK_KP_5: case GDK_KP_Begin: keys = ".."; break;
-	      case GDK_KP_6: case GDK_KP_Right: keys = "lL"; break;
-	      case GDK_KP_7: case GDK_KP_Home: keys = "yY"; break;
-	      case GDK_KP_8: case GDK_KP_Up: keys = "kK"; break;
-	      case GDK_KP_9: case GDK_KP_Page_Up: keys = "uU"; break;
+	      case GDK_KP_1: case GDK_KP_End: keys = "bB\002"; break;
+	      case GDK_KP_2: case GDK_KP_Down: keys = "jJ\012"; break;
+	      case GDK_KP_3: case GDK_KP_Page_Down: keys = "nN\016"; break;
+	      case GDK_KP_4: case GDK_KP_Left: keys = "hH\010"; break;
+	      case GDK_KP_5: case GDK_KP_Begin: keys = "..."; break;
+	      case GDK_KP_6: case GDK_KP_Right: keys = "lL\014"; break;
+	      case GDK_KP_7: case GDK_KP_Home: keys = "yY\031"; break;
+	      case GDK_KP_8: case GDK_KP_Up: keys = "kK\013"; break;
+	      case GDK_KP_9: case GDK_KP_Page_Up: keys = "uU\025"; break;
 	    }
 	    if (keys) {
 		end = 2;
-		if (event->state & GDK_SHIFT_MASK)
+		if (event->state & GDK_CONTROL_MASK)
+		    output[1] = keys[2];
+		else if (event->state & GDK_SHIFT_MASK)
 		    output[1] = keys[1];
 		else
 		    output[1] = keys[0];
diff --git a/windows/window.c b/windows/window.c
index b6f3cea4..1e925503 100644
--- a/windows/window.c
+++ b/windows/window.c
@@ -3723,31 +3723,31 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
 	if (cfg.nethack_keypad && !left_alt) {
 	    switch (wParam) {
 	      case VK_NUMPAD1:
-		*p++ = shift_state ? 'B' : 'b';
+		*p++ = "bB\002\002"[shift_state & 3];
 		return p - output;
 	      case VK_NUMPAD2:
-		*p++ = shift_state ? 'J' : 'j';
+		*p++ = "jJ\012\012"[shift_state & 3];
 		return p - output;
 	      case VK_NUMPAD3:
-		*p++ = shift_state ? 'N' : 'n';
+		*p++ = "nN\016\016"[shift_state & 3];
 		return p - output;
 	      case VK_NUMPAD4:
-		*p++ = shift_state ? 'H' : 'h';
+		*p++ = "hH\010\010"[shift_state & 3];
 		return p - output;
 	      case VK_NUMPAD5:
 		*p++ = shift_state ? '.' : '.';
 		return p - output;
 	      case VK_NUMPAD6:
-		*p++ = shift_state ? 'L' : 'l';
+		*p++ = "lL\014\014"[shift_state & 3];
 		return p - output;
 	      case VK_NUMPAD7:
-		*p++ = shift_state ? 'Y' : 'y';
+		*p++ = "yY\031\031"[shift_state & 3];
 		return p - output;
 	      case VK_NUMPAD8:
-		*p++ = shift_state ? 'K' : 'k';
+		*p++ = "kK\013\013"[shift_state & 3];
 		return p - output;
 	      case VK_NUMPAD9:
-		*p++ = shift_state ? 'U' : 'u';
+		*p++ = "uU\025\025"[shift_state & 3];
 		return p - output;
 	    }
 	}