【发布时间】: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