我通过ShellExecuteEx启动exe:

tstring sPath = _T("C:\\Test\\MyApp.exe");
tstring sArgs = _T("/S");
SHELLEXECUTEINFO lpExecInfo = {0,};
lpExecInfo.cbSize  = sizeof(SHELLEXECUTEINFO);
lpExecInfo.lpFile = sPath.c_str();
lpExecInfo.fMask=SEE_MASK_NOASYNC ;
lpExecInfo.hwnd = NULL;
lpExecInfo.lpVerb = NULL;
lpExecInfo.lpParameters = sArgs.c_str();
lpExecInfo.lpDirectory = NULL;
lpExecInfo.nShow = SW_SHOWNORMAL;

if (!ShellExecuteEx(&lpExecInfo)) {
    // handle the error
    throw CException("Cannot launch an application");
}

int nRes = (int)lpExecInfo.hInstApp; // nRes = 42
DWORD dwErr = GetLastError(); // dwErr = 0

如何检测UAC是否取消了启动?在这种情况下,ShellExecuteEx成功(hInstApp = 42,GetLastError返回0)。

谢谢

最佳答案

如果ShellExecuteEx()没有返回错误,那么您就无法检测到ShellExecuteEx's控件之外发生的UAC取消。

您应该做的是改用CreateProcess()。如果UAC拒绝新流程,则将返回错误。不要使用ShellExecuteEx()启动.exe文件,除非您使用“runas”动词强制执行UAC提示。

关于c++ - 如何检测通过ShellExecuteEx启动是否被UAC取消,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7802155/

10-11 01:51