c# powershell - Affichage d'une info-bulle sur un ToolStripItem non ciblé




tooltip windows (5)

J'essayais de faire la même chose et j'ai déterminé que ça allait être difficile et que ça ne valait pas le coup. La raison en est qu'en interne, le code .NET est spécifiquement conçu pour afficher uniquement l'info-bulle si la fenêtre est active - ils vérifient cela au niveau Win32, il sera donc difficile de truquer le code.

Voici l'extrait de code dans ToolTip.cs qui vérifie "GetActiveWindow ()" et renvoie false. Vous pouvez voir le commentaire dans le code "ToolTips devrait être montré uniquement sur Windows actif."

En passant, vous pouvez voir tout le code source pour le .NET BCL avec Visual Studio 2008, voici les instructions que j'ai utilisées:

http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx

// refer VsWhidbey 498263: ToolTips should be shown only on active Windows.
private bool IsWindowActive(IWin32Window window)
{ 
    Control windowControl = window as Control;
    // We want to enter in the IF block only if ShowParams does not return SW_SHOWNOACTIVATE. 
    // for ToolStripDropDown ShowParams returns SW_SHOWNOACTIVATE, in which case we DONT want to check IsWindowActive and hence return true. 
    if ((windowControl.ShowParams & 0xF) != NativeMethods.SW_SHOWNOACTIVATE)
    { 
        IntPtr hWnd = UnsafeNativeMethods.GetActiveWindow();
        IntPtr rootHwnd =UnsafeNativeMethods.GetAncestor(new HandleRef(window, window.Handle), NativeMethods.GA_ROOT);
        if (hWnd != rootHwnd)
        { 
            TipInfo tt = (TipInfo)tools[windowControl];
            if (tt != null && (tt.TipType & TipInfo.Type.SemiAbsolute) != 0) 
            { 
                tools.Remove(windowControl);
                DestroyRegion(windowControl); 
            }
            return false;
        }
    } 
    return true;
} 

ToolStripItems affiche la surbrillance Active lorsque vous passez la souris dessus, même si le formulaire dans lequel ils se trouvent n'est pas actif. Cependant, ils ne montrent pas leurs infobulles, à moins que le formulaire ne soit ciblé. J'ai vu le hack ToolStrip 'click-though' . Quelqu'un sait-il comment afficher une info-bulle ToolStripButton lorsque son formulaire parent n'est pas au point?

Merci!


Peut-être que l'une des deux approches de ce code vous amènera dans la bonne direction ...

public Form1()
{
    InitializeComponent();

    tooltip = new ToolTip();
    tooltip.ShowAlways = true;
}

private ToolTip tooltip;
private void toolStripButton_MouseHover(object sender, EventArgs e)
{
    if (!this.Focused)
    {
        ToolStripItem tsi = (ToolStripItem)sender;
        tooltip.SetToolTip(toolStrip1, tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text);
        /*tooltip.Show(tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text, this, 
            new Point(toolStrip1.Left, toolStrip1.Bottom));*/
    }
}

private void toolStripButton_MouseLeave(object sender, EventArgs e)
{
    tooltip.RemoveAll();
}

Le problème avec le premier est que vous ne pouvez pas le régler directement sur le bouton, il n'hérite pas de Control, et l'info-bulle n'apparaîtra pas à moins que vous soyez sur la bande mais pas sur un bouton.

Le problème avec le second (commenté) est qu'il ne s'affiche pas du tout. Je ne sais pas trop pourquoi, mais peut-être que vous pouvez le déboguer.


J'ai essayé quelques choses et j'ai trouvé que c'était le plus simple

quand je crée les éléments de bouton toolstripbutton j'ai ajouté un gestionnaire d'événement à son événement hover:

private sub SomeCodeSnippet()

    Me.tooltipMain.ShowAlways = True

    Dim tsi As New ToolStripButton(String.Empty, myImage)
    tsi.ToolTipText = "my tool tip text"
    toolstripMain.Add(tsi)

    AddHandler tsi.MouseHover, AddressOf ToolStripItem_MouseHover

end sub

puis le gestionnaire d'événement:

Private Sub ToolStripItem_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs)

    If TypeOf sender Is ToolStripButton Then
        Me.tooltipMain.SetToolTip(Me.toolstripMain, CType(sender, ToolStripButton).ToolTipText)
    End If

End Sub

Cela fonctionne très bien, même si je remarque un léger retard initial lorsque vous survolez la barre d'outils pour la première fois


Le problème est que les «contrôles» ToolStrip comme ToolStripButton ou ToolStripDropDownButton n'héritent pas de contrôle. Pour l'instant, j'ai résolu le problème en focalisant ToolStrip chaque fois qu'un utilisateur passe la souris sur un bouton. L'événement MouseHover du bouton est déclenché trop tard - après l'exécution du code "show tooltip", j'ai donc étendu la classe ToolStripDropDownButton et utilisé mon nouveau bouton. Cette méthode devrait fonctionner pour toutes les autres classes de type bouton héritant de ToolStripItem

public class ToolStripDropDownEx : ToolStripDropDownButton
{
    public ToolStripDropDownEx(string text)
    {
    }

    protected override void OnMouseHover(EventArgs e)
    {
        if (this.Parent != null)
            Parent.Focus();
        base.OnMouseHover(e);
    } 
}

Plus précisement

AppDomain domain = AppDomain.CreateDomain("New domain name");
//Do other things to the domain like set the security policy

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load
Type t = typeof(TypeIWantToLoad);
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

Si tout ce qui se passe correctement (sans exception levée), vous avez maintenant une instance de TypeIWantToLoad chargée dans votre nouveau domaine. L'instance que vous avez est en fait un proxy (puisque l'objet est dans le nouveau domaine) mais vous pouvez l'utiliser comme votre objet normal.

Note: À ma connaissance, TypeIWantToLoad doit hériter de MarshalByRefObject.





c# .net winforms tooltip toolstrip