在shell()运行cmd.exe指令时显示轨道栏或图像

时间:2013-12-28 04:46:22

标签: vb.net visual-studio shell

我正在尝试在visual basic中创建一个简单的Windows窗体应用程序,它使用shell()更改驱动器中所有文件的属性。

它有效,但由于有时会有很多文件,应用程序看起来像冻结(因为我使用“wait”参数为true。

所以我正在寻找一种方法来展示一个“加载”gif,而cmd正在做他的事情,我在msdn中找到并使用interaction.Starthttp://msdn.microsoft.com/en-us/library/microsoft.visualbasic.interaction.shell(v=vs.110).aspx进行“等到过程完成”的例子我尝试将shell与该示例混合,但我无法让它运行正常。

到目前为止,这是我的代码。

pic_working.Visible = True

myDrive = "F:\"

Dim procID As Integer
Dim newProc As Diagnostics.Process
newProc = Diagnostics.Process.GetProcessById(Shell("cmd.exe /C attrib -r " + myDrive + "*.* /s /d", AppWinStyle.NormalFocus, False))


procID = newProc.Id

Dim procEC As Integer = -1
If newProc.HasExited Then
    procEC = newProc.ExitCode
End If
MsgBox("Process with ID " & CStr(procID) & " terminated with exit code " & CStr(procEC))

myDrive =""
pic_working.Visible = False

它的工作方式......当我将shell()的等待参数设置为“true”时,完成任务需要30秒(在我的测试驱动器中),但是将其设置为false它只是跳过一切,我的pic_Working从未显示过。

你能否给我一个提示......这样做是可行的,或者我必须做很长的事情(使用File.SetAttributes并解析一个文件?

谢谢!

1 个答案:

答案 0 :(得分:1)

免责声明:C ++家伙。

将等待设为假。如果Shell告诉您程序仍在运行,请显示图像,启动计时器,将Win32 API OpenProcess与Shell返回的PID一起使用并保存HANDLE,然后返回。在每个Timer Tick上,使用带有HANDLE的Win32 API WaitForSingleObject并且timout等于0.如果成功发出进程句柄,则任务终止。

修改

当您使用HANDLE成功获得OpenProcess该流程时,如何知道流程何时终止:

HANDLE hProcess;
[...]
DWORD dwRet = WaitForSingleObject( hProcess, 0 );
if ( dwRet == WAIT_OBJECT_0 ) {
   // Process is terminated. Don't forget to close the handle
   CloseHandle( hProcess );
} else if ( dwRet == WAIT_TIMEOUT ) {
   // Process NOT terminanted, wait next Timer Tick
} else {
   // Error Occurred
   DWORD dwLE = GetLastError();
}

在C#/ VB中使用Win32 HANDLE类型:使用IntPtr