diff --git src/simutrans/gui/chat_frame.cc src/simutrans/gui/chat_frame.cc
index 7bd0b63ab..6fff37a68 100644
--- src/simutrans/gui/chat_frame.cc
+++ src/simutrans/gui/chat_frame.cc
@@ -495,6 +495,11 @@ void chat_frame_t::fill_list()
 bool chat_frame_t::action_triggered(gui_action_creator_t* comp, value_t v)
 {
 	if (comp == &input && ibuf[0] != 0) {
+		// Only send messages when the user actually presses <RETURN>!
+		// The textinput may tell us of other events, so we ignore them.
+		if (v.i != gui_textinput_t::INPUT_FINISHED) {
+			return false;
+		}
 		const sint8 channel = tabs.get_active_tab_index() == CH_COMPANY ? (sint8)world()->get_active_player_nr() : -1;
 		const sint8 sender_company_nr = welt->get_active_player()->is_locked() ? -1 : welt->get_active_player()->get_player_nr();
 		const char *dest = cb_direct_chat_targets.get_selection() > 0 ? cb_direct_chat_targets.get_selected_item()->get_text() : "";
