を隠された直後にコードを実行する方法。これは、デスクトップの一部をカバーしないように右、その前に私は、私のアプリのWindow
を隠す:WPF - ウィンドウがIは、デスクトップのスクリーンショットを撮る私のアプリでは
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);
}
だから、フェードアウト効果の横に、問題が残っています。
あなたは(.aspxのhttps://msdn.microsoft.com/en-us/library/system.windows.window.deactivated(V = vs.110))、単純な[OnDeactivated]を試してみましたか?または[OnStateChanged](https://msdn.microsoft.com/en-us/library/system.windows.window.statechanged(v = vs.110).aspx)フィルタを「最小化」状態でチェックしていますか? – quetzalcoatl
@quetzalcoatl:私はWindow.Deactivatedイベントハンドラからスクリーンショットを取ろうとしました。結果は同じです。私は、ウィンドウを最小化したくないので、StateChangedから試してみませんでした。 – Bohoo
@Bohoo 'TakeScreenShot'がどのように見えるのか教えていただけますか? – Gopichandar