【发布时间】:2016-08-21 20:54:31
【问题描述】:
在我的应用程序中,我截取了桌面的屏幕截图。在那之前我隐藏了我的应用程序的Window,所以它不会覆盖部分桌面:
MainWindow.Hide();
TakeScreenShot();
问题是有时窗口隐藏得不够快,所以我最终也截取了它。我尝试从Window.IsVisibleChanged 事件处理程序中截取屏幕截图,但结果是一样的。
当然,我可以使用Thread.Sleep 或类似的,但我正在寻找更好的解决方案。
更新
我刚刚切换到 Aero 主题并启用了桌面合成,现在情况更糟。现在窗口“淡出”而不是在调用Window.Hide 时立即隐藏。所以现在我的应用程序总是截取渐变窗口的屏幕截图...我将尝试使用 SetWindowPos 或 ShowWindow 的 winapi 并发布更新。
更新 2
ShowWindow和SetWindowPos给出与Window.Hide相同的结果(Window.Hide在内部使用ShowWindow(HWND, SW_HIDE))。为了在隐藏窗口时禁用淡出效果,我使用
DwmSetWindowAttribute。
像这样:
using System.Windows.Interop;
using System.Runtime.InteropServices;
[DllImport("dwmapi.dll")]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
private const int DWMWA_TRANSITIONS_FORCEDISABLED = 3;
在Window.Loaded 事件处理程序中:
if (Environment.OSVersion.Version.Major >= 6) {
IntPtr WinHandle = new WindowInteropHelper(this).Handle;
int BOOL_TRUE = 1;
int HR = DwmSetWindowAttribute(WinHandle, DWMWA_TRANSITIONS_FORCEDISABLED, BOOL_TRUE, Marshal.SizeOf(BOOL_TRUE));
if (HR != 0)
Marshal.ThrowExceptionForHR(HR);
}
所以除了淡出效果之外,问题依然存在。
【问题讨论】:
-
你试过简单的OnDeactivated吗?或OnStateChanged 过滤器检查
minimized状态? -
@quetzalcoatl:我试图从 Window.Deactivated 事件处理程序中截取屏幕截图。结果是一样的。我没有从 StateChanged 尝试,因为我不想最小化窗口。
-
@Bohoo 你能告诉我你
TakeScreenShot的样子吗? -
您是否尝试将窗口的可见性更改为 Window.Visibility = Visibility.Collapsed?尝试使用 Window.Deactivated 事件处理程序再次执行此操作。
-
@Gopichandar:我使用 System.Drawing.Graphics.CopyFromScreen
标签: c# wpf windows winapi window