【问题标题】:show a trackbar or image while shell() is running a cmd.exe instruction在 shell() 运行 cmd.exe 指令时显示轨迹栏或图像
【发布时间】:2013-12-28 04:46:21
【问题描述】:

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

它可以工作,但由于有时有很多文件,应用程序看起来像冻结(因为我使用“等待”参数为真。

所以我正在寻找一种在 cmd 执行操作时显示“加载”gif 的方法,我在 msdn 中找到了一个示例,使用interaction.Start (http://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() 的等待参数设置为“真”时,完成任务需要大约 30 秒(在我的试驾中),但它只是假的跳过所有内容,我的 pic_Working 从未显示。

您能给我一个提示吗...可以这样做,或者我必须做很长的路(使用File.SetAttributes并当时解析一个文件?

谢谢!

【问题讨论】:

    标签: vb.net visual-studio shell


    【解决方案1】:

    免责声明:这里是 C++ 人。

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

    编辑

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

    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

    【讨论】:

    • 感谢您的帮助,我想我正在按照您的建议进行操作,但是有两个问题。 -- 1、我不知道在定时器里放什么,我需要比较WaitForSingleObject(HandledObject, 0)返回的值和WAIT_OBJECT_0等价的值不是吗?你能写出 C++ 代码让我把它翻译成 VB 吗? -- 2. 当我使用 HandledObject = OpenProcess(0, True, ProcessID) 获取 HANDLE(或使用 WaitForSingleObject)时,我收到“PInvokeStackImbalance”错误。我将 HandledObject 声明为 Long。干杯!
    • 再次感谢@manuell,我设法将所有 C++ 代码转换为 Vb 声明私有函数,除了 GetLastError 我使用了 Err.LastDllError。我在这里的股票代码中仍然收到“PInvokeStackImbalance”异常:OpenProcess(0, True, ProcessID),我找不到任何关于此的确切信息。你有任何想法吗?,因为代码永远不会超出这个范围。干杯!。
    • 查看pinvoke.net/default.aspx/kernel32.openprocess 注意:您可能希望使用Synchronize 作为访问权限,并为bInheritHandle 使用false。
    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多