为什么窗口不登上顶部,使用setWindowpos的起源
Why is a window not coming to top, inspite using setwindowpos?
m_pMainWnd->SetForegroundWindow();
m_pMainWnd->SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
我使用上面的线将我的一个窗户置于顶部。但是令我失望的是,什么都没有发生。尽管使用<& cwnd :: wndtopmast>将窗户带到了最上方,但对此没有重点。VS15,MFC
对不起,但是您要问的是(琐碎)。您的窗口之所以不在顶部的原因是,您的应用程序不是前景应用程序(即 - 负责前景窗口的应用程序)。
在手册页上:
使用setWindowpos将窗口带到顶部,该过程 拥有窗口必须具有SetForegroundWindow的权限。
当然,您做到了。但是,您没有检查其返回代码。这是那个人页面要说的:
系统限制哪些过程可以设置前景窗口。A 过程仅在以下一个时才设置前景窗口 条件是正确的:
- 该过程是前景过程。
- 该过程是由前景过程开始的。
- 该过程收到了最后一个输入事件。
- 没有前景过程。
- 该过程正在调试。
- 前景过程不是现代应用程序或开始屏幕。
- 前景未锁定(请参阅Lockset Foregroundwindow)。
- 前景锁定超时已过期(请参阅SystemParameterSinfo中的Spi_getForegroundlockTimeout)。
- 没有菜单活跃。
这些限制的总和是,很有可能,您无法将窗口变成前景窗口,而您无法将其转到前面。
有解决方案。您可以确保"前景过程"调用设置ForegroundWindow。不幸的是,这没有运行您的代码。
我不得不这样做的时候,我使用钩子将代码注入前景窗口的过程。这不是初学者的技巧。如果您不这样做,那么就无法做您要做的事情。
编辑为添加: Windows试图阻止您做自己想做的事情的原因是有原因的。从另一个应用程序中窃取焦点会为用户创造非常差的UI体验。请重新考虑您是否想要做自己想做的事。
您应该使用cwnd :: wndtopmast而不是cwnd :: wndtop。cwnd :: wndtopmest也会导致窗口即使停用也将保持最高。
请参阅文档:https://msdn.microsoft.com/en-us/library/a1yzfz6d.aspx
关于两者之间区别的一篇古老的新事物:https://blogs.msdn.microsoft.com/oldnewthing/20051121-10/?p=33263
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用CMake创建QML插件
- 使用strcpy将char数组的元素复制到另一个数组
- 在c++中使用nlohmann从类到json的转换
- 使用指针从C++中的数组中获取最大值
- 为什么窗口不登上顶部,使用setWindowpos的起源