2010-04-09 13 views
2

J'utilise un contrôle HtmlEditor dans un Windows Form.Intercepter un événement Coller sur HtmlEditor WinForms

J'ai obtenu le contrôle de cette page:

http://windowsclient.net/articles/htmleditor.aspx

Je veux étendre les fonctionnalités de contrôle en permettant à l'utilisateur de coller des images du presse-papiers. À l'heure actuelle, vous pouvez coller du texte simple et formaté, mais lorsque vous essayez de coller une image, elle ne fait rien. Fondamentalement, ce que je pensais détecter lorsque l'utilisateur appuie sur Ctrl + V sur l'éditeur, vérifiez le presse-papier pour les images et s'il y a une image, insérez-le manuellement dans l'éditeur.

Le problème avec cette approche est que je ne peux pas déclencher les événements OnKeyDown ou OnKeyPress du formulaire.

J'ai la propriété KeyPreview définie sur true sur le formulaire, mais les événements ne sont toujours pas déclenchés.

J'ai également essayé de sous-classer le formulaire et l'éditeur (comme expliqué here) pour intercepter le message WM_PASTE, mais il n'est pas non plus déclenché.

Des idées sur la façon d'y parvenir?

Merci beaucoup

Répondre

5

J'ai passé toute la journée sur ce problème et enfin une solution. Essayer d'écouter le message WM_PASTE ne fonctionne pas car Ctrl-V est en cours de prétraitement par le contrôle mshtml sous-jacent. Vous pouvez écouter OnKeyDown/Up etc pour attraper un Ctrl-V, mais cela n'empêchera pas le contrôle sous-jacent de poursuivre son comportement de collage par défaut. Ma solution est d'empêcher le PreProcessing du message Ctrl-V, puis d'implémenter mon propre comportement Coller. Pour arrêter le contrôle de pré-traitement du message CtrlV je devais sous-classe mon contrôle qui est AxWebBrowser,

public class DisabledPasteWebBrowser : AxWebBrowser 
{ 
    const int WM_KEYDOWN = 0x100; 
    const int CTRL_WPARAM = 0x11; 
    const int VKEY_WPARAM = 0x56; 

    Message prevMsg; 
    public override bool PreProcessMessage(ref Message msg) 
    { 
     if (prevMsg.Msg == WM_KEYDOWN && prevMsg.WParam == new IntPtr(CTRL_WPARAM) && msg.Msg == WM_KEYDOWN && msg.WParam == new IntPtr(VKEY_WPARAM)) 
     { 
      // Do not let this Control process Ctrl-V, we'll do it manually. 
      HtmlEditorControl parentControl = this.Parent as HtmlEditorControl; 
      if (parentControl != null) 
      { 
       parentControl.ExecuteCommandDocument("Paste"); 
      } 
      return true; 
     } 
     prevMsg = msg; 
     return base.PreProcessMessage(ref msg); 
    } 
} 

Voici ma méthode personnalisée pour gérer les commandes Coller, la vôtre peut faire quelque chose de similaire avec les données d'image dans le Presse-papiers. J'espère que quelqu'un trouve cela utile et ne perd pas une journée dessus comme moi aujourd'hui.