gpt4 book ai didi

c++ - 如何解决我的窗口焦点问题?

转载 作者:可可西里 更新时间:2023-11-01 10:01:48 26 4
gpt4 key购买 nike

我正在处理的应用程序中有一个非常令人沮丧的错误。例程本该在一个窗口做一些事情,然后在方法结束时将焦点返回到另一个窗口,但是当我前几天开始使用一个大数据集时,焦点在最后停止返回。我一次一行地检查代码,错误停止了。所以,我认为这是某种时间问题。我追查直到我发现我怀疑是罪魁祸首。调用 ShellExecute(...),终止我使用的图像编辑器。( http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx )

现在,如果我越过这个调用,然后继续运行程序,一切正常,但如果我越过这一行,就会发生错误。怎么会这样?我在此方法的最后调用了 SetFocus()。无论如何,程序不应该打这个吗?

这一切都非常令人沮丧......

最佳答案

首先应该明确的是,与 windows/messages/focus 等相关的 Win32 API 调用取决于时间。每个线程都有自己的窗口/消息子系统,这里没有竞争条件。

你描述的是另外一回事。您实际上启动了另一个进程(应用程序),它与您的进程同时运行。请注意,ShellExecute 是一个异步 函数。它在创建进程后立即返回,从现在开始您的应用程序和您创建的进程同时运行。

现在,由于系统中一次可能只有一个窗口具有焦点 - 您创建的进程很可能只是窃取了您的焦点。为了避免这种情况 - 您应该首先等待该进程完成工作,然后才将焦点恢复到您的窗口并继续工作。

为此,您必须获得已创建进程的句柄,并在其上调用 Win32 等待函数。 ShellExecute 不会返回已创建进程的句柄。但是 ShellExecuteEx - 可以。顺便说一句,如果这是您想要的,它还允许您启动一个带有指令的进程,以使其不显示 UI。

你应该这样写:

SHELLEXECUTEINFO sei;
memset(&sei, 0, sizeof(sei));
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpFile = L"notepad.exe";
sei.nShow = SW_SHOWNORMAL; // or SW_HIDE if you don't want to show it

if (ShellExecuteEx(&sei))
{
// wait for completion
WaitForSingleObject(sei.hProcess, INFINITE);
CloseHandle(sei.hProcess);
}

这应该有用

附言当然你应该关闭创建进程的句柄。也就是说,CloseHandle 必须在 WaitForSingleObject 之后调用。

关于c++ - 如何解决我的窗口焦点问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2944141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com