数1000羊的星星 2019-01-08 17:45 采纳率: 0%
浏览 672

c# 在WIA下获取本地扫描仪,并且调用

在网上找了些,但是不是我想要的。希望知道扫描仪的名称,做列表还能调用,能连续扫描。哪位大神指点下,,发文章链接来也行

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 16:13
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在.NET中,我们可以使用System.IO.PortsSystem.Drawing库来读取和处理扫描仪的数据。以下是一个简单的示例,展示了如何从扫描仪读取数据并将其转换为可读的形式:

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ScannerScanner
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 从控制台输入扫描仪的IP地址
                Console.WriteLine("请输入扫描仪的IP地址:");
                string ipAddress = Console.ReadLine();
    
                // 创建一个扫描仪对象
                var scanner = new Scanner(ipAddress);
    
                // 开始扫描
                scanner.StartScan();
    
                // 循环等待新的扫描结果
                while (scanner.Scan())
                {
                    // 打印每个扫描的结果
                    Console.WriteLine(scanner.ScanResult);
                }
    
                // 关闭扫描器
                scanner.Close();
            }
        }
    
        public class Scanner
        {
            private readonly string _ipAddress;
            private readonly int _port;
            private readonly byte[] _buffer;
            private bool _isScanning = false;
            private List<string> _scanResults = new List<string>();
    
            public Scanner(string ipAddress, int port)
            {
                _ipAddress = ipAddress;
                _port = port;
                _buffer = new byte[1024];
            }
    
            public async Task StartScan()
            {
                try
                {
                    using (var stream = File.OpenRead("scanner.exe"))
                    {
                        await Process.StartAsync(stream, $"-i {_ipAddress} -p {_port}");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Error starting scanner: {ex.Message}");
                }
            }
    
            public async Task<bool> Scan()
            {
                if (!_isScanning) return true;
    
                _isScanning = false;
                _scanResults.Clear();
    
                // 检查是否还有新数据
                while (_buffer.Length > 0 && !_isScanning)
                {
                    var bytesAvailable = ReadBytesFromStream(_buffer, 0, _buffer.Length);
                    if (bytesAvailable == 0)
                    {
                        break; // 如果没有新的数据,则结束循环
                    }
    
                    foreach (var b in _buffer.TakeWhile(b => b != '\n'))
                    {
                        _scanResults.Add(new String(b));
                    }
    
                    // 等待新的扫描结果
                    await Task.Delay(500); // 每隔一秒检查一次是否有新数据
                }
    
                _isScanning = true;
    
                return _scanResults.Any();
            }
    
            private async Task ReadBytesFromStream(byte[] buffer, int offset, int count)
            {
                using (var reader = new StreamReader(File.OpenRead("scanner.exe"), Encoding.UTF8))
                {
                    for (int i = offset; i < count + offset; i++)
                    {
                        buffer[i] = Convert.ToByte(reader.ReadLine());
                    }
                }
            }
    
            public void Close()
            {
                Dispose();
            }
    
            protected virtual void Dispose(bool disposing)
            {
                if (!disposing)
                {
                    return;
                }
    
                GC.SuppressFinalize(this);
            }
        }
    }
    

    请注意,这个示例假设你的扫描仪支持通过网络进行操作。如果你的扫描仪不支持网络,你可能需要找到其他方法来连接到它。

    此外,这个示例中的scanner.exe文件应该被放在与扫描仪相同的目录或路径中。如果不在同一目录,请确保将文件名更改为正确的路径。

    最后,这个示例使用了Windows平台上的Process类来启动扫描仪程序。如果你使用的是Linux或Mac OS X,你需要使用相应的替代方法来启动扫描仪程序。

    另外,这个示例也没有处理错误情况,例如扫描仪无法打开或者返回错误消息。这只是一个基本的示例,你可以根据实际需求对其进行修改和完善。

    评论

报告相同问题?