当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 用于保持屏幕活动的 PowerShell 脚本 [3 种方法]

作者:精品下载站 日期:2024-12-14 05:30:25 浏览:13 分类:玩电脑

用于保持屏幕活动的 PowerShell 脚本 [3 种方法]


[玩转系统] 用于保持屏幕活动的 PowerShell 脚本 [3 种方法]

使用 while 循环和 SendKeys() 方法

使用 while 循环无限次调用 SendKeys() 方法,以使用 PowerShell 保持 PC/笔记本电脑屏幕处于活动状态。

将 while 循环与 SendKeys() 方法结合使用:

$wScriptShellObj = New-Object -Com "Wscript.Shell"
while (1) {
    $wScriptShellObj.SendKeys(".")
    Sleep 2
}

在这里,我们使用 New-Object cmdlet 使用 COM(组件对象模型)技术创建 WSH(Windows Script Host)Shell 对象的实例,并将其存储在 $wScriptShellObj。该对象允许脚本与 Windows shell 交互并运行不同的 shell 命令。

然后,我们使用 while(1) 进入无限循环,使其保持运行,直到使用 Ctrl+C 终止脚本。在循环内部,我们使用了 $wScriptShellObj 对象的 SendKeys() 方法,该方法每 . 发送到活动应用程序一次>2 秒。如果我们打开 NotePad,脚本会在那里输入点,如果我们打开 NotePad++,它会在那里打印点。

SendKeys() 方法模拟击键,就像用户键入/输入一样。每次击键后,脚本都会使用 Sleep 命令暂停 2 秒,然后继续执行 while 循环的下一次迭代。这样,我们就可以保持电脑屏幕处于活动状态。

使用 while 循环和 SendWait() 方法

使用 while 循环无限次调用 SendWait() 方法,以使用 PowerShell 保持 PC/笔记本电脑屏幕处于活动状态。按 Ctrl+C 终止脚本。

将 while 循环与 SendWait() 方法结合使用:

while ($true) {
    [void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
    [System.Windows.Forms.SendKeys]::SendWait("{NUMLOCK}")
    Start-Sleep -Seconds 2
}

同样,我们使用了可以无限运行的 while 循环,因为条件 $true 始终为 True。在 while 循环中,我们使用了 System.Reflection.Assembly 类的 LoadWithPartialName() 方法。请记住,[System.Reflection.Assembly] 引用了 .NET 中的 System.Reflection.Assembly 类,该类提供了处理程序集的属性和方法。

我们通过指定 'System.Windows.Forms' 作为参数来使用 LoadWithPartialName() 方法来加载 System.Windows.Forms 程序集进入当前的 PowerShell 会话。 [void] 转换用于丢弃 LoadWithPartialName() 方法调用的任何值或输出。此外,它还用于抑制加载装配时产生的任何值。

为什么我们要加载System.Windows.Forms程序集?强制加载是为了确保 System.Windows.Forms.SendKeys 类可供使用并提供模拟击键的方法。

现在,我们使用 System.Windows.Forms.SendKeys 类的 SendWait() 方法来模拟按下 NumLock 键。此处,"{NUMLOCK}" 字符串作为参数传递给 SendWait() 方法;该字符串参数指定要发送的击键序列。

之后,我们使用 Start-Sleep cmdlet 休眠两秒钟。此 cmdlet 确保循环内的语句每两秒执行一次。这样,我们可以通过模拟击键并将其发送到活动窗口或应用程序来防止我们的 PC/笔记本电脑进入睡眠模式或屏幕锁定。

使用 keybd_event() 方法

使用 keybd_event() 方法通过 PowerShell 无限地保持 PC/笔记本电脑屏幕处于活动状态。按 Ctrl+C 停止此脚本。

使用 keybd_event() 方法:

$pInvokeSignature = @'
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
'@

Add-Type -MemberDefinition $pInvokeSignature -Namespace Win32Functions -Name KeyboardFunctions

while ($true) {
    [Win32Functions.KeyboardFunctions]::keybd_event(0x90, 0, 0, 0)
    [Win32Functions.KeyboardFunctions]::keybd_event(0x90, 0, 2, 0)
    Start-Sleep -Seconds 2
}

首先,我们在 C# 中为 user32.dll 中的 keybd_event() 定义了一个 PInvoke 签名。此签名存储在 $pInvokeSignature 变量中,该变量允许使用 Add-Type cmdlet 从 PowerShell 调用 keybd_event() 函数。在深入了解 Add-Type 及后续内容之前,让我们先分解一下签名来理解它。

为了定义签名,我们使用了 @''@ 构造(称为逐字字符串文字)来定义多行字符串,而无需解释转义序列或转义特殊字符。 @''@ 用于在 PowerShell 中开始和结束逐字字符串。它们之间的所有内容都被视为文字字符串,包括特殊字符和换行符。

接下来,[DllImport("user32.dll")] 指定将从 user32.dll 库导入 keybd_event() 方法。之后,我们声明了 keybd_event() 方法及其签名。以下是 keybd_event() 函数声明的不同组成部分的简要说明:

  • public 指定该函数可以在类外部访问。
  • static 表示该函数是该类的一个static 方法,无需实例化该类即可访问。
  • extern表示该函数是外部实现的;在上面的示例中,它是在 user32.dll 库中实现的。
  • void 是函数的返回类型,表明 keybd_event() 不会返回任何值。
  • byte bVk 是一个 byte 类型参数,表示我们想要模拟的给定按键的虚拟按键代码。
  • byte bScan是一个byte类型参数,显示必须模拟的按键的硬件扫描代码。
  • uint dwFlags 的类型为 unit(无符号整数),表示控制按键事件的附加标志。
  • uint dwExtraInfo 也是 uint(无符号整数)类型,用于与击键相关的额外信息。

我们使用 Add-Typecmdlet 将自定义 C# 类型 (KeyboardFunctions) 添加到当前 PowerShell 会话。该类型在 Wind32Functions 命名空间中定义,并具有 keybd_event() 函数的 PInvoke 声明。我们在 Add-Type cmdlet 中使用了各种参数:

  • 我们使用 -Name 参数来提及自定义 C# 类型。
  • -Namespace 参数用于指定命名空间的名称。
  • -MemberDefinition 参数用于写入 PInvoke 签名变量 ($pInvokeSignature)。

之后,我们使用了 while 循环,由于指定了 $true 条件,该循环始终为 true。在循环内,我们调用了 keybd_event() 方法并传递了四个参数,解释如下:

  1. 0x90 表示 NUMLOCK 键的虚拟键代码;您可以在这里找到更多虚拟代码。
  2. 0 是硬件扫描码。
  3. 0 表示 KEYEVENTF_KEYDOWN 标志,表示按键被按下。
  4. 第四个参数是 0 因为我们不需要有关击键的附加信息。

我们再次使用 0x90020 调用 keybd_event() 方法code> 作为第一个、第二个、第三个和第四个参数。与第一次调用 keybd_event() 函数相同,但不包括第三个参数,即 2,表示 KEYEVENTF_KEYUP 标志,意味着钥匙被释放了。

然后,我们使用 Start-Sleep cmdlet 将脚本执行暂停 2 秒,这是使用 -Seconds 参数指定的。 这样,我们模拟了每两秒无限次按下和释放 NUMLOCK 键,以防止 PC 进入睡眠模式。

keybd_event() 函数可用,但在较新版本的 Windows 中被取代,因此建议使用替代方法;例如,我们在本文前面学到的 SendKeys()SendWait() 方法。

这就是用于保持屏幕活动的 powerShell 脚本的全部内容。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯