2009-05-29 25 views
2

Windows環境で、ユーザーのスクリーンセーバーが定義されている場合は、そのスクリーンセーバーを呼びたいと思っています。 hereのように、純粋なC++コードを使用して(そしてC#でのラッピングはかなりシンプルに)行うことができます。
しかし、好奇心のために、私はそのようなタスクが純ネット管理フレームワーク(バージョン2.0以上)を使用し、p/invokeなしで、C++側を訪れずに純粋に管理されたコードによって達成できるかどうかを知りたいと思います、簡単にWindows APIを使用することができます)。C#でWindowsでスクリーンセーバーを呼び出す方法は?

+0

Windows APIをC#からも簡単に呼び出すことができます。 – Nate

+0

重複しています(お探しの答えがあります):http://stackoverflow.com/questions/267728/launch-system-screensaver-from-c-windows-form – mockobject

+0

詐欺ではない - 問題は、 p/invoke。 –

答えて

3

私はアイデアをした、うまくいけば、私はこれがどのように動作するか一貫わからないので、あなたは、私が考える少しを研究する必要があると思いますが、それはあなたを始めさせるのに十分です。

スクリーン・セーバーは、単に実行可能であり、レジストリはビスタの私のコピーに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 
    } 
} 
1

私はこれを行うネットライブラリ機能を持つとは思わない - 私は気づいていない。クイック検索では、このコードプロジェクトtutorialが返されました。これには、あなたの質問に記載されている管理対象ラッパーの例が含まれています。

P/invokeが存在し、OS特有の機能(スクリーンセーバーがその一例です)にアクセスできるようになりました。

0

これを行うために完全に管理されたコードを使用できるかどうかはわかりません。

これは、Windows APIを使用していますが、それでも非常に簡単です:Launch System Screensaver from C# Windows Form

0

ウィンドウ...

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); 
     } 
    } 
} 
関連する問題