MFC 应用程序只能在管理员模式下最大化

Posted

技术标签:

【中文标题】MFC 应用程序只能在管理员模式下最大化【英文标题】:MFC App Can't Maximize Only In Administrator Mode 【发布时间】:2018-10-05 00:07:39 【问题描述】:

我在 Windows 10 上有一个 MFC 应用程序,它禁用了最大化按钮,因为它不是为调整大小而设计的。如果程序不是以管理员身份运行/提升的,则用户可以将窗口最小化到任务栏,然后像平常一样恢复/最大化它。但是,如果应用程序以管理员/提升权限运行,则窗口可以最小化到任务栏,但永远不会恢复/最大化。

我尝试过的事情:

左键单击任务栏上的图标 - 没有任何反应。 将鼠标悬停在任务栏上的图标上,然后悬停在小预览上 图标上方 - 这会显示窗口,但一旦停止就会消失 悬停并点击小预览没有任何作用。 启用最大化按钮并将 NoActivate 属性设置为 true - 无济于事。 Alt-tabbing 应用程序没有任何作用。 当应用程序出现此问题时,我使用 spy++ 64 检查了该应用程序,并且可以看到消息,但我不确定出了什么问题。见下文

这是成功(非管理员)最小化然后最大化的日志,其中最大化尝试发生在 ID 290 附近:https://pastebin.com/kRT4ABrC

这是不成功的(管理员)最小化然后最大化的日志,其中最大化尝试发生在 ID 176 附近:https://pastebin.com/nAiXUa8p

任何人有什么想法有什么问题吗?看起来不成功的日志缺少一堆 WM_ACTIVATEAPP 消息,但我不确定还有什么问题。

"code" necessary for pastebin link posts

【问题讨论】:

普通的 Win32 程序不应该这样做。代码是你自己写的吗?如果没有,请查看是否可以在 C++ 代码中的任何位置找到 IsUserAnAdminElevated。当程序检测到它在管理员模式下运行时,可能会做一些奇怪的事情。 如果没有minimal reproducible example,仅仅从症状描述来解决这个问题是没有意义的。 您正在寻找的是默认行为。它以这种方式工作,无需执行任何操作。由于它对您不起作用,因此您已经编写了代码,该代码会更改默认行为。我们需要查看minimal reproducible example 来帮助您了解它是什么。 @zett42 在这种情况下这是不可能的。 @IInspectable 在这种情况下这是不可能的。 【参考方案1】:

发现问题!我在我们的代码中搜索了“WM”,发现了一些自定义消息处理程序,包括一个用于 ON_WM_MOVE (See for more info.) 的消息处理程序。我仍然不明白为什么它会导致问题,但删除它会给我们带来预期的效果。以下是引起任何好奇的人的问题的代码。 positionPages 方法是可能是罪魁祸首的自定义代码:

void CMyDlg::OnMove(int x, int y)

    CDialogEx::OnMove(x, y);
    positionPages(false); // This keeps the page being displayed in the right location

【讨论】:

这个答案对任何人都有用吗? WM_ON_MOVE 是什么? positionPages() 是什么?这与观察到的症状有何关系? @zett42 它让其他人知道在哪里可以解决类似的问题。我在 windows 消息上打错字了。 不过,WM_MOVE 处理程序与观察到的程序在提升运行时无法从最小化状态恢复的行为有什么关系?这不是一个有用的答案,因为它不能解释任何事情。 @zett42 这是将最小化窗口恢复到其最后位置的过程的一部分。自定义处理程序显然做了一些事情来中断它。我不需要解释所有正在发布的答案,可能会为处于类似情况的人提供一些用途。随意在博客上介绍恢复 Windows 过程的内部工作原理,我一定会读一读。感谢您的帮助!

以上是关于MFC 应用程序只能在管理员模式下最大化的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 新项目向导制造的 MFC Dialog 程序在调试模式下无法编译?

MFC应用程序类型

MFC编辑框Edit

Qt 中是不是有与 MFC OnUpdate 等效的功能?

在 SDI mfc 应用程序中从视图访问模式对话框

如何使用 MFC 从控制台正确弹出无模式对话框