В моем приложении я делаю снимок экрана рабочего стола. Прямо перед тем, что я скрыть мое приложение в Window
, поэтому он не будет покрывать часть рабочего стола:WPF - как запустить код сразу после того, как окно скрыто
MainWindow.Hide();
TakeScreenShot();
Проблема заключается в том, что иногда окно не получает скрытый достаточно быстро, так что я в конечном итоге принимает скриншот него слишком , Я попытался сделать снимок экрана с обработчика события Window.IsVisibleChanged
, но результат тот же.
Конечно, я могу использовать Thread.Sleep
или аналогичный, но я ищу лучшее решение.
Update
Я только что перешел на Aero тему и включен композицию рабочего стола, а сейчас ситуация еще хуже. Теперь окно «исчезает» вместо мгновенного скрытия при вызове Window.Hide
. Итак, теперь мое приложение всегда сделало снимок экрана из окна затухания ... Я попробую winapi с SetWindowPos
или ShowWindow
и опубликует обновление.
Обновление 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] (https://msdn.microsoft.com/en-us/library/system.windows.window.deactivated (v = vs.110) .aspx)? или [OnStateChanged] (https://msdn.microsoft.com/en-us/library/system.windows.window.statechanged (v = vs.110) .aspx) с проверкой фильтра 'minimized' state? – quetzalcoatl
@quetzalcoatl: Я попытался снять скриншот из Window.Deactivated обработчика событий. Результат тот же. Я не пытался из StateChanged, потому что я не хочу минимизировать окно. – Bohoo
@Bohoo вы можете рассказать мне, как выглядит ваш «TakeScreenShot»? – Gopichandar