2 Stimmen

Wie kann man verhindern, dass Excel interop den Fokus beim Einfügen von Bildern stiehlt?

Ich verwende die Excel-COM-Schnittstelle, um Bilder (insbesondere EPS) in eine Kalkulationstabelle einzufügen. Die Bilder werden gut eingefügt, aber Excel ignoriert alle Sichtbar-/Hintergrund-Einstellungen und stiehlt den Fokus, um ein Dialogfeld anzuzeigen, in dem etwas wie "Bild importieren" steht. Das Dialogfeld bleibt nur einen Bruchteil eines Abschnitts lang, aber es lässt den Bildschirm flimmern, und schlimmer noch, wenn ich viele Bilder auf einmal einfüge, kann es das System für mehrere Sekunden in Beschlag nehmen (einschließlich des Diebstahls von Tastenanschlägen aus dem Vordergrundprozess).

Ich stelle die Hintergrundoptionen wie folgt ein:

Excel.Application xlApp = new Excel.Application();
xlApp.Visible = false;
xlApp.ScreenUpdating = false;
xlApp.DisplayAlerts = false;
Excel.Worksheet worksheet;
//....
worksheet.Pictures(Type.Missing).Insert(filename,Type.Missing); //steals focus

Wie kann ich Excel dazu bringen, so im Hintergrund zu bleiben, wie es hier hingehört?

3voto

Joel Spolsky Punkte 32916

Ich vermute, dass dies durch eine Komponente verursacht wird, die von Microsoft lizenziert wurde und sich schlecht verhält.

Die einzige Möglichkeit, mit solchen Situationen umzugehen, besteht darin, die entsprechende Low-Level-Windows-Nachricht abzufangen und sie mit einer Win32-Haken

Der einfachste Weg, dies zu tun, und glauben Sie mir, es ist nicht schön, ist die Verwendung des CBT-Hakens. CBT steht für "Computer Based Training". Es handelt sich um eine uralte und fast veraltete Technologie, die es ermöglichen sollte, Trainingsanwendungen zu entwickeln, die beobachten, was Sie tun, und entsprechend reagieren. Das Einzige, wozu sie noch taugt, ist das Abfangen und Verhindern der Fensteraktivierung in einem Code, auf den Sie keinen Zugriff haben. Sie könnten den HCBT_ACTIVATE-Code abfangen und verhindern, dass ein Fenster aktiviert wird.

Dies müsste wahrscheinlich in C oder C++ geschehen.

1voto

Ahmed Elsawalhy Punkte 129

Entgegen dem gesunden Menschenverstand ist die Einstellung xlApp.ScreenUpdating = true; verhindert Schärfendiebstahl! ( Quelle )

0voto

TimS Punkte 249

Ich bin mir nicht sicher, ob ich eine gute Antwort auf Ihre Frage habe (ich hätte einen Kommentar hinterlassen, aber anscheinend habe ich noch nicht genug Ansehen), aber falls es hilfreich ist, ich deaktiviere oft auch Ereignisse

xlApp.EnableEvents = False

Natürlich müssen Sie auf diese Einstellung achten, wenn Sie sich in Ihrem Code auf Excel-Ereignisse stützen, aber für den Fall, dass beim Einfügen unerwünschte Ereignisse ausgelöst werden, könnte dies hilfreich sein.

Viel Glück!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X