Files
Najib Ahmed 37574d1e0d [TASKMGR] Open the Command Prompt when holding CTRL while clicking "New Task" (#8459)
This is a useful feature that also exists in Windows' own Task Manager.
2025-11-14 21:22:08 +01:00

82 lines
2.8 KiB
C

/*
* PROJECT: ReactOS Task Manager
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Run Task
* COPYRIGHT: Copyright 1999-2001 Brian Palmer <[email protected]>
* Copyright 2005 Klemens Friedl <[email protected]>
*/
#include "precomp.h"
void TaskManager_OnFileNew(void)
{
HMODULE hShell32;
RUNFILEDLG RunFileDlg;
WCHAR szTitle[40];
WCHAR szText[256];
/* If CTRL is held, start the user's command-line shell */
if (GetAsyncKeyState(VK_CONTROL) & 0x8000)
{
STARTUPINFOW si = { sizeof(si) };
PROCESS_INFORMATION pi;
WCHAR szComSpec[MAX_PATH];
WCHAR fallbackCmd[] = L"cmd.exe";
DWORD cchEnv = GetEnvironmentVariableW(L"ComSpec", szComSpec, _countof(szComSpec));
if (cchEnv == 0 || cchEnv > _countof(szComSpec))
{
/* Couldn't get the environment variable, default to cmd.exe */
wcscpy(szComSpec, fallbackCmd);
}
BOOL result = CreateProcessW(NULL,
szComSpec,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si, &pi);
if (!result)
{
/* Couldn't start the user's command-line shell, fall back to cmd.exe */
result = CreateProcessW(NULL,
fallbackCmd,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si, &pi);
}
if (result)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
return;
}
/* Load language strings from resource file */
LoadStringW(hInst, IDS_CREATENEWTASK, szTitle, _countof(szTitle));
LoadStringW(hInst, IDS_CREATENEWTASK_DESC, szText, _countof(szText));
hShell32 = LoadLibraryW(L"SHELL32.DLL");
RunFileDlg = (RUNFILEDLG)(FARPROC)GetProcAddress(hShell32, (LPCSTR)61);
/* Show "Run..." dialog */
if (RunFileDlg)
{
HICON hIcon = LoadIconW(hInst, MAKEINTRESOURCEW(IDI_TASKMANAGER));
/* NOTE - don't check whether running on win 9x or NT, let's just
assume that a unicode build only runs on NT */
RunFileDlg(hMainWnd, hIcon, NULL, szTitle, szText, RFF_CALCDIRECTORY);
DeleteObject(hIcon);
}
FreeLibrary(hShell32);
}