visual - textbox c# ejemplo
Invocar el menĂº contextual de NotifyIcon (4)
Quiero tenerlo de manera que al hacer clic con el botón izquierdo en NotifyIcon también se abra el menú contextual (establecido con la propiedad ContextMenuStrip). ¿Cómo lograría esto? ¿Debo manejar Click y averiguar el posicionamiento por mi cuenta?
Editar: mostrando el menú con los resultados de trayIcon.ContextMenuStrip.Show () hay algunos comportamientos indeseables:
El menú no se muestra en la misma ubicación que si hace clic derecho en NotifyIcon (parece que no puede establecer los coords xey para donde está la barra de tareas, al menos en Windows 7, que es lo que estoy ejecutando). Aparecerá encima de la barra de tareas (no es un gran problema, pero la consistencia sería agradable).
Mientras se muestra el menú, se agrega un icono adicional a la barra de tareas.
Al hacer clic en un lugar que no sea el menú no se cierra (mientras que si hace clic derecho para abrir el menú contextual, haga clic en else, donde se cierra automáticamente el menú contextual).
¿Es posible invocar el menú sin embargo, el controlador de clic derecho incorporado lo está haciendo?
Normalmente manejaría el evento MouseClick para detectar el clic y llamar al método ContextMenuStrip.Show ():
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) {
contextMenuStrip1.Show(Control.MousePosition);
}
Pero eso no funciona correctamente, el CMS no se cerrará cuando haga clic fuera de él. El problema subyacente es una peculiaridad de Windows (también conocida como "error") que se describe en este artículo de KB .
Invocar esta solución en su propio código es bastante doloroso, el pinvoke es desagradable. La clase NotifyIcon tiene esta solución alternativa en su método ShowContextMenu () , solo hacen que sea difícil de acceder, ya que es un método privado. La reflexión puede eludir esa restricción. Descubrí este truco hace 5 años y nadie informó un problema con él. Establezca la propiedad ContextMenuStrip del NFI e implemente el evento MouseUp de la siguiente manera:
using System.Reflection;
...
private void notifyIcon1_MouseUp(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
mi.Invoke(notifyIcon1, null);
}
}
Puede conectar en un evento onClick para el icono de notificación y luego llamar al espectáculo en el clic
private void wire()
{
notifyIcon1.Click += new EventHandler(notifyIcon1_Click);
}
void notifyIcon1_Click(object sender, EventArgs e)
{
contextMenuStrip1.Show(Cursor.Position);
}
Si maneja MouseUp en lugar de Click, podrá saber en qué botón se hizo clic, así como la location del clic. Puede usar esta ubicación como la ubicación para mostrar el ContextMenu
notifyIcon.MouseUp += new MouseEventHandler(delegate(object sender, MouseEventArgs e) { contextMenu.Show(e.Location); });
use el siguiente código para mostrar el menú contextual a la derecha y a la izquierda, haga clic en notifyicon, si encuentra algún problema, envíeme un mensaje de texto a [email protected] (arshad de Islamabd)
//System.Runtime.InteropServices utiliza thi como referencia
[DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern bool SetForegroundWindow(HandleRef hWnd);
private void notifyIcon1_Click(object sender, EventArgs e)
{
SetForegroundWindow(new HandleRef(this, this.Handle));
int x = Control.MousePosition.X;
int y = Control.MousePosition.Y;
x = x - 10;
y = y - 40;
this.contextMenuStrip1.Show(x,y );
//this.PointToClient(Cursor.Position)
}