我有一个Word VBA过程,它需要异常长的时间来完成书签跳转(可能代码会第二次打开包含文档的小而多的框架,第一次定位函数调用大约需要6秒(。
然后,代码发送按键并移动鼠标,以在免费软件窗口中执行简单操作(CodeTwo QR…(。为了使序列正常工作,我必须插入睡眠代码行。因此,整个操作是缓慢的。
但是,任何其他按键或鼠标移动都会干扰代码并导致错误(例如,当鼠标不在单击按钮的精确位置时(。因此,我正在寻找一种方法来抑制来自用户的任何无意干扰。注意,代码是通过点击控制按钮启动的,用户的手仍然放在鼠标上…
SetWindowsHookEx((似乎是可能的。不需要回调捕获的垃圾(这些函数似乎没有在VBA中实现(。但我是一个业余程序员,不知道如何实现这一点。非常欢迎您尝试一段代码,提前感谢!
当然,PowerShell命令最终也会有所帮助。我在Reddit上看到了以下代码,但它需要以管理员身份运行(这可能来自vba吗?(,即使这样,它也不会执行任何操作,并在<1s,而鼠标仍在移动,按键进一步进入编辑器…
param([switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated) {
# tried to elevate, did not work, aborting
} else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}
'running with full privileges'
$code = @"
[DllImport("user32.dll")]
public static extern bool BlockInput(bool fBlockIt);
"@
$userInput = Add-Type -MemberDefinition $code -Name UserInput -Namespace UserInput -PassThru
function Disable-UserInput($seconds) {
$userInput::BlockInput($true)
Start-Sleep $seconds
$userInput::BlockInput($false)
}
Disable-UserInput -seconds 10 | Out-Null
否则,我尝试使用AutoIt脚本语言,但生成的.exe文件没有权限(即使以管理员身份运行(。我肯定没有写足够的剧本。有人能给我建议合适的.au3代码吗?它可以禁用外部输入,几秒钟后再次启用?
我一直(现在仍在(寻找的是一种我可以控制自己的Windows方法或脚本语言。然而,我发现了小型免费软件KeyFreeze(909KB(,它完美地完成了所需的工作:
Sub Finish() ' (in a Word form module)
Dim KF_PID As LongPtr
' …
Me.MousePointer = fmMousePointerHourGlass
Me.WaitMessage.Visible = True
DoEvents
KF_PID = Shell("C:Programs(portable)KeyFreezeKeyFreeze_x64.exe", vbNormal) ' ×32 version available, too
' starts minimized, if desired without any message
' …
' critical part of the sub with many slow commands:
' Selection.GoTo What:=wdGoToBookmark, PasteIntoBookmark(),
' SetCursorPos, Sleep, Mouse_Event and SendKeys commands
' …
Call Shell("C:WindowsSysWOW64taskkill.exe /f /pid " & KF_PID)
End Sub
请注意,这个免费软件可以很容易地配置为在启动时阻止键盘和鼠标,因此甚至不需要发送阻止键序列(默认情况下<CTRL><ALT>F,可配置(。也没有必要再次发送相同的按键序列来解锁,因为杀死这个过程就足以重新激活键盘和鼠标:不必担心哪个窗口有焦点。
我当然更喜欢调用Windows函数,但我相信这个免费软件是可以信任的,因为VirusTotal报告";没有安全供应商将该文件标记为恶意(0/65(";。
BlueLife KeyFreeze v1.4(块键盘和鼠标(