2009-07-03 6 views
2

Je suis en train d'écrire un Addin Excel 2007. en utilisant VS2008 et .net 3.5, C#. J'ai rencontré les événements WindowActivate et WindowDeActivate de Microsoft.Office.Interop.Excel.Application.C#: Excel 2007 Addin, Comment activer Windows Activer et désactiver des événements

Il a été surpris de savoir que WindowActivate et Deactivate ne déclenchent que des déclenchements lorsque je commute entre deux fenêtres Excel. Si je passe au bloc-notes, je m'attends à ce que Deactivate soit déclenché, mais ce n'est pas le cas. De la même manière, à partir du bloc-notes, si je passe à la fenêtre Excel, je m'attends à ce que Activate soit déclenché, mais ce n'est pas le cas. Il semble que le comportement indique que les fenêtres sont des fenêtres MDI-Child.

Maintenant, ce que je veux faire est obtenir HWnd de la fenêtre principale d'Excel et de crochet activer et désactiver la fenêtre en utilisant les fonctionnalités de dllimport.

Quelqu'un peut-il me guider à ce sujet.

Cordialement

Répondre

6

Je résolu le même problème lors de l'écriture Excel Addin. Aucune importation de DLL n'est nécessaire. J'ai résolu ce problème en utilisant la classe System.Windows.Forms.NativeWindow. Dans un premier temps, j'ai créé ma propre classe héritée de la classe NativeWindow et déclaré deux événements Activated et Deactivate dans celle-ci et finalement substitué la méthode WndProc() pour élever ces événements lorsque le message WM_ACTIVATE est passé à la méthode WndProc. Selon le paramètre "Message" WParm est la fenêtre Excel activée ou désactivée.

public class ExcelWindow: NativeWindow 
{ 
    public const int WM_ACTIVATED = 0x0006; 

    public ExcelWindow():base(){} 

    //events 
    public event EventHandler Activated; 
    public event EventHandler Deactivate; 

    //catching windows messages 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg== WM_ACTIVATED) 
     { 
      if (m.WParam.ToInt32() == 1) 
      { 
       //raise activated event 
       if (Activated!=null) 
       { 
        Activated(this, new EventArgs()); 
       } 
      } 
      else if (m.WParam.ToInt32() == 0) 
      { 
       //raise deactivated event 
       if (Deactivate!=null) 
       { 
        Deactivate(this, new EventArgs()); 
       } 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 

Puis j'ai fait dans mon champ de classe Addin "ExcelWindow myExcelWindow" et a ajouté le code suivant à la méthode OnConnection de mon Addin:

ExcelWindow myExcelWindow; 
void Extensibility.IDTExtensibility2.OnConnection(object application, Extensibility.ext_ConnectMode ConnectMode, object AddInInst, ref Array custom) 
{ 
    excel = application as Excel.Application; 
    myExcelWindow = new ExcelWindow(); 
    myExcelWindow.AssignHandle(new IntPtr(excel.Hwnd)); 
    myExcelWindow.Activated += new EventHandler(myExcelWindow_Activated); 
    myExcelWindow.Deactivate += new EventHandler(myExcelWindow_Deactivate); 

    //addin code here 

} 

void myExcelWindow_Activated(object sender, EventArgs e) 
{ 
    //do some stuff here 
} 
void myExcelWindow_Deactivate(object sender, EventArgs e) 
{ 
    //do some stuff here 
} 

J'espère que cela vous aidera.

+0

C'est incroyable, savez-vous s'il existe un moyen de le faire dans Word/PowerPoint? Plus précisément, existe-t-il un attribut .Hwnd pour ces applications? – Tom

0

Enfin, j'ai trouvé une solution ... qui ne fonctionne que Activer/Désactiver. Ce n'est pas le moyen idéal pour le faire. Mais je n'ai trouvé aucune bonne alternative. Cette méthode utilise l'interrogation. Je dois appeler la fonction suivante dans chaque intervalle de 10 ms pour vérifier le focus in/out.

public static bool ApplicationIsActivated() 
    { 
     var activatedHandle = GetForegroundWindow(); 
     if (activatedHandle == IntPtr.Zero) 
     { 
      return false;  // No window is currently activated 
     } 

     var procId = Process.GetCurrentProcess().Id; 
     int activeProcId; 
     GetWindowThreadProcessId(activatedHandle, out activeProcId); 

     return activeProcId == procId; 
    } 
Questions connexes