在 Powershell 中使用全局热键
Using global hotkeys in Powershell
我目前正在制作一个非常基本的脚本,每 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 分钟内未按下该键,脚本将执行脚本的剩余部分?因为就像现在一样,它会等到按下一个键,然后再继续。
提前致谢!
您将需要在 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++
}
我目前正在制作一个非常基本的脚本,每 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 分钟内未按下该键,脚本将执行脚本的剩余部分?因为就像现在一样,它会等到按下一个键,然后再继续。
提前致谢!
您将需要在 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++
}