C#でのWindowsでのスクリーンセーバーを起動するには?
-
06-09-2019 - |
質問
私は、ユーザーのスクリーンセーバーを起動したいと思います。
私が示唆したように、それは、(その後、C#でのラッピングは非常に簡単です)、純粋なC ++コードを使用して行うことができます知っている<のhref =「http://bobmoore.mvps.org/Win32/w32tip22.htm」のrel = "nofollowをnoreferrer">ここを。
さらに、好奇心のために、私は、pなし/(これは、で起動し、C ++側を訪問することなく、そのようなタスクは、ドットネットフレームワーク(バージョン2.0以上)を使用して、純粋にマネージコードで実現することができるかどうかを知りたいです)かなり簡単にWindowsのAPIを使用することができ、電源を入れます。
解決
私は考えてきた、私はあなたが私が考える少しを研究する必要があると思いますので、これは、どのように動作するか一貫わからないんだけど、うまくいけば、それはあなたが始めるために十分です。
スクリーンセーバーはちょうど実行可能であり、レジストリがHKCU\Control Panel\Desktop\SCRNSAVE.EXE
この実行可能ファイルの場所を記憶する
ビスタの私のコピーでは、これは私のために働いてます:
RegistryKey screenSaverKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop");
if (screenSaverKey != null)
{
string screenSaverFilePath = screenSaverKey.GetValue("SCRNSAVE.EXE", string.Empty).ToString();
if (!string.IsNullOrEmpty(screenSaverFilePath) && File.Exists(screenSaverFilePath))
{
Process screenSaverProcess = Process.Start(new ProcessStartInfo(screenSaverFilePath, "/s")); // "/s" for full-screen mode
screenSaverProcess.WaitForExit(); // Wait for the screensaver to be dismissed by the user
}
}
他のヒント
私はこれを行うの.NETライブラリの機能を有する可能性は極めて低いと思います。クイック検索は、マネージラッパーの例が含まれています。このコードプロジェクトチュートリアルを返さあなたは、あなたの質問に言及している。
あなたはスクリーンセーバーは一例であり、そのOS固有の機能にアクセスすることができるしているように、P /呼び出しが存在します。
私はあなたがこれを行うには、完全にマネージコードを使用することができるかわからない。
これは、Windows APIを使用していますが、それでも非常に簡単です:のC#からシステムのスクリーンセーバーを起動しますWindowsフォームの
ウィンドウの任意のバージョンに取り組んで...
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace HQ.Util.Unmanaged
{
public class ScreenSaverHelper
{
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
private static extern IntPtr GetDesktopWindow();
// Signatures for unmanaged calls
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool SystemParametersInfo(int uAction, int uParam, ref int lpvParam, int flags);
// Constants
private const int SPI_GETSCREENSAVERACTIVE = 16;
private const int SPI_SETSCREENSAVERACTIVE = 17;
private const int SPI_GETSCREENSAVERTIMEOUT = 14;
private const int SPI_SETSCREENSAVERTIMEOUT = 15;
private const int SPI_GETSCREENSAVERRUNNING = 114;
private const int SPIF_SENDWININICHANGE = 2;
private const uint DESKTOP_WRITEOBJECTS = 0x0080;
private const uint DESKTOP_READOBJECTS = 0x0001;
private const int WM_CLOSE = 16;
public const uint WM_SYSCOMMAND = 0x112;
public const uint SC_SCREENSAVE = 0xF140;
public enum SpecialHandles
{
HWND_DESKTOP = 0x0,
HWND_BROADCAST = 0xFFFF
}
public static void TurnScreenSaver(bool turnOn = true)
{
// Does not work on Windows 7
// int nullVar = 0;
// SystemParametersInfo(SPI_SETSCREENSAVERACTIVE, 1, ref nullVar, SPIF_SENDWININICHANGE);
// Does not work on Windows 7, can't broadcast. Also not needed.
// SendMessage(new IntPtr((int) SpecialHandles.HWND_BROADCAST), WM_SYSCOMMAND, SC_SCREENSAVE, 0);
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, (IntPtr)SC_SCREENSAVE, (IntPtr)0);
}
}
}