我希望使用托管web API的windows服务来操作扫描仪。我这样做的原因是能够使用ajax从javascript操作扫描仪,而我不希望使用ActiveX。
因此,我构建了一个托管Web API的Windows服务。我试图让web API启动一个扫描应用程序(为此不得不绕过UAC ),但我遇到了一致性问题(有时工作,有时不工作)。
因此,现在web API的控制器内置了开始扫描的代码(而不是外部应用程序)。问题是我没有一个句柄来给twain包装器(它需要它作为windows消息钩子)。
我试着使用当前的进程MainWindowHandle,甚至尝试了一些像使用iexplore MainWindowHandle这样愚蠢的东西,但我得到了一个异常“初始化MainWindowHandle时出错”。
作为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);
}谢谢
发布于 2018-02-18 21:28:15
我找到了这个问题的答案。我使用了这个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);希望这能帮助到一些人。
https://stackoverflow.com/questions/48852030
复制相似问题