- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
m_pMainWnd->SetForegroundWindow();
m_pMainWnd->SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
我使用上面的代码将我的一个窗口置于顶部。但令我失望的是,什么也没有发生。虽然使用 <&CWnd::wndTopMost> 将窗口带到最顶层,但没有关注它。VS15、mfc
最佳答案
很抱歉,但您所问的(微不足道)是不可能的。您的窗口没有出现在顶部的原因是因为您的应用程序不是前台应用程序(即 - 负责前台窗口的应用程序)。
来自manual page :
To use SetWindowPos to bring a window to the top, the process that owns the window must have SetForegroundWindow permission.
当然,你做到了。但是,您没有检查它的返回码。这就是man page不得不说:
The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:
- The process is the foreground process.
- The process was started by the foreground process.
- The process received the last input event.
- There is no foreground process.
- The process is being debugged.
- The foreground process is not a Modern Application or the Start Screen.
- The foreground is not locked (see LockSetForegroundWindow).
- The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
- No menus are active.
这些限制的总和就是,您很可能无法将窗口变成前景窗口,也无法将其置于最前面。
有很多方法可以解决这个问题。您可以确保前台进程调用 SetForegroundWindow。不幸的是,那没有运行您的代码。
有一次我不得不这样做,我使用了 hooks为了将我的代码注入(inject)到前台窗口的进程中。这不是初学者的把戏。如果你做不到这一点,那么就没有办法做你想做的事。
编辑添加:Windows 试图阻止您执行您正在尝试执行的操作是有原因的。从另一个应用程序中窃取焦点会给用户带来非常糟糕的 UI 体验。请重新考虑您是否想要做您正在尝试做的事情。
关于c++ - 尽管使用了 setwindowpos,为什么窗口没有出现在顶部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38119347/
我有两个以不同分辨率运行的显示器。左显示器为 1920x1200。右显示器(主显示器)是 1920x1080。 我想使用 SetWindowPos 使窗口占据左手监视器的整个垂直高度。 这是我所做的:
下面是一个非常古老的功能,在很多电脑上都可以使用,从来没有出现过错误,但是现在这台笔记本电脑出现了问题。根据测试人员的说法,“在我重新启动并且没有插入另一台显示器之前,似乎一切正常。”似乎 Windo
我正在尝试为我的 ComboBox 提供长字符串的就地工具提示。但是,当我在工具提示上调用 SetWindowPos 时,位置永远不会改变。收到 TTN_SHOW 时调用: ::SetWindowPo
我正在努力将对话单位 (DLU) 转换为像素,但我没能做到。 我附上了一个演示问题的示例程序,一个只有一个按钮的对话框。我先解释一下:我的 .rc 文件将对话框定义为“IDD_DIALOG1 DIAL
我有一个 Windows 应用程序(我用 C# 编写的),它以无边框的最大化窗口开始。 当用户点击应用程序中的某个按钮时,我想恢复窗口(即移除最大化状态),将其调整到一定大小并将其移动到屏幕的右下角。
我们很好地使用了 SetWindowPos 来设置窗口的位置并且效果很好。 我唯一的疑虑是,如果我们正在移动的窗口最大化,那么它会移动并变成合适的大小,但是,它仍然认为自己处于最大化状态,并继续显示“
我需要打开两个 Internet 浏览器实例,每个实例都在控制台应用程序的不同监视器(有两个)中打开。我找到了 SetWindowPos 方法,但找不到使用方法。就我而言,它什么也没做…… 请帮助我正
使用 user32.dll和 C# 我写了你在下面看到的方法。使用窗口的进程句柄,它将在提供的 (x, y) 处设置窗口位置。地点。 但是,在多监视器环境中,下面的代码仅将窗口位置设置为主监视器。我也
在每次鼠标移动事件中,我都在移动我的窗口。从文档中可以看出,如果移动成功,SetWindowPos 会返回一个非零值。 我想证实我的推断,即每次 SetWindowPos 返回一个非零值时,移动都已经
我已经问过类似的问题here , 但现在问题似乎有点不同,所以我想我会为它创建一个新问题。 我正在使用 SetWindowPos() 从另一个进程移动/调整窗口大小。只要所有屏幕都使用相同的显示比例,
敲代码时,突然发现有一个背景图片无法显示,百思不得其解,最终发现是MoveWindow() SetWindowPos()这两个函数的使用不当造成的。 这里把这两个函数的前世今生给分析一下。
我有一个对话框,我想将其放置在另一个对话框中,并相对于主对话框上的其中一个控件进行定位。 void CspAceDlg::DrawResultsArea() { CWnd* pTabCtl =
好吧,我正在尝试将我的表单覆盖在另一个应用程序之上。现在,作为最后一步,我需要确保表单的 z 索引始终高于我正在覆盖的应用程序。我很确定我需要使用 SetWindowPos ( https://msd
好吧,我正在尝试将我的表单覆盖在另一个应用程序之上。现在,作为最后一步,我需要确保表单的 z 索引始终高于我正在覆盖的应用程序。我很确定我需要使用 SetWindowPos ( https://msd
我试图从创建表单的线程访问表单,但最终出现错误: Cross thread operation not valid 代码: public static void MakeTopMost(Form fo
在 SetWindowPos( hwnd, HWND_NOTOPMOST, x, y, cx, cy, SWP_SHOWWINDOW) 之后,状态先前最大化的窗口确实按预期调整大小和重新定位自身,但系
m_pMainWnd->SetForegroundWindow(); m_pMainWnd->SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE |
我正在使用 SetWindowPos 函数执行自动化任务以显示窗口。我知道 Windows 提供了两种方法来执行此操作: 同步:SetWindowPos 或 ShowWindow。 异步:SetWin
我想做的是将 handle 放在屏幕的前面和中央。把它放在前面 我知道该怎么做 我正在使用 SetForegroundWindow(IntPtr hWnd); 并且它工作正常。但是如何使用 SetWi
我正在使用 SetWindowPos 和 MoveWindow 来调整窗口大小和居中。它工作正常,但在 Windows Media Player 或控制面板等多个窗口上,当您关闭窗口并再次打开时,不会
我是一名优秀的程序员,十分优秀!