【问题标题】:Top most even for Modern Apps即使是现代应用程序也是最高的
【发布时间】:2015-06-14 20:28:47
【问题描述】:

我有一个录音程序,它一直保持TopMost,除非我打开Modern app (Windows 8)Start Screen

可以使桌面应用程序保持在现代应用程序之上,例如Magnifying Glass 工具:

现在,问题是在 WPF 窗口中使用 TopMost 选项和/或 API 调用不适用于现代应用程序。

我正在尝试什么:

static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
static readonly IntPtr HWND_TOP = new IntPtr(0);
static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

//OnLoaded event handler:

var source = PresentationSource.FromVisual(this) as HwndSource;
SetWindowPos(source.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);

【问题讨论】:

  • 这是不可能的。就像您不能在全屏 DirectX 游戏上显示窗口一样。也许在 Windows 10 中,还没玩过。
  • 但是示例图像发生了什么? Win32 应用程序运行在一切之上。

标签: c# wpf topmost


【解决方案1】:

只有标记为辅助功能相关的应用程序才能执行此操作。要实现它,请遵循以下准则(取自 this article 的 cmets 部分):

  1. 应用程序必须要求 uiAccess (app.manifest)
  2. 应用程序必须声明“最顶层”窗口定位(在 Win32/SetWindowPos 或 WinForms/WPF 的“最顶层”属性中, 以编程方式或其他方式)
  3. 在不更改组策略设置的情况下,必须将其安装到某个受信任的位置 [C:\Windows、C:\Program Files、 C:\Program 文件 (x86)]。一种。注意:如果您希望能够运行它 对于任意位置,您必须禁用安全设置:“用户 帐户控制:仅提升已安装的 UIAccess 应用程序 在安全的地方”。湾。注2:与设置相同 HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\ValidateAdminCodeSignatures 到 0
  4. 无法在调试器中运行所述应用程序
  5. 如果是 .NET 应用程序 a.清单必须嵌入在构建后步骤 b 中。申请必须有“延迟签名” (这意味着它不能从内置调试器中运行,尽管您可以 构建和附加——这就是微软所做的)
  6. 应用程序必须使用受信任的证书进行签名。
  7. 必须将所述受信任证书安装到受信任的根证书颁发机构(这很重要!它不能只是简单地 已安装)有关更多信息,请参阅: http://msdn.microsoft.com/en-us/library/ms726294

...这不是一件小事!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2015-01-06
    • 2014-05-27
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多