デスクトップ全体を一時的に暗転させたい (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() でエラーの内容が取得できるのだそうだ。

一つ賢くなった。