mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +01:00
runner: show message box when restarting with different elevation fails (#1061)
Also make the message box appear on top of the settings window.
This commit is contained in:
committed by
GitHub
parent
a2a683d31e
commit
dad732b7e6
@@ -310,6 +310,33 @@ bool run_non_elevated(const std::wstring& file, const std::wstring& params) {
|
|||||||
return succedded;
|
return succedded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool run_same_elevation(const std::wstring& file, const std::wstring& params) {
|
||||||
|
auto executable_args = file;
|
||||||
|
if (!params.empty()) {
|
||||||
|
executable_args += L" " + params;
|
||||||
|
}
|
||||||
|
STARTUPINFO si = { 0 };
|
||||||
|
PROCESS_INFORMATION pi = { 0 };
|
||||||
|
auto succedded = CreateProcessW(file.c_str(),
|
||||||
|
const_cast<LPWSTR>(executable_args.c_str()),
|
||||||
|
nullptr,
|
||||||
|
nullptr,
|
||||||
|
FALSE,
|
||||||
|
0,
|
||||||
|
nullptr,
|
||||||
|
nullptr,
|
||||||
|
&si,
|
||||||
|
&pi);
|
||||||
|
if (pi.hProcess) {
|
||||||
|
CloseHandle(pi.hProcess);
|
||||||
|
}
|
||||||
|
if (pi.hThread) {
|
||||||
|
CloseHandle(pi.hThread);
|
||||||
|
}
|
||||||
|
return succedded;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::wstring get_process_path(HWND window) noexcept {
|
std::wstring get_process_path(HWND window) noexcept {
|
||||||
const static std::wstring app_frame_host = L"ApplicationFrameHost.exe";
|
const static std::wstring app_frame_host = L"ApplicationFrameHost.exe";
|
||||||
DWORD pid{};
|
DWORD pid{};
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ bool run_elevated(const std::wstring& file, const std::wstring& params);
|
|||||||
// Run command as non-elevated user, returns true if succeeded
|
// Run command as non-elevated user, returns true if succeeded
|
||||||
bool run_non_elevated(const std::wstring& file, const std::wstring& params);
|
bool run_non_elevated(const std::wstring& file, const std::wstring& params);
|
||||||
|
|
||||||
|
// Run command with the same elevation, returns true if succedded
|
||||||
|
bool run_same_elevation(const std::wstring& file, const std::wstring& params);
|
||||||
|
|
||||||
// Get the executable path or module name for modern apps
|
// Get the executable path or module name for modern apps
|
||||||
std::wstring get_process_path(DWORD pid) noexcept;
|
std::wstring get_process_path(DWORD pid) noexcept;
|
||||||
// Get the executable path or module name for modern apps
|
// Get the executable path or module name for modern apps
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ int runner()
|
|||||||
catch (std::runtime_error& err)
|
catch (std::runtime_error& err)
|
||||||
{
|
{
|
||||||
std::string err_what = err.what();
|
std::string err_what = err.what();
|
||||||
MessageBoxW(NULL, std::wstring(err_what.begin(), err_what.end()).c_str(), L"Error", MB_OK | MB_ICONERROR);
|
MessageBoxW(nullptr, std::wstring(err_what.begin(), err_what.end()).c_str(), GET_RESOURCE_STRING(IDS_ERROR).c_str(), MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
|
||||||
result = -1;
|
result = -1;
|
||||||
}
|
}
|
||||||
Trace::UnregisterProvider();
|
Trace::UnregisterProvider();
|
||||||
@@ -91,8 +91,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
WCHAR username[UNLEN + 1];
|
WCHAR username[UNLEN + 1];
|
||||||
DWORD username_length = UNLEN + 1;
|
DWORD username_length = UNLEN + 1;
|
||||||
GetUserNameW(username, &username_length);
|
GetUserNameW(username, &username_length);
|
||||||
auto runner_mutex = CreateMutexW(NULL, TRUE, (std::wstring(L"Local\\PowerToyRunMutex") + username).c_str());
|
auto runner_mutex = CreateMutexW(nullptr, TRUE, (std::wstring(L"Local\\PowerToyRunMutex") + username).c_str());
|
||||||
if (runner_mutex == NULL || GetLastError() == ERROR_ALREADY_EXISTS)
|
if (runner_mutex == nullptr || GetLastError() == ERROR_ALREADY_EXISTS)
|
||||||
{
|
{
|
||||||
// The app is already running
|
// The app is already running
|
||||||
return 0;
|
return 0;
|
||||||
@@ -123,7 +123,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
catch (std::runtime_error& err)
|
catch (std::runtime_error& err)
|
||||||
{
|
{
|
||||||
std::string err_what = err.what();
|
std::string err_what = err.what();
|
||||||
MessageBoxW(NULL, std::wstring(err_what.begin(), err_what.end()).c_str(), GET_RESOURCE_STRING(IDS_ERROR).c_str(), MB_OK | MB_ICONERROR);
|
MessageBoxW(nullptr, std::wstring(err_what.begin(), err_what.end()).c_str(), GET_RESOURCE_STRING(IDS_ERROR).c_str(), MB_OK | MB_ICONERROR);
|
||||||
result = -1;
|
result = -1;
|
||||||
}
|
}
|
||||||
ReleaseMutex(runner_mutex);
|
ReleaseMutex(runner_mutex);
|
||||||
@@ -134,7 +134,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
{
|
{
|
||||||
auto text = is_process_elevated() ? GET_RESOURCE_STRING(IDS_COULDNOT_RESTART_NONELEVATED) :
|
auto text = is_process_elevated() ? GET_RESOURCE_STRING(IDS_COULDNOT_RESTART_NONELEVATED) :
|
||||||
GET_RESOURCE_STRING(IDS_COULDNOT_RESTART_ELEVATED);
|
GET_RESOURCE_STRING(IDS_COULDNOT_RESTART_ELEVATED);
|
||||||
MessageBoxW(NULL, text.c_str(), GET_RESOURCE_STRING(IDS_ERROR).c_str(), MB_OK | MB_ICONERROR);
|
MessageBoxW(nullptr, text.c_str(), GET_RESOURCE_STRING(IDS_ERROR).c_str(), MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
|
||||||
|
|
||||||
|
restart_same_elevation();
|
||||||
result = -1;
|
result = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,3 +41,11 @@ bool restart_if_scheduled()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool restart_same_elevation()
|
||||||
|
{
|
||||||
|
constexpr DWORD exe_path_size = 0xFFFF;
|
||||||
|
auto exe_path = std::make_unique<wchar_t[]>(exe_path_size);
|
||||||
|
GetModuleFileNameW(nullptr, exe_path.get(), exe_path_size);
|
||||||
|
return run_same_elevation(exe_path.get(), {});
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,3 +3,4 @@ void schedule_restart_as_elevated();
|
|||||||
void schedule_restart_as_non_elevated();
|
void schedule_restart_as_non_elevated();
|
||||||
bool is_restart_scheduled();
|
bool is_restart_scheduled();
|
||||||
bool restart_if_scheduled();
|
bool restart_if_scheduled();
|
||||||
|
bool restart_same_elevation();
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user