【问题标题】:Hiding scanner progress bar window隐藏扫描仪进度条窗口
【发布时间】:2012-04-11 11:05:29
【问题描述】:

我正在制作一个需要从扫描仪扫描图像的应用程序。

我的应用程序基于这个项目 http://www.codeproject.com/Articles/171666/Twain-for-WPF-Applications-Look-Ma-No-Handles 并且扫描部分工作得很好。

但这是我的问题:我需要在不向用户显示任何窗口的情况下进行扫描。

上述项目允许我不向用户显示扫描仪配置选项屏幕, 但它仍然显示进度条。

当我调用时,进度条会显示(并开始扫描)

DSixfer(
    appid,
    srcds,
    TwDG.Image,
    TwDAT.ImageNativeXfer,
    TwMSG.Get,
    ref hbitmap );

[DllImport("twain_32.dll", EntryPoint="#1")]
private static extern TwRC DSixfer( [In, Out] TwIdentity origin, [In] TwIdentity dest, TwDG dg, TwDAT dat, TwMSG msg, ref IntPtr hbitmap );

我搜索了所有参数,但看不到任何可以禁用进度条的参数。

所以我决定捕获正在创建的进度条窗口的事件,并将其隐藏(有没有更好的方法?)但没有捕获该事件。

首先我创建一个临时窗口,因为我的应用程序将是一个 Windows 服务,还因为 TWAIN 需要一个与进度条相关联的窗口句柄。

这是我的代码

HookProc WindowCreationProcedure = new HookProc(WindowCreationHookProc);

int hHook = SetWindowsHookEx(WH_SHELL,
        WindowCreationProcedure,
        (IntPtr)0,
        AppDomain.GetCurrentThreadId()
        );

System.Windows.Window tmpWindow = new System.Windows.Window();
tmpWindow.WindowState = WindowState.Minimized;  //So that the window isn't showed
tmpWindow.Show();

我收到创建 tmpWindow 的事件,但没有收到进度条。我在这里错过了什么?

*编辑:*忘记在这篇文章中添加我的钩子函数

private const int WH_SHELL = 10;
private const int HSHELL_WINDOWCREATED = 1;

public static int WindowCreationHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode == HSHELL_WINDOWCREATED)
    {
        Console.WriteLine("WINDOW CREATED");
        return 1;
    }
    return 0;
}

【问题讨论】:

  • 在 windows vista 及以上版本中,windows 服务被禁止与桌面交互(这可能是您没有收到 hook 事件的原因)。要隔离问题,请先尝试从不是服务的应用程序执行此操作,看看您是否在那里收到挂钩。如果是这种情况,您可以从可以处理进度条抑制的服务中启动桌面应用程序。
  • 我所做的所有测试都是来自 Windows 窗体应用程序,正因为如此 ;)
  • 吐温在 Windows 上已经过时了。您需要升级到 WIA(Windows 图像采集)。谷歌离开。
  • 我无法使用 WIA,因为我的应用程序需要处理不支持 WIA 的旧扫描仪
  • 您是否尝试将窗口置于桌面边界之外?像 window.Left = -10000; window.Top = -10000;如果 ProgressBar 相对于其父级显示,它将不可见。

标签: c# winforms winapi events hook


【解决方案1】:

当吐温的现成能力可用时,为什么要做所有这些事情。

只需将 CAP_INDICATORS 值设置为 false 即可。它的十六进制值为:0x100b

【讨论】:

    【解决方案2】:

    要阻止 TWAIN 弹出它的界面,您需要发送消息 DG_CONTROL / DAT_USERINTERFACE / MSG_ENABLEDS,其中 ShowUI = FALSE 和 ModalUI = FALSE。这里是some example code

    还可以在扫描期间获取增量状态,而不是在整个扫描过程中被阻止。您不使用 ImageNativeXfer,而是使用内存块传输,从 Twain Spec 的第 4-20 页开始描述。你可以看到example code here

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2012-01-03
      • 2012-12-27
      相关资源
      最近更新 更多