You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:00:10