2012-04-11 132 views
2

我正在製作一個需要從掃描儀掃描圖像的應用程序。隱藏掃描儀進度條窗口

我已經基於我的應用程序在這個項目上 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; 
} 
+0

在windows vista及以上,windows服務被禁止與桌面交互(這可能是你沒有收到掛鉤事件的原因)。要隔離問題,請嘗試首先從不是服務的應用程序執行此操作,看看您是否收到掛鉤。如果是這種情況,你可以從服務啓動一個桌面應用程序,它可以處理進度條的壓縮。 – user1227804 2012-04-11 11:10:17

+0

我所做的所有測試都是基於Windows窗體應用程序的;) – 2012-04-11 11:16:31

+1

Twain在Windows上嚴重過時。您需要升級到WIA(Windows圖像採集)。谷歌走了。 – 2012-04-11 11:49:10

回答

1

爲什麼做這些事情時。吐溫的現成的功能是可用的。

只需將CAP_INDICATORS的值設置爲false,就是這樣。十六進制值爲:0x100b

0

要停止TWAIN彈出它的界面,您需要發送帶有ShowUI = FALSE和ModalUI = FALSE的信息DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS。這裏是some example code

也可以在掃描過程中獲得增量狀態,而不是在整個掃描過程中被阻止。不使用ImageNativeXfer,而是使用內存塊傳輸,從Twain Spec的第4-20頁開始描述。你可以看到一個example code here