无法将密钥发送到Windows 10中的屏幕保护程序

时间:2016-02-03 10:26:45

标签: windows delphi screensaver

如何将密钥发送到Windows 10中的屏幕保护程序。我已尝试安装自己的屏幕保护程序并禁用登录屏幕,因此我只需要按键即可显示我的桌面。我猜问题的一部分是使用不同的桌面,但即使使用链接中显示的代码,我也无法弄清楚如何向屏幕保护程序发送密钥消息。有什么建议吗?

http://www.delphipraxis.net/1059352-post7.html

2 个答案:

答案 0 :(得分:1)

这是XY Problem。您正在询问如何将密钥发送到屏幕保护程序以停用它,因此它不会干扰您要发送到其他应用程序的模拟鼠标单击。这是一个错误的问题。在应用程序忙于与其他应用程序交互时,您应该首先询问如何禁用屏幕保护程序。

您说您已禁用屏幕保护程序密码。在这种情况下,您可以让您的应用处理WM_SYSCOMMAND消息。如果消息的wParam值启用了SC_SCREENSAVE标志,则丢弃该消息而不将其传递给默认消息处理程序。然后屏幕保护程序将无法运行。这仅适用于您的应用程序当时位于前台(SC_SCREENSAVE仅发送到前台窗口),并且仅在禁用了屏幕保护程序密码时才会执行此操作:

  

如果策略启用了密码保护,屏幕保护程序将启动,无论应用程序使用SC_SCREENSAVE通知执行什么操作 - 即使无法将其传递给DefWindowProc。

如果您需要在应用不在前台时处理消息,可以通过SetWindowsHookEx()使用全局消息钩子将WM_SYSCOMMAND / SC_SCREENSAVE消息更改为{{1当被发送到系统中的任何WM_NULL时。

另一种方法(仅当屏幕保护程序尚未运行时)是使用SystemParametersInfo()HWND设置为TRUE以使系统认为屏幕保护程序已经运行所以它不会启动另一个(您可以使用SPI_SETSCREENSAVEACTIVE来检查是否正在运行)。这是一种 old-school 方法,可以避免屏幕保护程序启动,但是在Vista +以上添加安全策略等等,这可能不像以前那样好用。

另一种方法是在应用繁忙时禁用注册表中的屏幕保护程序*。将SPI_GETSCREENSAVERRUNNING值设置为HKEY_CURRENT_USER\ControlPanel\Desktop\ScreenSaveActive(只需确保在应用退出之前将其恢复)。

*如果用户在启动后立即取消屏幕保护程序,Windows甚至可以使用此技术(Vista +)。 Windows假定用户对屏幕保护程序感到恼火,因此屏幕保护程序被禁用,几分钟后重新启用。

答案 1 :(得分:1)

我放弃了这个,但我偶然发现了下面的代码

 function KillScreenSaverFunc(Handle: hwnd; Temp: LongInt): Boolean; stdcall;
 begin
   PostMessage(Handle, WM_CLOSE, 0, 0);
   KillScreenSaverFunc := TRUE;
 end;

procedure KillScreenSaver;
var
  myHDESK:hdesk;
begin
   myhdesk := OpenDesktop(Pchar('Screen-saver'), 0, FALSE,      
   DESKTOP_READOBJECTS or DESKTOP_WRITEOBJECTS);
   if myhdesk<>0 then begin
    EnumDesktopWindows(myhdesk, @KillScreenSaverFunc, 0);
          CloseDesktop(myhdesk);
 end;
end;