だるろぐ

明日できることは、今日しない。

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

一つ賢くなった。