我想在Windows環境中調用用戶的屏幕保護程序(如果已定義)。 我知道它可以使用純C++代碼完成(然後在C#中打包非常簡單),如建議here。
不過,爲了好奇,我想知道這樣的任務是否可以通過使用dot net framework(2.0及以上版本)的純粹託管代碼完成,不需要p/invoke,也不需要訪問C++端(反過來,可以很容易地使用Windows API)。如何在C#中調用Windows中的屏幕保護程序?
2
A
回答
3
我的想法,我不知道怎麼一直這樣的工作,所以你就需要研究了一下,我認爲,但希望這足以讓你開始。
屏幕保護程序僅僅是一個可執行文件,並存儲在註冊表中該可執行文件的HKCU\Control Panel\Desktop\SCRNSAVE.EXE
的位置在我的Vista的拷貝,這個工作對我來說:
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
1
我想有一個.Net庫函數,這是不太可能的 - 我不知道任何。快速搜索返回此代碼項目tutorial其中包含您在問題中提到的託管包裝的示例。
P/invoke存在,因此您可以訪問操作系統特有的功能,其屏幕保護程序就是一個示例。
0
我不確定您可以使用完全託管的代碼來執行此操作。
本使用Windows的API,但還是很簡單的:Launch System Screensaver from C# Windows Form
0
上的任何版本的工作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);
}
}
}
相關問題
- 1. 如何在C++中編寫Windows屏幕保護程序?
- 2. Windows C++屏幕保護程序不會回到屏幕上
- 3. 在Windows 7中禁用並啓用屏幕保護程序
- 4. 如何在c#中創建屏幕保護程序?
- 5. Windows UWP作爲屏幕保護程序?
- 6. 如何調試OS X中的屏幕保護程序
- 7. 在C中禁用屏幕保護程序和電源選項#
- 8. 如何在WinRT中禁用屏幕保護程序
- 9. Windows XP屏幕保護程序 - 使用屏幕保護程序啓動過程死亡
- 10. 3D屏幕保護程序干擾WPF應用程序(Windows XP)
- 11. 將Java應用程序轉換爲Windows屏幕保護程序
- 12. 如何判斷屏幕保護程序是否在Qt(C/C++)程序中運行? (MS Windows)
- 13. C++爲Windows創建屏幕保護程序
- 14. 從C#Windows窗體啓動系統屏幕保護程序
- 15. 如何在android中自定義屏幕保護程序?
- 16. 如何在Delphi中進行屏幕保護程序預覽?
- 17. 如何在Xcode 4中構建屏幕保護程序?
- 18. 當在C:\ Windows \ System32中部署屏幕保護程序時拋出異常
- 19. 如何在Windows窗體中運行屏幕保護程序作爲背景?
- 20. 屏幕保護程序如何在Windows 8中繼續繪製桌面?
- 21. iPhone應用內屏幕保護程序
- 22. Android禁用屏幕保護程序
- 23. 如何在android中將應用程序設置爲屏幕保護程序?
- 24. C#:你將如何在文件系統中組織屏幕保護程序?
- 25. 允許Windows屏幕保護程序寫入程序文件中的文件
- 26. 屏幕保護程序的Android代碼
- 27. Xcode與openGL的屏幕保護程序
- 28. 如何在Mac上啓用屏幕保護程序?
- 29. 複製文件構建階段中的錯誤?屏幕保護程序複製到庫/屏幕保護程序
- 30. 用Three.JS創建Windows屏幕保護程序
你也可以很容易地從C#中調用Windows API。 – Nate 2009-05-29 20:02:38
重複(有你正在尋找的答案):http://stackoverflow.com/questions/267728/launch-system-screensaver-from-c-windows-form – mockobject 2009-05-29 20:05:19