c # - Tilføj kontekst menupunkt til alle tekstbokse operativsystem bredt

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ved, at det er muligt at udvide kontekstmenuen til standardfilen, men er der en måde at tilføje elementer til i hele systemmenuen i tekstmenuen?


Det ville være sådan, at det nye element vises i hver tekstfelt, som en bruger kan skrive i hvor som helst i Windows?


For eksempel for at tillade at tilføje sådanne funktioner, så se den valgte tekst op mod en stavekontrol.

Bedste reference


Dette er teknisk umuligt med C #.
Lad os forestille os den næste situation. Antag at du har sucessfuly skriv din administrerede udvidelse, og det 'udvider' enhver tekstboks kontekstmenu i systemet. Og selvfølgelig skal du håndtere hvert nyt menupunkt, du har tilføjet. og for at opnå dette skal du injicere din administrerede kode til hver proces, der har tekstboks og erstatte dens WindProc. OK, antag, at der er styret app i systemet, der blev skrevet for .net-version, der er forskellig fra den version, du brugte til din udvidelse. Så i dette tilfælde ville du få kritisk fejl under forlængelsesindsprøjtningen, da kun en version af .net kunne indlæses pr. Proces. Så det er ikke muligt at skrive robust styret lavt niveau krog eller shell forlængelse. Fra her : [4]



   Globale kroge understøttes ikke i
  .NET Framework


  Bortset fra
  WH\_KEYBOARD\_LL lavt niveau krog og
  WH\_MOUSE\_LL lavt niveau krog, du kan ikke
  implementere globale kroge i
  Microsoft .NET Framework. For at installere en
  global krog, en krog skal have en indfødt
  DLL eksport til at injicere sig i en anden
  proces, der kræver en gyldig,
  konsekvent funktion at kalde ind Dette
  Opførsel kræver en DLL-eksport. Det
  .NET Framework understøtter ikke DLL
  eksporten. Administreret kode har intet koncept
  af en ensartet værdi for en funktion
  peger, fordi disse fungerer
  pointers er proxyer, der er bygget
  dynamisk.

  
  Kropsprocedurer på lavt niveau kaldes
  på tråden, der installerede krogen.
  Koblinger med lavt niveau kræver ikke det
  Krogproceduren implementeres i en
  DLL.



Du kan også kontrollere denne artikel og undersøge, hvorfor du ikke bør skrive administrerede shell-udvidelser. [5]

Andre referencer 1


Erfarve fra tekstfeltet, forsøger du at bruge og tilføje standardværdien der. Brug din klasse i stedet for tekstboks klassen.

Andre referencer 2


Du skal tilføje en Mouse Hook [6]


Og så pop op en kontekstmenu, når vinduet/kontrollen du klikker, er en tekstboks.


Dette kan (og sandsynligvis vil) forstyrre allerede eksisterende kontekstmenuer, fordi du vil gemme dem eller kollidere med dem.


(En forfærdelig plan selvom ...)

Andre referencer 3


Ring bindemetoden med formularen og kontekstmenuen.


  void Bind(Control c, ContextMenu menu)
  {
     foreach (Control subcontrol in c.Controls)
        Bind(subcontrol);

     TextBox textBox = c as TextBox;
     if (textBox != null)
     {
         textBox.ContextMenu = menu;
     }
  }


Hvis du tilføjer et dynamisk tekstfelt, skal du placere dette ved afbinding af bindemetoden:


         c.ControlAdded += (s, e) => Bind(e.Control, menu);


Dette får Bind-metoden til at ringe, når en kontrol er tilføjet til formularen eller en anden kontrol.