c – Win32 SetForegroundWindow不可靠

嘿,我有一个相当复杂的系列应用程序,这取决于在前台切换应用程序的能力.

我的问题是,在前台切换应用程序的每5或6次,只是无法将应用程序转发. GetLastError不报告任何问题.通常情况下,我在前台看到正确的应用程序闪存一会儿,那么以前的应用程序是可见的.

我有一个经理应用程序,我有代码,它产生和控制大约4个我没有源代码的应用程序.它产生/控制的应用程序之一也是一个管理器,它可以生成/控制大约5个应用程序.

这是一种信息亭设计,所以用户甚至不需要键盘或鼠标,只需触摸屏.

我已经尝试过Win32调用的每一个组合来控制他们,我只是出于想法.

我的第一个尝试是:

SetwindowPos(hApp,HWND_TOPMOST,NULL,SWP_NOMOVE | SWP_NOSIZE);
SetwindowPos(hApp,HWND_NOTOPMOST,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,false);

我的第四个尝试:

DWORD dwThreadID = GetwindowThreadProcessId(hApp,NULL);
AttachThreadInput( dwThreadID,true);

SetwindowPos(hApp,SWP_NOMOVE | SWP_NOSIZE);

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

 AttachThreadInput( dwThreadID,false);

我觉得我在窗口切换时缺少一个重要的窍门.我知道只有前台进程可以切换窗口,但是由于我的主要经理程序正在产生并启动我需要控制的所有其他进程,我觉得它应该能够移动这些窗口.我真的在枪下完成这个(整个星期整夜),任何建议或建议是非常感谢.谢谢!

解决方法

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

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

AttachThreadInput(
    GetwindowThreadProcessId(GetForegroundWindow(),NULL),TRUE
);

虽然我认为第二个参数需要是hApp的线程ID.因为如果我理解正确,你不想推自己的窗口.不知道是否可以工作.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...