【问题标题】:Terminating ShellExecuteEx terminates "wrong" window终止 ShellExecuteEx 终止“错误”窗口
【发布时间】:2014-04-11 13:36:31
【问题描述】:

我使用此代码启动网络浏览器,然后终止它。然而,在启动 webbrowser 并使其成为活动窗口之后,它会在后台捕获窗口(启动浏览器的应用程序)并终止它。所以我希望它终止前台(网络浏览器)中的窗口。

SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "C:\iexplore.exe";      
ShExecInfo.lpParameters = "http://www.google.se";   
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow =  SW_SHOWMAXIMIZED;
ShExecInfo.hInstApp = NULL; 
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,10);
DWORD Pid = GetCurrentProcessId();
HANDLE h = OpenProcess(PROCESS_TERMINATE, false, Pid);
TerminateProcess(h, 1);
CloseHandle(h);

我想问题是 GetCurrentProcessId() 给了我正在运行的应用程序的 id,而不是新打开的 webbrowser。这是为什么?

【问题讨论】:

  • GetCurrentProcessId() 给了我正在运行的应用程序的 id - 是的,这就是 Current 的意思。 ShExecInfo.hProcess 是任何 shellexecute 产生的进程句柄。

标签: winapi shellexecuteex


【解决方案1】:

GetCurrentProcessId 的全部目的是返回调用该函数的进程的 PID。

要获取已创建进程的进程句柄,请读取SHELLEXECUTEINFO 结构的hProcess 成员。也就是说,在这种情况下,您最好调用CreateProcess,因为您已经知道要启动的可执行文件。

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2019-01-04
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多