diff -urp ..\unmodified\mushclient/GlobalPrefs.cpp ./GlobalPrefs.cpp
--- ..\unmodified\mushclient/GlobalPrefs.cpp	2007-06-12 09:05:52.000000000 +0100
+++ ./GlobalPrefs.cpp	2007-07-19 00:23:19.956000000 +0100
@@ -395,6 +395,7 @@ CGlobalPrefsP2::CGlobalPrefsP2() : CProp
 	m_bFixedFontForEditing = FALSE;
 	m_bSmootherScrolling = FALSE;
 	m_bAllTypingToCommandWindow = FALSE;
+	m_bDisableKeyboardMenuActivation = FALSE;
 	m_bSmoothScrolling = FALSE;
 	m_bRegexpMatchEmpty = FALSE;
 	m_bNotifyIfCannotConnect = FALSE;
@@ -428,6 +429,7 @@ void CGlobalPrefsP2::DoDataExchange(CDat
 	DDX_Check(pDX, IDC_FIXED_FONT, m_bFixedFontForEditing);
 	DDX_Check(pDX, IDC_SMOOTHER_SCROLLING, m_bSmootherScrolling);
 	DDX_Check(pDX, IDC_ALL_TYPING_TO_COMMAND, m_bAllTypingToCommandWindow);
+	DDX_Check(pDX, IDC_DISABLE_KEYBOARD_MENU_ACTIVATION, m_bDisableKeyboardMenuActivation);
 	DDX_Check(pDX, IDC_SMOOTH_SCROLLING, m_bSmoothScrolling);
 	DDX_Check(pDX, IDC_REGEXP_MATCH_EMPTY, m_bRegexpMatchEmpty);
 	DDX_Check(pDX, IDC_NOTIFY_IF_CANNOT_CONNECT, m_bNotifyIfCannotConnect);
@@ -1215,6 +1217,7 @@ void DoGlobalPrefs (CMUSHclientDoc * pCu
   propSheet.m_Page2.m_bTriggerRemoveCheck             =  pApp->m_bTriggerRemoveCheck;
   propSheet.m_Page2.m_bF1macro                        =  pApp->m_bF1macro;
   propSheet.m_Page2.m_bAllTypingToCommandWindow       =  pApp->m_bAllTypingToCommandWindow;
+  propSheet.m_Page2.m_bDisableKeyboardMenuActivation  =  pApp->m_bDisableKeyboardMenuActivation;
   propSheet.m_Page2.m_strLocale                       =  pApp->m_strLocale;
   propSheet.m_Page3.m_bConfirmBeforeClosingWorld      =  pApp->m_bConfirmBeforeClosingWorld        ;
   propSheet.m_Page3.m_bConfirmBeforeClosingMushclient =  pApp->m_bConfirmBeforeClosingMushclient   ;
@@ -1325,6 +1328,7 @@ void DoGlobalPrefs (CMUSHclientDoc * pCu
   pApp->m_bTriggerRemoveCheck             =  propSheet.m_Page2.m_bTriggerRemoveCheck;
   pApp->m_bF1macro                        =  propSheet.m_Page2.m_bF1macro;
   pApp->m_bAllTypingToCommandWindow       =  propSheet.m_Page2.m_bAllTypingToCommandWindow;
+  pApp->m_bDisableKeyboardMenuActivation  =  propSheet.m_Page2.m_bDisableKeyboardMenuActivation;
   pApp->m_strLocale                       =  propSheet.m_Page2.m_strLocale;
   pApp->m_bConfirmBeforeClosingWorld      =  propSheet.m_Page3.m_bConfirmBeforeClosingWorld        ;
   pApp->m_bConfirmBeforeClosingMushclient =  propSheet.m_Page3.m_bConfirmBeforeClosingMushclient   ;
diff -urp ..\unmodified\mushclient/GlobalPrefs.h ./GlobalPrefs.h
--- ..\unmodified\mushclient/GlobalPrefs.h	2007-06-12 09:01:42.000000000 +0100
+++ ./GlobalPrefs.h	2007-07-19 22:22:20.609375000 +0100
@@ -89,6 +89,7 @@ public:
 	BOOL	m_bFixedFontForEditing;
 	BOOL	m_bSmootherScrolling;
 	BOOL	m_bAllTypingToCommandWindow;
+	BOOL	m_bDisableKeyboardMenuActivation;
 	BOOL	m_bSmoothScrolling;
 	BOOL	m_bRegexpMatchEmpty;
 	BOOL	m_bNotifyIfCannotConnect;
diff -urp ..\unmodified\mushclient/globalregistryoptions.cpp ./globalregistryoptions.cpp
--- ..\unmodified\mushclient/globalregistryoptions.cpp	2007-06-18 09:08:36.000000000 +0100
+++ ./globalregistryoptions.cpp	2007-07-19 00:23:07.799750000 +0100
@@ -44,6 +44,7 @@ static tGlobalConfigurationNumericOption
 { GLB_OPT (m_bShowGridLinesInListViews      ), "ShowGridLinesInListViews",  1 },
 { GLB_OPT (m_bSmoothScrolling               ), "SmoothScrolling",  0 },
 { GLB_OPT (m_bSmootherScrolling             ), "SmootherScrolling",  0 },
+{ GLB_OPT (m_bDisableKeyboardMenuActivation ), "DisableKeyboardMenuActivation",  0 },
 { GLB_OPT (m_bTriggerRemoveCheck            ), "TriggerRemoveCheck",  1 },
 { GLB_OPT (m_cNotepadBackColour             ), "NotepadBackColour", 0 }, 
 { GLB_OPT (m_cNotepadTextColour             ), "NotepadTextColour", 0 }, 
diff -urp ..\unmodified\mushclient/mainfrm.cpp ./mainfrm.cpp
--- ..\unmodified\mushclient/mainfrm.cpp	2007-06-14 02:26:06.000000000 +0100
+++ ./mainfrm.cpp	2007-07-19 06:00:56.331000000 +0100
@@ -141,6 +141,7 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameW
 	ON_COMMAND_EX(ID_BTN_WORLDS_WORLD7, OnWorldSwitch)
 	ON_COMMAND_EX(ID_BTN_WORLDS_WORLD8, OnWorldSwitch)
 	ON_COMMAND_EX(ID_BTN_WORLDS_WORLD9, OnWorldSwitch)
+	ON_WM_SYSCOMMAND()
 	//}}AFX_MSG_MAP
   ON_MESSAGE(MM_MCINOTIFY, OnMCINotify)
   ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, CMDIFrameWnd::OnUpdateControlBarMenu)
@@ -2123,3 +2124,20 @@ CString strContents; 
  putontoclipboard  (QuoteForumCodes (strContents));
 
 }
+
+void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) 
+{
+	/* This message is sent to the top level window by DefWindowProc in
+	 * response to a WM_SYSKEYUP for Alt or F10. If we pass it to DefWindowProc
+	 * the menu bar will be activated. When DisableKeyboardMenuActivation is 
+	 * enabled, we suppress this behaviour by throwing away the message, provided
+	 * a CSendView or CMUSHView has the input focus. */
+	CWnd *focusedWnd = GetFocus();
+	if (nID == SC_KEYMENU && App.m_bDisableKeyboardMenuActivation &&
+			focusedWnd != NULL && (focusedWnd->IsKindOf(RUNTIME_CLASS(CSendView)) ||
+			focusedWnd->IsKindOf(RUNTIME_CLASS(CMUSHView)) && 
+			App.m_bAllTypingToCommandWindow)) {
+		/* Discard. */
+	} else
+		CMDIFrameWnd::OnSysCommand(nID, lParam);
+}
diff -urp ..\unmodified\mushclient/mainfrm.h ./mainfrm.h
--- ..\unmodified\mushclient/mainfrm.h	2007-06-14 02:26:06.000000000 +0100
+++ ./mainfrm.h	2007-07-18 22:39:39.190375000 +0100
@@ -170,6 +170,7 @@ protected:
 	afx_msg void OnEditGenerateuniqueid();
 	afx_msg void OnGameFunctionslist();
 	afx_msg void OnEditConvertclipboardforumcodes();
+	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 	//}}AFX_MSG
   afx_msg LRESULT OnMCINotify(WPARAM, LPARAM);
 	afx_msg void OnF1Test();
diff -urp ..\unmodified\mushclient/MUSHclient.h ./MUSHclient.h
--- ..\unmodified\mushclient/MUSHclient.h	2007-06-16 07:53:36.000000000 +0100
+++ ./MUSHclient.h	2007-07-19 00:22:15.784125000 +0100
@@ -140,6 +140,7 @@ public:
   unsigned int m_bShowGridLinesInListViews;
   unsigned int m_bSmoothScrolling;
   unsigned int m_bSmootherScrolling;
+  unsigned int m_bDisableKeyboardMenuActivation;
   unsigned int m_bTriggerRemoveCheck;
   unsigned int m_iActivityButtonBarStyle;
   unsigned int m_iAsciiArtLayout;
diff -urp ..\unmodified\mushclient/mushview.cpp ./mushview.cpp
--- ..\unmodified\mushclient/mushview.cpp	2007-06-14 02:28:24.000000000 +0100
+++ ./mushview.cpp	2007-07-19 22:31:03.546875000 +0100
@@ -95,6 +95,7 @@ BEGIN_MESSAGE_MAP(CMUSHView, CView)
 	ON_COMMAND(ID_WINDOW_MINIMIZE, OnWindowMinimize)
 	ON_UPDATE_COMMAND_UI(ID_WINDOW_MINIMIZE, OnUpdateWindowMinimize)
 	ON_WM_CHAR()
+	ON_WM_SYSCHAR()
 	ON_COMMAND(ID_DISPLAY_FIND, OnDisplayFind)
 	ON_COMMAND(ID_DISPLAY_FINDAGAIN, OnDisplayFindagain)
 	ON_COMMAND(ID_FILE_PRINT_WORLD, OnFilePrintWorld)
@@ -118,6 +119,9 @@ BEGIN_MESSAGE_MAP(CMUSHView, CView)
 	ON_COMMAND(ID_EDIT_NOTESWORKAREA, OnEditNotesworkarea)
 	ON_COMMAND(ID_DISPLAY_RECALLTEXT, OnDisplayRecalltext)
 	ON_WM_KEYDOWN()
+	ON_WM_KEYUP()
+	ON_WM_SYSKEYDOWN()
+	ON_WM_SYSKEYUP()
 	ON_COMMAND(ID_DISPLAY_GOTOLINE, OnDisplayGotoline)
 	ON_COMMAND(ID_GAME_COMMANDHISTORY, OnGameCommandhistory)
 	ON_COMMAND(ID_FILE_CTRL_N, OnFileCtrlN)
@@ -135,6 +139,7 @@ BEGIN_MESSAGE_MAP(CMUSHView, CView)
 	ON_UPDATE_COMMAND_UI(ID_EDIT_COPYASHTML, OnUpdateNeedSelection)
 	ON_COMMAND(ID_WINDOW_MAXIMIZE, OnWindowMaximize)
 	ON_COMMAND(ID_WINDOW_RESTORE, OnWindowRestore)
+	ON_WM_SYSCOMMAND()
 	//}}AFX_MSG_MAP
 
   // macros
@@ -2950,15 +2955,26 @@ ASSERT_VALID(pDoc);
 			pWndPopupOwner);
 }
 
+/* If AllTypingToCommandWindow is enabled we redirect character messages to 
+ * the bottom view. */
+
 void CMUSHView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
 {
+	if (App.m_bAllTypingToCommandWindow) {
+		OnKeysActivatecommandview();
+		m_bottomview->SendMessage(WM_CHAR, nChar, nRepCnt | (nFlags << 16));
+	} else
+		CView::OnChar(nChar, nRepCnt, nFlags);
+}
 
-// if typing is received in top view, activate bottom view and pass character on
-
-  OnKeysActivatecommandview ();  
-  m_bottomview->SendMessage(WM_CHAR, nChar, nRepCnt | (nFlags << 16));
-
-  }
+void CMUSHView::OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags)
+{
+	if (App.m_bAllTypingToCommandWindow) {
+		OnKeysActivatecommandview();
+		m_bottomview->SendMessage(WM_SYSCHAR, nChar, nRepCnt | (nFlags << 16));
+	} else
+		CView::OnSysChar(nChar, nRepCnt, nFlags);
+}
 
 void CMUSHView::OnDisplayFind() 
 {
@@ -4546,23 +4562,43 @@ CString strMessage;
   
 }
 
+/* If AllTypingToCommandWindow is on, we redirect all keyboard messages to the bottom view. */
+
 void CMUSHView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
 {
-
-  if (App.m_bAllTypingToCommandWindow)
-    {
-    // if typing is received in top view, activate bottom view and pass character on
-
+  if (App.m_bAllTypingToCommandWindow) {
     OnKeysActivatecommandview ();  
     m_bottomview->SendMessage(WM_KEYDOWN, nChar, nRepCnt | (nFlags << 16));
-
-    }
-  else
+  } else
 	  CView::OnKeyDown(nChar, nRepCnt, nFlags);
+}
 
+void CMUSHView::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
+{
+	if (App.m_bAllTypingToCommandWindow) {
+		OnKeysActivatecommandview();
+		m_bottomview->SendMessage(WM_SYSKEYDOWN, nChar, nRepCnt | (nFlags << 16));
+	} else
+		CView::OnSysKeyDown(nChar, nRepCnt, nFlags);
+}
 
+void CMUSHView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
+{
+	if (App.m_bAllTypingToCommandWindow) {
+		OnKeysActivatecommandview();
+		m_bottomview->SendMessage(WM_KEYUP, nChar, nRepCnt | (nFlags << 16));
+	} else
+		CView::OnKeyUp(nChar, nRepCnt, nFlags);
 }
 
+void CMUSHView::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
+{
+	if (App.m_bAllTypingToCommandWindow) {
+		OnKeysActivatecommandview();
+		m_bottomview->SendMessage(WM_SYSKEYUP, nChar, nRepCnt | (nFlags << 16));
+	} else
+		CView::OnSysKeyUp(nChar, nRepCnt, nFlags);
+}
 
 BOOL CMUSHView::OnKeypadCommand(UINT nIDC) 
   {
@@ -5521,3 +5557,11 @@ void CMUSHView::OnWindowRestore() 
 	  GetParentFrame ()->ShowWindow(SW_RESTORE);
 	
 }
+
+void CMUSHView::OnSysCommand(UINT nID, LPARAM lParam) 
+{
+	if (nID == SC_KEYMENU && App.m_bDisableKeyboardMenuActivation) {
+		/* Discard. */
+	} else
+		CView::OnSysCommand(nID, lParam);
+}
diff -urp ..\unmodified\mushclient/mushview.h ./mushview.h
--- ..\unmodified\mushclient/mushview.h	2006-07-05 10:04:04.000000000 +0100
+++ ./mushview.h	2007-07-19 05:05:24.815375000 +0100
@@ -169,6 +169,7 @@ protected:
 	afx_msg void OnWindowMinimize();
 	afx_msg void OnUpdateWindowMinimize(CCmdUI* pCmdUI);
 	afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
+	afx_msg void OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags);
 	afx_msg void OnDisplayFind();
 	afx_msg void OnDisplayFindagain();
 	afx_msg void OnFilePrintWorld();
@@ -192,6 +193,9 @@ protected:
 	afx_msg void OnEditNotesworkarea();
 	afx_msg void OnDisplayRecalltext();
 	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
+	afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
+	afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
+	afx_msg void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
 	afx_msg void OnDisplayGotoline();
 	afx_msg void OnGameCommandhistory();
 	afx_msg void OnFileCtrlN();
@@ -202,6 +206,7 @@ protected:
 	afx_msg void OnDisplayMultilinetrigger();
 	afx_msg void OnWindowMaximize();
 	afx_msg void OnWindowRestore();
+	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 	//}}AFX_MSG
 	afx_msg BOOL OnMacroCommand(UINT nIDC);
 	afx_msg BOOL OnKeypadCommand(UINT nIDC);
diff -urp ..\unmodified\mushclient/sendvw.cpp ./sendvw.cpp
--- ..\unmodified\mushclient/sendvw.cpp	2007-06-14 02:28:24.000000000 +0100
+++ ./sendvw.cpp	2007-07-19 05:51:21.987250000 +0100
@@ -240,6 +240,9 @@ BEGIN_MESSAGE_MAP(CSendView, CEditView)
                    ACCELERATOR_FIRST_COMMAND + ACCELERATOR_COUNT - 1, 
                    OnAcceleratorCommand)
 
+	/* Handler to suppress default ALT key behaviour. */
+	ON_WM_SYSCOMMAND()
+
 END_MESSAGE_MAP()
 
 //#define new DEBUG_NEW 
@@ -2652,3 +2655,17 @@ void CSendView::OnWindowRestore() 
 	  GetParentFrame ()->ShowWindow(SW_RESTORE);
 	
 }
+
+void CSendView::OnSysCommand(UINT nID, LPARAM lParam)
+{
+	/* DefWindowProc sends this message to the focused window when it processes
+	 * a WM_SYSCHAR. In other words we end up here when the user presses ALT+f,
+	 * etc. If we pass this message to DefWindowProc, the corresponding popup menu
+	 * will be opened. We supress this behaviour if DisableKeyboardMenuActivation 
+	 * is enabled. See also the analogous handler in CMainFrame which stops the 
+	 * menu bar being focused when ALT and F10 are released. */
+	if (nID == SC_KEYMENU && App.m_bDisableKeyboardMenuActivation) {
+		/* Discard. */
+	} else
+		CEditView::OnSysCommand(nID, lParam);
+}
diff -urp ..\unmodified\mushclient/sendvw.h ./sendvw.h
--- ..\unmodified\mushclient/sendvw.h	2007-04-03 06:52:26.000000000 +0100
+++ ./sendvw.h	2007-07-18 22:28:44.768500000 +0100
@@ -185,6 +185,7 @@ protected:
 	afx_msg void OnUpdateCompleteFunction(CCmdUI* pCmdUI);
 	afx_msg void OnWindowMaximize();
 	afx_msg void OnWindowRestore();
+	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 	//}}AFX_MSG
   afx_msg void OnMXPMenu(UINT nID);    
   afx_msg void OnAcceleratorCommand(UINT nID);  
