2015-12-13 892 views
1

我有一个使用sendkeys的问题是Powershell。我正在尝试制作一个能够发送密钥的脚本:shift,w,a,s,d到游戏中。我想要的代码是:Powershell模拟键盘

Add-Type -AssemblyName System.Windows.Forms 
[System.Windows.Forms.SendKeys]::SendWait(+{w}{a}{s}{d}); 

但是,当我使用它,它只是发送“Wasd”。它不会改变运动,我可以看到这已经发送到游戏内控制台。

有没有一种方法可以模拟按键?

它可以通过完成使用该鼠标左键:

[email protected]' 
      [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
      public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); 
    '@ 

    $SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru 

$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0); 
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0); 

是否有键盘相似的地方?

回答

1

试试这个:

Add-Type -AssemblyName System.Windows.Forms 
[System.Windows.Forms.SendKeys]::SendWait("+") 
[System.Windows.Forms.SendKeys]::SendWait("{w}{a}{s}{d}") 

wasd结果,所以我想它的工作。

3

sendKeys方法似乎一次不支持多个字符,所以您需要自动将多个密钥发送到sendkeys方法。

经过一番思考,这就是我想出的。

Add-Type -AssemblyName System.Windows.Forms  
timeout 3 
'WASD'.ToCharArray() | ForEach-Object {[System.Windows.Forms.SendKeys]::SendWait($_)} 

这里的结果:

Send keys with PowerShell, awesome![1]

现在,对于一个行由行发生的事情的:

  • 添加型,像之前。
  • 接下来,一个三秒钟的超时消息,其中我快速双击并打开记事本。
  • 最后,我使用字符'WASD'创建一个字符串,然后调用系统字符串.ToCharArray()方法,该方法将字符串转换为字符数组。现在我正在使用W,A,S,D而不是WASD。

对于每个对象(每个字母,W,A,S和D),我打电话给SendWait()静态方法。在ForEach脚本块中,$_符号用于引用当前对象。

这是我可以提出的最简洁易懂的方法。

+0

Hmmm'[System.Windows.Forms.SendKeys] :: SendWait(“{t} {y} {p} {e} {t} {h} {i} {s} {p} {l} { e} {a} {s} {e}“)'在这里工作 – sodawillow

+0

谢谢@FoxDeply您的回复,唯一的问题是,这并不能解决我的问题。游戏似乎不接受SendWait方法。我的球员不停止移动。但是当我打开聊天窗口之类的东西时,它会输入WASD。我认为它必须更像我发送的第二个代码,因为游戏将它作为“真实”输入来接受。 – heroicis23

+0

编辑^:第二个代码在游戏中工作,但只适用于鼠标...... – heroicis23