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