Win32 SetForegroundWindow不可靠

mic*_*ing 14 c++ winapi

我有一个相当复杂的应用程序系列,它依赖于在前台切换应用程序的能力.

我的问题是,每隔5或6次在前台切换应用程序,它就无法使应用程序前进.GetLastError不报告任何问题.通常我会在前台看到正确的应用程序闪存片刻,然后前一个应用程序可见.

我有一个管理器应用程序,我有源,它产生和控制约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);
Run Code Online (Sandbox Code Playgroud)

我的第二次尝试是:

SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);
Run Code Online (Sandbox Code Playgroud)

我的第三次尝试:DWORD dwThreadID = GetWindowThreadProcessId(hApp,NULL); AttachThreadInput(dwThreadID,GetCurrentThreadId(),true);

SetForegroundWindow(hApp);
SetActiveWindow(hApp);
SetFocus(hApp);

AttachThreadInput( dwThreadID, GetCurrentThreadId(), false);
Run Code Online (Sandbox Code Playgroud)

我的第四次尝试:

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);
Run Code Online (Sandbox Code Playgroud)

在窗口切换方面,我觉得我错过了一个重要的问题.我知道只有前台进程可以切换窗口,但是当我的主管理器程序正在产生并启动我需要控制的所有其他进程时,我觉得它应该能够移动这些窗口.任何建议或意见表示赞赏.

Raa*_*aja 10

我遇到了同样的问题,我不想搞乱线程.在实验中,我观察到一个简单的黑客攻击,使SetForegroundWindow()以预期的方式工作.这是我做的:

  1. 如果窗口尚未最小化,请将窗口最小化
  2. 恢复最小化窗口
  3. 调用SetForegroundWindow(),您的窗口将位于顶部


Han*_*ant 5

你的AttachThreadInput()hack是(我认为)一种已知的方法来打败在Windows中窃取反措施的焦点.您正在使用错误的句柄,您想要附加到当前具有焦点的线程.哪个不是hApp,否则你不需要这个代码.

使用GetForegroundWindow()获取具有焦点的窗口句柄.

AttachThreadInput(
    GetWindowThreadProcessId(GetForegroundWindow(), NULL),
    GetCurrentThreadId(), TRUE
);
Run Code Online (Sandbox Code Playgroud)

虽然我认为第二个参数需要是hApp的线程ID.因为如果我理解正确你不想推开自己的窗户.不确定这是否可行.

  • 这个hack [会导致程序挂起](http://blogs.msdn.com/b/oldnewthing/archive/2008/08/01/8795860.aspx) (2认同)