Hinzufügen eines Kontextmenüs zu allen systemweiten Textfeldern

8

Ich weiß, dass es möglich ist, das Kontextmenü der Standarddatei zu erweitern, aber gibt es eine Möglichkeit, dem systemweiten Textbox-Kontextmenü Elemente hinzuzufügen?

Dies würde so sein, dass das neue Element in jedem Textfeld erscheint, das ein Benutzer irgendwo in Windows eingeben kann?

Zum Beispiel können Sie solche Funktionen hinzufügen, um den ausgewählten Text nach einer Rechtschreibprüfung zu durchsuchen.

    
John 15.02.2011, 00:55
quelle

4 Antworten

3

Das ist technisch unmöglich mit C #. Stellen wir uns die nächste Situation vor. Angenommen, Sie schreiben erfolgreich Ihre verwaltete Erweiterung und "erweitert" jedes Textfeld-Kontextmenü im System. Und natürlich sollten Sie jeden neuen Menüeintrag, den Sie hinzugefügt haben, bearbeiten. und um dies zu erreichen, sollten Sie Ihren verwalteten Code jedem Prozess mit Textfeld hinzufügen und sein WindProc ersetzen. OK, angenommen, es gibt eine verwaltete App im System, die für die .net-Version geschrieben wurde, die sich von der Version unterscheidet, die Sie für Ihre Erweiterung verwendet haben. In diesem Fall würden Sie einen kritischen Fehler während der Erweiterungsinjektion bekommen, da pro Prozess nur eine Version von .net geladen werden kann. Daher gibt es keine Möglichkeit, eine robuste verwaltete Low-Level-Hook- oder Shell-Erweiterung zu schreiben. Von hier :

  

Globale Hooks werden nicht in der   .NET Framework
  Mit Ausnahme der   WH_KEYBOARD_LL Low-Level-Hook und die   WH_MOUSE_LL Low-Level-Hook, können Sie nicht   implementieren globale Hooks in der   Microsoft NET Framework. So installieren Sie a   global hook, ein hook muss einen nativen haben   DLL-Export, um sich in einem anderen zu injizieren   Prozess, der eine gültige, erfordert   konsistente Funktion zum Aufruf. Dies   Verhalten erfordert einen DLL-Export. Das   .NET Framework unterstützt keine DLL   Exporte. Verwalteter Code hat kein Konzept   eines konsistenten Werts für eine Funktion   Zeiger, weil diese Funktion   Zeiger sind Proxies, die gebaut werden   dynamisch.

     

Es werden Low-Level-Hook-Prozeduren aufgerufen   auf dem Thread, der den Haken installiert hat.   Low-Level-Hooks erfordern dies nicht   Die Hook-Prozedur wird in a implementiert   DLL.

Sie können auch dies Artikel und erkunde, warum du keine verwalteten Shell-Erweiterungen schreiben solltest.

    
Anton Semenov 13.05.2011 07:06
quelle
2

Übernehmen Sie das Textfeld, das Sie verwenden möchten, und fügen Sie dort den Standardwert hinzu. Verwenden Sie Ihre Klasse anstelle der Textfeldklasse.

    
Esteban Araya 15.02.2011 00:57
quelle
1

Sie müssten einen Maus-Hook hinzufügen

>

Und dann erscheint ein Kontextmenü, wenn das Fenster / Steuerelement, auf das Sie klicken, ein Textfeld ist.

Dies kann (und wird wahrscheinlich) bereits vorhandene Kontextmenüs beeinträchtigen, weil Sie sie verstecken oder mit ihnen kollidieren werden.

(Ein schrecklicher Plan aber ...)

    
Erno de Weerd 12.05.2011 10:46
quelle
0

Rufen Sie die Bind-Methode mit dem Formular- und Kontextmenü auf.

%Vor%

Wenn Sie ein dynamisches Textfeld hinzufügen, legen Sie das am Anfang der Bind-Methode ab:

%Vor%

Dies führt dazu, dass die Bind-Methode immer dann aufgerufen wird, wenn dem Formular oder einem anderen Steuerelement ein Steuerelement hinzugefügt wird.

    
Richard Schneider 15.02.2011 01:14
quelle