微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.因为如果我理解正确,你不想推自己的窗口.不知道是否可以工作.

原文地址:https://www.jb51.cc/c/113876.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐