powershell - 如何在 Powershell 中创建宏(不是 excel)?
问题描述
我需要对某些特定的击键和鼠标单击进行宏化,Powershell 将是一种更可取的语言。
下面的代码是从 Stackoverflow 复制的,它使我能够使用鼠标和键盘。
$cSource = @'
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class Clicker
{
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
public int type; // 0 = INPUT_MOUSE,
// 1 = INPUT_KEYBOARD
// 2 = INPUT_HARDWARE
public MOUSEINPUT mi;
}
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
public int dx ;
public int dy ;
public int mouseData ;
public int dwFlags;
public int time;
public IntPtr dwExtraInfo;
}
//This covers most use cases although complex mice may have additional buttons
//There are additional constants you can use for those cases, see the msdn page
const int MOUSEEVENTF_MOVED = 0x0001 ;
const int MOUSEEVENTF_LEFTDOWN = 0x0002 ;
const int MOUSEEVENTF_LEFTUP = 0x0004 ;
const int MOUSEEVENTF_RIGHTDOWN = 0x0008 ;
const int MOUSEEVENTF_RIGHTUP = 0x0010 ;
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ;
const int MOUSEEVENTF_MIDDLEUP = 0x0040 ;
const int MOUSEEVENTF_WHEEL = 0x0080 ;
const int MOUSEEVENTF_XDOWN = 0x0100 ;
const int MOUSEEVENTF_XUP = 0x0200 ;
const int MOUSEEVENTF_ABSOLUTE = 0x8000 ;
const int screen_length = 0x10000 ;
//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
public static void LeftClickAtPoint(int x, int y)
{
//Move the mouse
INPUT[] input = new INPUT[3];
input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);
input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);
input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE;
//Left mouse button down
input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
//Left mouse button up
input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(3, input, Marshal.SizeOf(input[0]));
}
}
'@
Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Windows.Forms,System.Drawing
$wshell = New-Object -ComObject wscript.shell;
使用给定的代码,我可以使用以下命令:
[System.Windows.Forms.SendKeys]::SendWait('%{TAB}')
[Clicker]::LeftClickAtPoint(600,600)
$wshell.SendKeys('f')
理想情况下,这将 ALT+TAB 到我的上一个窗口,单击位置 600,600,然后按 F 键但是它不起作用,因为切换窗口后,powershell 会返回代码并用光标按下 ISE。
我需要关于如何在另一个窗口中自动执行鼠标点击、移动和键盘点击的建议或一些代码片段。
先感谢您。
解决方案
推荐阅读
- ruby-on-rails - 将 ngnix rails conf 转换为 apache
- ios - iOS 静默推送通知
- python - 如何在 Scrapy 中使用 response.XPath 从多个标签中提取文本数据?
- python - __str__ python 方法问题
- python - 使用python提取最后修改日期,git存储库中文件的作者
- apache-camel - camel-salesforce-maven-plugin - 找不到骆驼-salesforce 前缀
- ruby-on-rails - 如何在 AMP-autosuggest (Rails 5) 中解析自定义(无密钥)响应
- r - 当 selectinput(multiple=T) 时,dataTableOutput 中显示的列名不正确 - 闪亮
- javascript - 谷歌应用脚本遍历对象
- vue.js - Vue.js 迭代中的打印键