デスクトップ全体を一時的に暗転させたい (2)
デスクトップ全体を一時的に暗転させたい - だるろぐ がなぜか動かんなぁ、と思っていろいろ試していた(08式机上撮影機 v1.5.0 - だるろぐ)のだけど、原因は FormWindowState.Maximized だったっぽい。これをコメントアウトすると動いた。
public const int AW_HIDE = 0x10000; public const int AW_ACTIVATE = 0x20000; public const int AW_SLIDE = 0x40000; public const int AW_BLEND = 0x80000; public const int AW_HOR_POSITIVE = 0x00000001; public const int AW_HOR_NEGATIVE = 0x00000002; public const int AW_VER_POSITIVE = 0x00000004; public const int AW_VER_NEGATIVE = 0x00000008; public const int AW_CENTER = 0x00000010; [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int AnimateWindow( IntPtr hWnd, int dwTime, int dwFlags); using (var form = new Form() { BackColor = Color.Black, ShowInTaskbar = false, TopMost = true, // WindowState = FormWindowState.Maximized, <- 諸悪の根源! Left = 0, Top = 0, Width = Screen.PrimaryScreen.Bounds.Width, Height = Screen.PrimaryScreen.Bounds.Height, FormBorderStyle = FormBorderStyle.None, }) { int result = 0; const int interval = 200; result = AnimateWindow(form.Handle, interval, AW_BLEND | AW_ACTIVATE); if (result != 0) Debug.WriteLine( Marshal.GetLastWin32Error()); form.Show(); if (settings.SoundEnabled && File.Exists("PrintScreen.wav")) new SoundPlayer("PrintScreen.wav").Play(); result = AnimateWindow(form.Handle, interval, AW_BLEND | AW_HIDE); if (result != 0) Debug.WriteLine( Marshal.GetLastWin32Error()); form.Hide(); }
調べてる時に知ったのだけど、Wind32 API を DllImport するときに SetLastError = true を指定しておけば、GetLastError() を利用しなくてもマネージドな Marshal.GetLastWin32Error() でエラーの内容が取得できるのだそうだ。
一つ賢くなった。