C# 隐藏扫描仪进度条窗口

C# 隐藏扫描仪进度条窗口,c#,winforms,winapi,events,hook,C#,Winforms,Winapi,Events,Hook,我正在制作一个需要从扫描仪扫描图像的应用程序 我的申请基于这个项目 扫描部分工作良好 但我的问题是:我需要在不向用户显示任何窗口的情况下进行扫描 上述项目允许我不向用户显示扫描仪配置选项屏幕, 但它仍然显示进度条 当我调用时,进度条显示(扫描开始) DSixfer( appid, srcds, TwDG.Image, TwDAT.ImageNativeXfer, TwMSG.Get, ref hbitmap ); [DllImport("twai

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

我的申请基于这个项目 扫描部分工作良好

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

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

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

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;
}

既然Twain现成的功能可用,为什么还要做所有这些事情呢


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

要阻止TWAIN弹出它的接口,您需要发送消息
DG_CONTROL/DAT_USERINTERFACE/MSG_enables
,ShowUI=FALSE和ModalUI=FALSE。这是


也可以在扫描过程中获得增量状态,而不是在整个扫描过程中被阻止。不使用ImageNativeXfer,而是使用内存块传输,从的第4-20页开始介绍。您可以在windows vista&up中看到一个。

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