2

我目前正在制作一个非常基本的脚本,每 10 分钟对计算机进行一次屏幕截图。但是,我现在被要求添加单击热键以手动激活它的选项。

我发现了这一点,这基本上对我有一些帮助:

Add-Type -TypeDefinition '
using System;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace KeyLogger {
  public static class Program {
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;

    private static HookProc hookProc = HookCallback;
    private static IntPtr hookId = IntPtr.Zero;
    private static int keyCode = 0;

    [DllImport("user32.dll")]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll")]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll")]
    private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("kernel32.dll")]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    public static int WaitForKey() {

        hookId = SetHook(hookProc);
        Application.Run();
        UnhookWindowsHookEx(hookId);
        return keyCode;

    }

    private static IntPtr SetHook(HookProc hookProc) {
          IntPtr moduleHandle = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
          return SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, moduleHandle, 0);
    }

    private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
          if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) {
            keyCode = Marshal.ReadInt32(lParam);
            Application.Exit();
      }
      return CallNextHookEx(hookId, nCode, wParam, lParam);
    }
  }
}
' -ReferencedAssemblies System.Windows.Forms

DO
{
    $IsTrue = $true
    while ($IsTrue -eq $true) {        
        $key = [System.Windows.Forms.Keys][KeyLogger.Program]::WaitForKey()
        if ($key -eq "F2") {
            
            #Do something
            
            $IsTrue = $false
        }
    }

} Until ($SomeValue -eq $true)

问题是,我如何进行这项工作,以便如果在 10 分钟内没有按下该键,那么脚本将执行脚本的其余部分?因为就像现在一样,它会等到某个键被按下,然后再继续。

提前致谢!

4

1 回答 1

0

您将在 while 循环中需要以下内容。柜台将在 10 分钟后爆发

DO
{
#$i makes a timer / counter
    $i = 0
    $IsTrue = $true
    while ($IsTrue -eq $true) {        
        $key = [System.Windows.Forms.Keys][KeyLogger.Program]::WaitForKey()
#at 600 seconds or 10 mins the $i counter will break this loop.
        if ($key -eq "F2" -or $i -eq 600) {
            
            #Do something
            
            $IsTrue = $false
        }

#Sleep waits a second
        Start-Sleep -Seconds 1
#Counter $i adds 1
        $I++
    }

} Until ($SomeValue -eq $true)

以下适用于时间和 F2

#$i makes a timer / counter
$i = 0
$IsTrue = $true
while ($IsTrue -eq $true) {  
    If ([Console]::KeyAvailable -or $i -eq 30) {
        [Console]::ReadKey('F2') | Out-Null
        $IsTrue = $false
    }
    Start-Sleep -Seconds 1
    #Counter $i adds 1
    $I++
}
于 2022-02-17T14:22:31.710 回答