[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
This commit is contained in:
Thomas Faber 2015-03-27 11:44:59 +00:00
parent 6a983b9dd4
commit c73e3e5aa4
2 changed files with 61 additions and 35 deletions

View file

@ -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();

View file

@ -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);
}