甚至是现代应用程序的最佳选择

时间:2015-06-14 20:28:48

标签: c# wpf topmost

我的录制程序始终保持TopMost,除非我打开Modern app (Windows 8)Start Screen

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

TopMost

现在,问题是在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);

1 个答案:

答案 0 :(得分:2)

只有标记为辅助功能的应用程序才能执行此操作。要实现这一目标,请遵循以下准则(摘自this article的评论部分):

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

......这不是一项微不足道的任务!