我有一系列相当复杂的应用程序,这取决于在前台切换应用程序的能力。
我的问题是,每在前台切换应用程序5到6次,它根本无法使应用程序前进。 GetLastError不报告任何问题。通常,我会看到正确的应用程序在前台闪烁片刻,然后可以看到先前的应用程序。
我有一个Manager应用程序,我有该源程序,它生成并控制了大约4个我没有源程序的应用程序。它产生/控制的应用程序之一也是管理器,它产生/控制约5个应用程序。
这是一种信息亭设计,因此用户甚至没有键盘或鼠标,只有触摸屏。
我已经尝试过Win32调用的每种组合来控制它们,但我的想法还不够。
我的第一次尝试是:
SetWindowPos(hApp, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hApp, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
我的第二次尝试是:
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
我的第三次尝试:
DWORD dwThreadID = GetWindowThreadProcessId(hApp,NULL);
AttachThreadInput(dwThreadID,GetCurrentThreadId(),true);
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);
我的第四次尝试:
DWORD dwThreadID = GetWindowThreadProcessId(hApp, NULL);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), true);
SetWindowPos(hApp, HWND_TOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hApp, HWND_NOTOPMOST, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);
当切换窗口时,我感觉好像错过了一个重要的陷阱。我知道只有前台进程可以切换窗口,但是当我的主Manager程序正在生成并启动我需要控制的所有其他进程时,我觉得它应该能够移动这些窗口。任何建议或意见表示赞赏。
最佳答案
(我认为)您的AttachThreadInput()hack是一种克服Windows焦点窃取对策的已知方法。但是,您使用了错误的句柄,因此您想连接到当前具有焦点的线程。不会是hApp,否则您将不需要此代码。
使用GetForegroundWindow()获取具有焦点的窗口的句柄。
AttachThreadInput(
GetWindowThreadProcessId(GetForegroundWindow(), NULL),
GetCurrentThreadId(), TRUE
);
虽然我认为第二个参数必须是hApp的线程ID。因为如果我理解正确的话,您不想推开自己的 window 。不确定是否可以使用。
关于c++ - Win32 SetForegroundWindow不可靠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3772233/