2015-05-26 2 views
0

В принципе, я хочу реплицировать инструмент 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 

ответ

1

Вы могли бы начать Exe затем взять функцию IsExeRunning здесь:

http://www.devhut.net/2014/10/20/vba-wmi-determine-if-a-process-is-running-or-not/

И петля на Do до IsExeRunning (SnippingToolExecutable)

+0

Кажется, что это сработает! Я подтвержу во второй половине дня. – icebird76

+0

Я не мог заставить его работать. Windows 8 Excel зависает, но возобновляется после нажатия escape. Он дает ошибку и нажимает «Отладка» ... подчеркивает это в приведенной выше ссылке: «Exit Function» для метки Error_Handler_Exit. – icebird76

+0

Nevermind Я понял это. Это было зацикливание навсегда, потому что «Snipping Tool.exe» не существовало. Это был «SnippingTool.exe» – icebird76

Смежные вопросы