SendKeys.send 正在发送密钥,但应用程序并未将此密钥解释为命令

问题描述

我正在使用 SendKeys 向程序发送击键。

这是我的代码

   If whandle <> 0 Then
        User32.SetForegroundWindow(whandle)
        System.Windows.Forms.SendKeys.Send("+")
    End If

(我也试过 SendWait() 而不是 Send()

这是 Spy++ 显示的我的窗口层次结构:

Spy++ window hierachy

虽然我可以通过标题找到窗口句柄并使用 User32.findwindowex 循环遍历子对象,但在调试时我只输入 spy++ 所示的窗口句柄(从十六进制转换为十进制),我发现:

  • 找到正确的窗口并将其置于最前面。
  • 但是这个名为 MetaTrader 的特定程序没有任何反应(如果我使用记事本,窗口键是用记事本写的)。

所以我想我有以下问题之一:

  1. 我在窗口和子窗口上做错了(我真的不认为这会发生,因为我尝试了 Spy++ 显示的所有句柄)。
  2. SendKey("+") 与在窗口处于活动状态时按下“+”键并不完全相同,并且存在一些差异。

调用 User32.SetForegroundWindow(whandle) 后,如果我真的按下了“+”键,就会出现所需的效果,即放大,但不是在我的程序执行 SendKeys 时。我还尝试使用其他生成命令的键,例如 Q 或 A(所有这些都是简单的键和字母)。

解决方法

来自MS Docs

加号 (+)、脱字符 (^)、百分号 (%)、波浪号 (~) 和 括号 () 对 SendKeys 有特殊意义。指定其中之一 这些字符,将其括在大括号 ({}) 中。例如,到 指定加号,使用“{+}”

System.Windows.Forms.SendKeys.Send("{+}")