В принципе, я хочу реплицировать инструмент Snipping Tool для Windows 7, поэтому, когда вы его открываете, он получает снипп. Но в Windows 8 все, что он делает, это открыть программу, и вам либо нужно нажать CTRL + N, либо нажать «Создать». Я бы хотел избежать использования функций Sleep (100) или других функций времени, так как это может быть ненадежным для разных систем при определенных нагрузках. Я попробовал петлюExcel VBA Откройте приложение, используя оболочку, затем подождите, пока он не откроется для продолжения команд
While error <> 0
AppActivate "Snipping Tool", True
application.SendKeys "^N", True
exit sub
Wend
Ok. Это не то, что я использовал, но это то же самое. Проблема в том, что он продолжал давать ошибки VB Debug (что хорошо и все, кроме этого экземпляра) и разрушил это возможное решение. Любые другие идеи дождаться, пока оболочка откроет программу, прежде чем сможет ее запустить
Application.SendKeys "^N", True
? Я также пробовал использовать
shell.Run FileLocation, 1 , True
но это запускает sendkeys ПОСЛЕ закрытия! Это почти то, что я хочу.
EDIT: РАБОЧИЙ КОД НИЖЕ
//Used to wait for 200 milliseconds in the Sub.
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Function IsExeRunning(sExeName As String, Optional sComputer As String = ".") As Boolean
On Error GoTo Error_Handler
Dim objProcesses As Object
Set objProcesses = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\cimv2").ExecQuery("SELECT * FROM Win32_Process WHERE Name = '" & sExeName & "'")
If objProcesses.Count <> 0 Then IsExeRunning = True
Error_Handler_Exit:
On Error Resume Next
Set objProcesses = Nothing
Exit Function
Error_Handler:
MsgBox "The following error has occured." & vbCrLf & vbCrLf & _
"Error Number: IsExeRunning" & vbCrLf & _
"Error Description: " & Err.Description, _
vbCritical, "An Error has Occured!"
Resume Error_Handler_Exit
End Function
Sub SnipTool()
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
wsh.Run "C:\Windows\sysnative\SnippingTool.exe"
X = 0
Select Case Mid(Application.OperatingSystem, 21)
Case 6.02
Do Until IsExeRunning("SnippingTool.exe") = True Or X = 200
//added Timeout if snipping tool fails to load. Prevents Excel freezing.
X = X + 1
Loop
Sleep (200)
AppActivate "Snipping Tool", True
Application.SendKeys "^N", True
End Select
End Sub
Кажется, что это сработает! Я подтвержу во второй половине дня. – icebird76
Я не мог заставить его работать. Windows 8 Excel зависает, но возобновляется после нажатия escape. Он дает ошибку и нажимает «Отладка» ... подчеркивает это в приведенной выше ссылке: «Exit Function» для метки Error_Handler_Exit. – icebird76
Nevermind Я понял это. Это было зацикливание навсегда, потому что «Snipping Tool.exe» не существовало. Это был «SnippingTool.exe» – icebird76