From c73e3e5aa485feeff745d0ecff76e5f04a546aa9 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 27 Mar 2015 11:44:59 +0000 Subject: [PATCH] [SYSSETUP] - Move the hotkey loop to its own thread to make it work when modal dialogs are open, and also during device installation CORE-9428 svn path=/trunk/; revision=66914 --- reactos/dll/win32/syssetup/install.c | 64 ++++++++++++++++++++++++++-- reactos/dll/win32/syssetup/wizard.c | 32 +------------- 2 files changed, 61 insertions(+), 35 deletions(-) diff --git a/reactos/dll/win32/syssetup/install.c b/reactos/dll/win32/syssetup/install.c index d3cb7f893d8..5ef77be4b5e 100644 --- a/reactos/dll/win32/syssetup/install.c +++ b/reactos/dll/win32/syssetup/install.c @@ -763,7 +763,7 @@ InstallLiveCD(IN HINSTANCE hInstance) if (!CommonInstall()) goto error; - + /* Register components */ _SEH2_TRY { @@ -782,7 +782,7 @@ InstallLiveCD(IN HINSTANCE hInstance) DPRINT1("Catching exception\n"); } _SEH2_END; - + SetupCloseInfFile(hSysSetupInf); /* Run the shell */ @@ -911,6 +911,53 @@ cleanup: return ret; } +static DWORD CALLBACK +HotkeyThread(LPVOID Parameter) +{ + ATOM hotkey; + MSG msg; + + DPRINT("HotkeyThread start\n"); + + hotkey = GlobalAddAtomW(L"Setup Shift+F10 Hotkey"); + + if (!RegisterHotKey(NULL, hotkey, MOD_SHIFT, VK_F10)) + DPRINT1("RegisterHotKey failed with %lu\n", GetLastError()); + + while (GetMessage(&msg, NULL, 0, 0)) + { + if (msg.hwnd == NULL && msg.message == WM_HOTKEY && msg.wParam == hotkey) + { + STARTUPINFOW si = { sizeof(si) }; + PROCESS_INFORMATION pi; + + if (CreateProcessW(L"cmd.exe", + NULL, + NULL, + NULL, + FALSE, + CREATE_NEW_CONSOLE, + NULL, + NULL, + &si, + &pi)) + { + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + else + { + DPRINT1("Failed to launch command prompt: %lu\n", GetLastError()); + } + } + } + + UnregisterHotKey(NULL, hotkey); + GlobalDeleteAtom(hotkey); + + DPRINT("HotkeyThread terminate\n"); + return 0; +} DWORD WINAPI InstallReactOS(HINSTANCE hInstance) @@ -920,6 +967,7 @@ InstallReactOS(HINSTANCE hInstance) TOKEN_PRIVILEGES privs; HKEY hKey; HINF hShortcutsInf; + HANDLE hHotkeyThread; BOOL ret; InitializeSetupActionLog(FALSE); @@ -964,6 +1012,8 @@ InstallReactOS(HINSTANCE hInstance) CreateDirectory(szBuffer, NULL); } + hHotkeyThread = CreateThread(NULL, 0, HotkeyThread, NULL, 0, NULL); + /* Hack: Install TCP/IP protocol driver */ ret = InstallInfSection(NULL, L"nettcpip.inf", @@ -973,7 +1023,7 @@ InstallReactOS(HINSTANCE hInstance) { DPRINT("InstallInfSection() failed with error 0x%lx\n", GetLastError()); } - else + else { /* Start the TCP/IP protocol driver */ SetupStartService(L"Tcpip", FALSE); @@ -993,7 +1043,7 @@ InstallReactOS(HINSTANCE hInstance) NULL, INF_STYLE_WIN4, NULL); - if (hShortcutsInf == INVALID_HANDLE_VALUE) + if (hShortcutsInf == INVALID_HANDLE_VALUE) { FatalError("Failed to open shortcuts.inf"); return 0; @@ -1045,6 +1095,12 @@ InstallReactOS(HINSTANCE hInstance) SetupCloseInfFile(hSysSetupInf); SetSetupType(0); + if (hHotkeyThread) + { + PostThreadMessage(GetThreadId(hHotkeyThread), WM_QUIT, 0, 0); + CloseHandle(hHotkeyThread); + } + LogItem(SYSSETUP_SEVERITY_INFORMATION, L"Installing ReactOS done"); TerminateSetupActionLog(); diff --git a/reactos/dll/win32/syssetup/wizard.c b/reactos/dll/win32/syssetup/wizard.c index 258a1acaadf..987b7b809cf 100644 --- a/reactos/dll/win32/syssetup/wizard.c +++ b/reactos/dll/win32/syssetup/wizard.c @@ -2317,7 +2317,6 @@ InstallWizard(VOID) UINT nPages = 0; HWND hWnd; MSG msg; - ATOM hotkey; /* Clear setup data */ ZeroMemory(&SetupData, sizeof(SETUPDATA)); @@ -2409,43 +2408,14 @@ InstallWizard(VOID) hWnd = (HWND)PropertySheet(&psh); ShowWindow(hWnd, SW_SHOW); - hotkey = GlobalAddAtomW(L"Setup Shift+F10 Hotkey"); - if (!RegisterHotKey(NULL, hotkey, MOD_SHIFT, VK_F10)) - DPRINT1("RegisterHotKey failed with %lu\n", GetLastError()); while (GetMessage(&msg, NULL, 0, 0)) { - if (msg.hwnd == NULL && msg.message == WM_HOTKEY && msg.wParam == hotkey) - { - STARTUPINFOW si = { sizeof(si) }; - PROCESS_INFORMATION pi; - - if (CreateProcessW(L"cmd.exe", - NULL, - NULL, - NULL, - FALSE, - CREATE_NEW_CONSOLE, - NULL, - NULL, - &si, - &pi)) - { - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - else - { - DPRINT1("Failed to launch command prompt: %lu\n", GetLastError()); - } - } - else if (!IsDialogMessage(hWnd, &msg)) + if (!IsDialogMessage(hWnd, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } - UnregisterHotKey(NULL, hotkey); - GlobalDeleteAtom(hotkey); DeleteObject(SetupData.hTitleFont); }