Wenn Sie Office-Anwendungen über ActiveX hosten, werden Sie feststellen, dass einige Versionen einiger Office-Anwendungen lächerlich heikel sind, wenn sie über Änderungen an der Fensteraktivierung informiert werden. Dies kann sich besonders auf ihre Kontextmenüs auswirken.
Im Allgemeinen, wenn Sie ihnen nicht sagen, wann sie verlieren oder den Fokus gewinnen und auch wenn Ihr Top-Level-Fenster den Fokus gewinnt oder verliert (auch wenn ihr Kind Kontrolle im Fenster nicht den Fokus gewinnt), dann sie kann drunter und drüber gehen.
Es ist etwas, mit dem ich lange Zeit gekämpft habe und besonders frustrierend, wenn man den Anwendungen Dinge sagen muss, die sie besser kennen als Sie selbst (wie wenn sie den Fokus verlieren oder direkt gewinnen). oder wenn sie ein Popup-Menü erstellen, das den Fokus von ihnen weg nimmt und anders behandelt werden muss als eine andere App/ein anderes Fenster, das den Fokus nimmt, den Sie zu schätzen wissen ... Ugh.
Wie auch immer, die Office-Anwendungen sollten eine IOleInPlaceActiveObject-Schnittstelle bereitstellen und Sie sollten sicherstellen, dass Sie die OnFrameWindowActivate-Methode aufrufen, um sie über Aktivierung/Deaktivierung zu informieren.
Aus dem Speicher und einen kurzen Blick auf meinen eigenen Code für Office-Hosting, das ist eines der wichtigsten Dinge. Es ist auch eine leichte Sache zu übersehen, denken "Nein, es kann nicht so viel Bedeutung ... Warum sollte etwas so viel daran interessiert, ob das Fenster aktiv ist oder nicht?" Sie könnten denken, dass es nur zu einigen kleineren kosmetischen Problemen führen könnte (wie aktiv erscheinen, wenn es nicht ist), aber es kann dazu führen, dass das Ganze aufhört oder abstürzt. Vertrauen Sie mir, Office kümmert sich viel zu sehr um solche Dinge! Ich habe den Eindruck, dass es unter den Covern von Office immer noch ein sehr altes, single-threaded Design aus den Tagen des kooperativen Multitasking gibt und es sehr verwirrend sein kann, wenn zwei seiner Fenster gleichzeitig aktiv sind.
Sorry, dass ich nicht mehr Ratschläge geben kann, als nur in diese Richtung zu zeigen ... Das Schreiben von ActiveX-Hosts ist eine schwarze Kunst (die gesamte Dokumentation ist darauf ausgerichtet, gehostet zu werden, nicht der Host :() und der einzige Weg, den ich bekam Mein eigener Code zum Arbeiten war durch Monate von Versuch und Irrtum und eine Hölle von vielem debug-out. Es ist ein Alptraum leider.
Ein letzter Ratschlag: Haben Sie nicht Angst, kludges für bestimmte Anwendungen zu kodieren Dies ist, was IE selbst tut, mit Registry-Einstellungen zu steuern, welche Kludges auf was angewendet werden (und ich vermute, einige mehr in den Code hartcoded). ActiveX ist so ein schlecht definiertes Chaos, dass verschiedene Steuerelemente ihre eigenen Macken und Fehler haben und es ist unmöglich, einen sauberen, generischen Host zu schreiben, der mit allen zusammenarbeitet Ange, das einen behebt, wird einen anderen brechen.) Sie werden auch Dinge finden, die nur funktionieren, wenn Sie Interfaces in der gleichen Reihenfolge wie IE ausprobieren, nur weil sie nur mit IE getestet wurden; Dinge etwas anders machen und sie fallen auseinander. :(
können Sie bitte sagen, welche Versionen und Service Pack-Ebene Sie verwenden (OS, Delphi, Word) – pastacool
Tritt dieser Fehler außerhalb von Citrix auf? –
@Judah Himango: Ich habe kein System mit Word 2000 außerhalb von Citrix, also kann ich leider Ihre Frage nicht beantworten –