Index: base/shell/explorer/taskbar/startmenu.cpp =================================================================== --- base/shell/explorer/taskbar/startmenu.cpp (revision 39795) +++ base/shell/explorer/taskbar/startmenu.cpp (working copy) @@ -2112,14 +2112,42 @@ void StartMenuHandler::ShowLaunchDialog(HWND hwndOwner) { + WindowReenablerThread* wrt = new WindowReenablerThread(); + wrt->_owner_hwnd = hwndOwner; + wrt->Start(); + static DynamicFct RunFileDlg(TEXT("SHELL32"), 61); - // Show "Run..." dialog + // Show "Run..." dialog (modal, disables our window) if (RunFileDlg) { (*RunFileDlg)(hwndOwner, 0, NULL, NULL, NULL, RFF_CALCDIRECTORY); } + else { + wrt->Stop(); + } + + // (Note that code execution in this function stops until (RunFileDlg) returns + // control -- which it does once the dialog is closed.) + + // Just in case... + if (wrt->is_alive() == TRUE) + wrt->Stop(); } +int WindowReenablerThread::Run() +{ + while (IsWindowEnabled(this->_owner_hwnd) == TRUE){ + // Patience is a virtue. + Sleep(20); + } + + // Suddenly! The window is disabled by the modal run dialog. + // So we hurry to the rescue... + EnableWindow(this->_owner_hwnd, TRUE); + + return 0; +} + void StartMenuHandler::ShowLogoffDialog(HWND hwndOwner) { static DynamicFct LogoffWindowsDialog(TEXT("SHELL32"), 54); Index: base/shell/explorer/taskbar/startmenu.h =================================================================== --- base/shell/explorer/taskbar/startmenu.h (revision 39795) +++ base/shell/explorer/taskbar/startmenu.h (working copy) @@ -351,9 +351,16 @@ static void ShowRestartDialog(HWND hwndOwner, UINT flags); static void ShowSearchDialog(); static void ShowSearchComputer(); + }; +struct WindowReenablerThread : public Thread +{ + int Run(); + HWND _owner_hwnd; +}; + struct StartMenuRootCreateInfo { int _icon_size;