【问题标题】:Which handle should I use to initialize my scanner app我应该使用哪个句柄来初始化我的扫描仪应用程序
【发布时间】:2018-02-18 13:08:20
【问题描述】:

我希望使用托管 Web API 的 Windows 服务来操作扫描仪。 我这样做的原因是能够使用 ajax 从 javascript 操作扫描仪,我不希望使用 ActiveX。

所以我构建了一个托管 Web API 的 Windows 服务。 我尝试让 Web API 启动扫描应用程序(为此必须绕过 UAC),但我遇到了一致性问题(有时有效,有时无效)。

因此,目前 Web API 的控制器已经内置了开始扫描的代码(而不是外部应用程序)。问题是我没有句柄来提供 twain 包装器(它需要它用于 windows 消息挂钩)。

我尝试使用当前进程 MainWindowHandle,甚至尝试了一些愚蠢的方法,例如使用 iexplore MainWindowHandle,但我收到异常“初始化 DSM 时出错”。

作为一个 twain 库,我使用 TwainDotNet

做的代码是:

var p = Process.GetCurrentProcess();
_twain = new Twain(new WinFormsWindowMessageHook(p.MainWindowHandle));

关于获得有效句柄的好方法有什么想法吗?正如我在上面所写的,我可以“窃取”另一个应用程序句柄(例如 iexplore)

此代码中的 TwainDotNet 类 DataSourceManager 构造函数抛出异常:

TwainResult result = Twain32Native.DsmParent(
            ApplicationId,
            IntPtr.Zero,
            DataGroup.Control,
            DataArgumentType.Parent,
            Message.OpenDSM,
            ref windowHandle);

if (result == TwainResult.Success)
{
    ...
}
else
{
    throw new TwainException("Error initialising DSM: " + result, result);
}

谢谢

【问题讨论】:

    标签: asp.net-web-api windows-services handle twain


    【解决方案1】:

    嗯,我找到了这个问题的答案。 我使用了来自 URL 的 ApplicationLoader 类代码。

    我用来获取良好句柄的代码是:

    var processes = Process.GetProcessesByName("iexplore");
    if (processes.Length == 0)
    {
        WriteToLog("ScanController.Run GetProcessesByName returned 0 processes. Something went wrong!!!");
        return "ScanController.Run Failed: counlt not get handle to perform scan";
    }
    var p = processes[0];
    var hProcess = ApplicationLoader.OpenProcess(ApplicationLoader.MAXIMUM_ALLOWED, false, (uint)p.Id);
    

    希望这会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 2020-07-17
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多