我应该使用哪个句柄来初始化我的扫描仪应用程序
Which handle should I use to initialize my scanner app
我希望使用托管网络 API 的 windows 服务来操作扫描仪。
我这样做的原因是能够使用 ajax 从 javascript 操作扫描仪,我不想使用 ActiveX。
所以我构建了一个 Windows 托管 Web API 的服务。
我尝试让网络 API 启动扫描应用程序(为此必须绕过 UAC),但我 运行 遇到了一致性问题(有时有效,有时无效)。
所以现在 Web 控制器 API 内置了开始扫描的代码(而不是外部应用程序)。问题是我没有提供 twain 包装器的句柄(windows 消息挂钩需要它)。
我尝试使用当前进程 MainWindowHandle,甚至尝试了一些愚蠢的操作,例如使用 iexplore MainWindowHandle,但我得到了一个异常 "Error initialising DSM"。
作为 twain 库,我使用 TwainDotNet
执行代码是:
var p = Process.GetCurrentProcess();
_twain = new Twain(new WinFormsWindowMessageHook(p.MainWindowHandle));
有没有关于获得有效句柄的好方法?正如我在上面写的那样,如果可以完成工作,我可以使用 "stealing" 另一个应用程序句柄(例如 iexplore)
此代码中的 TwainDotNet class 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);
}
谢谢
好吧,我找到了这个问题的答案。
我使用了这个 URL.
中的 ApplicationLoader class 代码
我用来获得好句柄的代码是:
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);
希望这会对某人有所帮助。
我希望使用托管网络 API 的 windows 服务来操作扫描仪。 我这样做的原因是能够使用 ajax 从 javascript 操作扫描仪,我不想使用 ActiveX。
所以我构建了一个 Windows 托管 Web API 的服务。 我尝试让网络 API 启动扫描应用程序(为此必须绕过 UAC),但我 运行 遇到了一致性问题(有时有效,有时无效)。
所以现在 Web 控制器 API 内置了开始扫描的代码(而不是外部应用程序)。问题是我没有提供 twain 包装器的句柄(windows 消息挂钩需要它)。
我尝试使用当前进程 MainWindowHandle,甚至尝试了一些愚蠢的操作,例如使用 iexplore MainWindowHandle,但我得到了一个异常 "Error initialising DSM"。
作为 twain 库,我使用 TwainDotNet
执行代码是:
var p = Process.GetCurrentProcess();
_twain = new Twain(new WinFormsWindowMessageHook(p.MainWindowHandle));
有没有关于获得有效句柄的好方法?正如我在上面写的那样,如果可以完成工作,我可以使用 "stealing" 另一个应用程序句柄(例如 iexplore)
此代码中的 TwainDotNet class 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);
}
谢谢
好吧,我找到了这个问题的答案。 我使用了这个 URL.
中的 ApplicationLoader class 代码我用来获得好句柄的代码是:
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);
希望这会对某人有所帮助。