首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用哪个句柄来初始化我的扫描仪应用

我应该使用哪个句柄来初始化我的扫描仪应用
EN

Stack Overflow用户
提问于 2018-02-18 21:08:21
回答 1查看 167关注 0票数 0

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

因此,我构建了一个托管Web API的Windows服务。我试图让web API启动一个扫描应用程序(为此不得不绕过UAC ),但我遇到了一致性问题(有时工作,有时不工作)。

因此,现在web API的控制器内置了开始扫描的代码(而不是外部应用程序)。问题是我没有一个句柄来给twain包装器(它需要它作为windows消息钩子)。

我试着使用当前的进程MainWindowHandle,甚至尝试了一些像使用iexplore MainWindowHandle这样愚蠢的东西,但我得到了一个异常“初始化MainWindowHandle时出错”。

作为twain库,我使用TwainDotNet

这样做的代码是:

代码语言:javascript
复制
var p = Process.GetCurrentProcess();
_twain = new Twain(new WinFormsWindowMessageHook(p.MainWindowHandle));

有没有什么好的方法来获得一个可以工作的句柄?正如我在上面写的,如果可以的话,我可以“窃取”另一个应用程序句柄(例如iexplore)

在下面的代码中,异常是从TwainDotNet类的DataSourceManager构造函数抛出的:

代码语言:javascript
复制
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);
}

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-18 21:28:15

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

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

代码语言:javascript
复制
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);

希望这能帮助到一些人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48852030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档