gpt4 book ai didi

c++ - GetWindowThreadProcessId 找不到我的窗口句柄,即使它的进程 ID 存在于 Window 上

转载 作者:行者123 更新时间:2023-11-28 08:07:40 24 4
gpt4 key购买 nike

我有一个设置应用程序,如果用户两次单击相同的设置,他们会收到弹出消息“另一个设置实例已在运行”。单击该消息上的“确定”后,我想将焦点放回正在运行的现有安装窗口。我目前有以下代码:

if("setup.exe" == CString(buffer))
EnumWindows(EnumWindowsProc,(LPARAM)processID);


BOOL CALLBACK EnumWindowsProc(HWND windowHandle,LPARAM lParam)
{
DWORD searchedProcessId = (DWORD)lParam;
DWORD windowProcessId = 0;

GetWindowThreadProcessId(windowHandle,&windowProcessId);

if(searchedProcessId == windowProcessId)
{
//Set focus when detects the right window.
SetForegroundWindow(windowHandle);
return FALSE;
}
return TRUE;
}

如果我停留在安装向导(安装防护罩)的第一个屏幕/步骤,上面的代码就可以工作。

当我移动到安装向导的下一个屏幕时,此焦点逻辑不再有效。调试后我发现函数 GetWindowThreadProcessId 找不到任何匹配 searchedProcessId 的 windowProcessID。我还确认了以下内容:

  • 无论我是在第一个还是第二个安装屏幕,searchProcessId 值都保持不变。
  • 当我在窗口任务管理器中查看时,我确认我看到 searchProcessID 值存在。

我阅读了 GetWindowThreadProcessId 并看到以下说明:“返回值是创建窗口的线程的标识符。”在我自己的解释中,是这是因为向导的第二步/屏幕是由它自己的线程生成的吗?

我尝试使用 EnumChildWindow() 函数,但这没有帮助。如果有人能够为我指出正确的方向以使其发挥作用,我将非常感激?

最佳答案

我会使用 Spy++它带有 Visual Studio 或类似的系统监控工具,可以向您显示所有窗口/线程,因此您可以尝试确认安装向导到底在做什么。很有可能 EnumWindows() 工作得很好,这是您的代码或您对工作方式的假设有问题。

关于c++ - GetWindowThreadProcessId 找不到我的窗口句柄,即使它的进程 ID 存在于 Window 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928218/

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