我有一个记录程序,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);
Run Code Online (Sandbox Code Playgroud)
只有标记为辅助功能相关的应用程序才能执行此操作。要实现这一目标,请遵循以下准则(摘自本文的评论部分):
\n\n\n\n\n\n
\n- 应用程序必须要求 uiAccess (app.manifest)
\n- 应用程序必须断言 \xe2\x80\x9ctopmost\xe2\x80\x9d 窗口定位(在 Win32/SetWindowPos 或 WinForms/WPF\xe2\x80\x99s \xe2\x80\x9cTopmost\xe2\x80\x9d 属性中,\n以编程方式或其他方式)
\n- 在不更改组策略设置的情况下,必须将其安装到某个受信任位置 [C:\\Windows、C:\\Program Files、\n C:\\Program Files (x86)]。A。注意:如果您希望能够在任意位置运行它,则必须禁用安全设置:\xe2\x80\x9cUser\n 帐户控制:仅提升安装在安全位置\n 的 UIAccess 应用程序\n xe2\x80\x9d。b. 注意2:这与设置\n HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\ValidateAdminCodeSignatures\n 为 0 相同
\n- 所述应用程序无法在调试器中运行
\n- 如果它\xe2\x80\x99 是一个.NET 应用程序 清单必须嵌入到构建后步骤 b. 应用程序必须具有\xe2\x80\x9c延迟签名\xe2\x80\x9d\n(这意味着它不能从内置调试器运行,尽管您可以\n构建并附加\xe2\x80\x93,这就是Microsoft做)
\n- 应用程序必须使用受信任的证书进行签名。
\n- 所述受信任的证书必须安装到受信任的根证书颁发机构(这很重要!它不能只是简单地\n安装)有关详细信息,请参阅:\n http://msdn.microsoft.com/en-us/library/ms726294
\n
...这确实不是一项简单的任务!
\n