代码之家  ›  专栏  ›  技术社区  ›  shahar eldad

我应该使用哪个句柄初始化扫描仪应用程序

  •  0
  • shahar eldad  · 技术社区  · 7 年前

    我希望使用托管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);
    }
    

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   shahar eldad    7 年前

    我找到了这个问题的答案。 我使用了下面的ApplicationLoader类代码 URL .

    我使用的代码是:

    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);
    

    希望这能帮助别人。