2012-04-11 4 views
2

Ich mache eine Anwendung, die ein Bild von einem Scanner scannen muss.Verstecken Scanner Fortschrittsbalkenfenster

Ich habe meine Anwendung auf dieses Projekt http://www.codeproject.com/Articles/171666/Twain-for-WPF-Applications-Look-Ma-No-Handles basiert und der Scan-Teil funktioniert ausgezeichnet.

Aber hier ist mein Problem: Ich muss den Scan machen, ohne dem Benutzer ein Fenster zu zeigen.

Das obige Projekt ermöglicht es mir, den Scanner Konfigurationsoption Bildschirm für den Benutzer nicht anzuzeigen, aber es zeigt immer noch die Fortschrittsleiste.

Der Fortschrittsbalken zeigt (und der Scan beginnt), wenn ich

nennen
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); 

ich über alle Parameter gesucht, aber konnte nicht jeder sehen, dass die Fortschrittsanzeige deaktivieren könnte.

Also entschied ich mich, das Ereignis des Fortschrittsbalkenfensters zu erfassen und es zu verstecken (gibt es einen besseren Weg?), Aber das Ereignis wird nicht abgefangen.

Zuerst erstelle ich ein temporäres Fenster, weil meine Anwendung ein Windows-Dienst sein wird und auch, weil TWAIN ein Fensterhandle benötigt, dem es die Fortschrittsleiste zuordnet.

Dies ist mein Code

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(); 

Ich erhalte das Ereignis meines tmpWindow aber nicht der Fortschrittsbalken geschaffen. Was fehlt mir hier?

* EDIT: * vergessen haben meine Hook-Funktion in diesem Beitrag hinzufügen

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

in windows vista & up ist es Windows-Diensten verboten, mit dem Desktop zu interagieren (dies könnte der Grund dafür sein, dass Sie kein Hook-Ereignis erhalten). Um das Problem zu isolieren, versuchen Sie es zuerst von einer Anwendung, die kein Dienst ist, zu sehen, ob Sie den Haken dort erhalten. Wenn dies der Fall ist, könnten Sie eine Desktop-Anwendung vom Dienst starten, die die Unterdrückung des Fortschrittsbalkens übernehmen könnte. – user1227804

+0

Alle Tests, die ich gemacht habe, sind nur aus einer Windows-Form-Anwendung;) –

+1

Twain ist auf Windows grob veraltet. Sie müssen zu WIA (Windows Image Acquisition) wechseln. Google entfernt –

Antwort

1

Warum all diese Dinge zu tun, wenn die fertige Fähigkeit Twain zur Verfügung steht.

Setzen Sie einfach CAP_INDICATORS Wert auf falsch und das ist es. Der Hexadezimalwert ist: 0x100b.

0

Um zu verhindern, dass TWAIN erscheint, müssen Sie die Nachricht DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS mit ShowUI = FALSE und ModalUI = FALSE senden. Hier ist some example code.

Es ist auch möglich, während eines Scans einen inkrementellen Status zu erhalten, anstatt für den gesamten Scan blockiert zu sein. Anstatt ImageNativeXfer zu verwenden, verwenden Sie Speicherblockübertragungen, die ab Seite 4-20 von Twain Spec beschrieben werden. Sie können eine example code here sehen.