W
hallo zusammen,
ich schreibe gerade an einer java-twain bridge und habe ein großes problem mit meiner dll, die als brücke zwischen java und twain dient. das problem scheint ein reines vc++ problem zu sein, also lasst euch nicht von meinem gefasel über java und twain verwirren.
hier erst mal ne beschreibung meines programms: die twain befehle werden von mir, mittels den methoden einer in vc++ entworfenen dll-datei, abgesetzt. die methoden dieser dll werden wiederum von meiner java klasse aus mittels JNI aufgerufen. da sich twain nur mittels eines gültigen HWND's initialisieren läßt und ich von java sowas nicht kriegen kann, erzeugt meine dll zur laufzeit ein verstecktes fenster, dessen HWND an twain übergeben wird. für dieses HWND besitze ich auch noch eine callback methode, sodaß ich also sehen könnte, welche messages an mein HWND gehen, doch das nur nebenher.
heranführung an das problem: wenn ich nach einigen aufrufen an twain irgendwann dann anfange zu scannen erscheint normalerweise ein kleines fenster in dem ein forschrittsbalken und ein abbruchbutton zu sehen sind. ersterer zeigt mir den fortschritt beim scannen an. da ich aber möchte, daß der user die bereits eingescannten bilder bearbeitet, wärend der scanvorgang noch am laufen ist habe ich mich danach umgesehen, wie ich dieses fenster, das beim einziehen jeder seite in den feeder immer im vordergrund erscheint, loswerden kann. glücklicherweise haben die herrn entwickler von twain mitgedacht und dafür eine eigenschaft in twain implementiert (CAP_INDICATORS) durch deren setzten dieses fenster nicht erscheint.
das problem: durch das setzten dieser eigenschaft erscheint das fenster mit dem fortschrittsbalken nun nicht mehr. trotzdem verliert meine java anwendung den fokus und zwar jedes mal, wenn eine neue seite eingezogen wird. für den user sieht das dann so aus, als ob der fokus im nirvana verschwindet, was natürlich das arbeiten an den bildern etwas unkomforabel gestalltet.
das fenster mit dem fortschrittsbalken scheint von den entwicklern von twain nur versteckt worden zu sein. es holt sich dank einem nicht abstellbaren mechanismus trotzdem den fokus (was meiner meinung nach nicht gerade für die entwickler spricht). dieses fenster ist ein kind meines HWND, das ich erzeugt habe um twain zu initieren.
versucht habe ich bereits mir das fenster der java applikation mittels FindWindow bzw. GetFocus zu holen und ihm den Fokus mittels SetFocus bzw. SetWindowPos zurück zugeben. das funktioniert bei der ersten seite hervoragend, bei der zweiten seite stark verzögert und bei der dritten seite hängt sich mein programm auf. dazu muß ich anfügen, daß ich dies über einen zweiten nebenläufigen thread mache, der normalerweise die messages von twain an meine applikation bzw. von meiner applikation an twain weiterreicht. es ist mir ja leider nicht möglich das von dem thread aus zu machen, der den scan-befehl an twain absetzt, da der aufruf zum scannen erst zurückkehrt, wenn das scannen der seite beendet ist. ich hab auch schon ausprobiert, was für messages mein verstecktes fenster in seiner callback methode erhält, aber da is leider auch nix sinnvolles dabei. ausser WM_WINDOWPOSCHANGED und WM_WINDOWPOSCHANGING krieg ich da zu diesem zeitpunkt nix. ich hab leider nicht die erfahrung um etwas mehr über den sachverhalt des fensters mit dem fortschrittsbalken rauszufinden, geschweigedenn mir die event-verarbeitende callbackmethode dieses fensters zu überschreiben um events zu filtern. theoretisch hab ich auch kein HWND meiner java applikation, sonst könnte ich mir ja auch die initialisierung von twain mittels dem versteckten fenster in der dll sparen. ausserdem ist es **wahrscheinlich, daß die GUI meiner java applikation in einem anderen thread läuft, als meine java-twain-bridge, was den einsatz von GetFocus / SetFocus etwas schwierig macht. ich möchte es eigentlich auch vermeiden, mir das HWND der java-applikation, die meine bridge betätigt, zu holen, da sie möglicherweise einige befehle bereits in ihrer initierungsphase absetzt, zu der noch gar kein fenster existiert, mal davon abgesehen, daß es unschön wäre von meiner dll wieder auf java zurück zu greifen und noch dazu über das package hinaus. schön wäre eben wirklich, ich könnte die events an dieses kleine fenster filtern und vermeiden, daß es überhaupt jemals den fokus erhalten würde.
wär nett, wenn mir da jemand helfen könnte, der sich damit auskennt
vielen dank
wayne**