Vba SendKeys并不总是通过ProcessId将要AppActivate的键宏发送到另一个进程

Vba SendKeys并不总是通过ProcessId将要AppActivate的键宏发送到另一个进程,vba,vb.net,visual-studio,visual-studio-2019,sendkeys,Vba,Vb.net,Visual Studio,Visual Studio 2019,Sendkeys,任务:编写一个程序,单击时只显示3个按钮,模拟在另一个窗口中按组合键(宏Ctrl+Z) 我做了什么:我的代码: 公共类表单1 Dim FigmaWindowName作为字符串 暗淡过程 公共分新() '初始化形式 初始化组件() "顶位", 最顶端=真 端接头 私有子按钮nundo\u单击(发送者作为对象,e作为事件参数)处理按钮nundo。单击 processs=GetObject(“winmgmts:”).InstancesOf(“Win32_进程”) 对于流程中的每个流程 如果StrCom

任务:编写一个程序,单击时只显示3个按钮,模拟在另一个窗口中按组合键(宏Ctrl+Z)

我做了什么:我的代码:

公共类表单1
Dim FigmaWindowName作为字符串
暗淡过程
公共分新()
'初始化形式
初始化组件()
"顶位",
最顶端=真
端接头
私有子按钮nundo\u单击(发送者作为对象,e作为事件参数)处理按钮nundo。单击
processs=GetObject(“winmgmts:”).InstancesOf(“Win32_进程”)
对于流程中的每个流程
如果StrComp(Process.Name,“Figma.exe”,vbTextCompare)=0,则
'使用其进程ID激活窗口。。。
使用CreateObject(“WScript.Shell”)
.AppActivate(进程.ProcessId)
.SendKeys(“^z”)
以
“我们找到了我们的流程。不需要更多的迭代。。。
退出
如果结束
下一个
“……其他按钮
端接头
末级
问题:不稳定。如果不起作用,则单击时两个窗口都会闪烁,并且组合键不会发送到其他应用程序


问题我做错了什么?

首先,我不相信有一个稳定的应用程序可以使用“发送密钥”。但是如果这是实现自动化的唯一方法,那么这里有一些额外的代码检查

Dim wShell = CreateObject("WScript.Shell")

Dim isWindowActive As Boolean = False
Do 
    'AppActivate will return true when window is really active'
    isWindowActive = wShell.AppActivate(Process.ProcessId) 
    WScript.Sleep 100
Loop Until isWindowActive 
wShell.sendKeys("(^z)")

不,这不是唯一的办法。但我不知道其他的方法。。。您可以描述其他方式或发送示例吗?您可以尝试使用AutoIt,使用发送键工作非常稳定,使用简单。或者更复杂-如果您熟悉win API,您可以尝试使用UIAutomationClient解决您的任务。哇,我尝试使用AutoItX3结束它工作正常,但我不确定这段代码是否正确(我说的是单击后运行):它实际上不需要睡眠。它应该处理等待。剩下的看起来不错还有一个。。。也许你知道。AutoItX3的func.Run().WinWaitActive()在x64 Windows中不起作用,我的应用程序崩溃。路径和名称正确。也许你上次能帮我