VB.NET中Process.Start启动相机后变量为Nothing引发异常求助
问题解析与解决方案
嘿,作为编程新手,遇到这种“程序明明启动了但变量为空”的问题确实容易懵,我来给你掰扯清楚:
为什么camProcess会是Nothing?
你用的Process.Start("microsoft.windows.camera:")是通过URI协议启动Windows相机的,而这个相机是UWP(通用Windows平台)应用,和传统的Win32程序不一样。
当你用Process.Start启动URI协议关联的UWP应用时,系统并不会返回对应的Process对象——因为UWP应用的进程管理是由系统沙箱控制的,外部程序没法直接拿到它的Process实例,所以camProcess自然就变成Nothing了,调用WaitForExit时就触发了空引用异常。
新手友好的解决方法
既然拿不到直接的Process对象,我们可以换个思路:通过进程名找到相机的进程,再等待它退出。Windows相机的默认进程名是Camera.exe,我们可以用这个来定位:
修正后的代码示例
Imports System.Diagnostics Sub Main() Dim camTimeout As Integer = 5 * 60 * 1000 ' 设置5分钟超时 ' 启动Windows相机 Process.Start("microsoft.windows.camera:") ' 给系统一点时间启动相机,避免直接查找不到进程 System.Threading.Thread.Sleep(2000) ' 等待2秒,可根据实际情况调整 ' 查找名为"Camera"的进程(不用加.exe后缀) Dim camProcesses() As Process = Process.GetProcessesByName("Camera") If camProcesses.Length > 0 Then Dim targetCamProcess As Process = camProcesses(0) ' 等待进程退出或超时 If Not targetCamProcess.WaitForExit(camTimeout) Then MsgBox("相机超时未关闭!") Else MsgBox("相机已关闭,照片应该已经保存啦!") End If Else MsgBox("没找到相机进程,可能启动失败啦!") End If End Sub
新手注意事项
Thread.Sleep(2000)是给系统留时间启动相机,如果你的电脑启动慢,可以改成3000(3秒)或者更长。- 进程名
Camera是默认的,但如果用户修改过相机应用,可能会有变化,不过绝大多数Windows系统都是这个名字。 - 这个方法不是100%完美(比如用户开了多个相机进程的话会取第一个),但对于新手的需求来说,已经足够解决问题啦。
内容的提问来源于stack exchange,提问作者Chris P.
相关产品推荐
相关产品推荐

