加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Win32 SetForegroundWindow不可靠

发布时间:2020-12-16 05:43:28 所属栏目:百科 来源:网络整理
导读:嘿,我有一个相当复杂的系列应用程序,这取决于在前台切换应用程序的能力. 我的问题是,在前台切换应用程序的每5或6次,只是无法将应用程序转发. GetLastError不报告任何问题.通常情况下,我在前台看到正确的应用程序闪存一会儿,那么以前的应用程序是可见的. 我有
嘿,我有一个相当复杂的系列应用程序,这取决于在前台切换应用程序的能力.

我的问题是,在前台切换应用程序的每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.因为如果我理解正确,你不想推自己的窗口.不知道是否可以工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读