winforms - tareas - ¿Cómo puedo abrir el menú del sistema de una ventana por código?
menu de sistema abierto android (3)
Tengo las mismas propiedades en mi aplicación y el clic derecho tampoco funciona, así que este no es su problema , parece ser la forma en que los formularios de Windows responden cuando no tienen borde.
Si configura su borde al valor normal, podrá hacer clic con el botón derecho en la barra de tareas y tal.
Para hacer clic con el botón derecho en otros controles, deberá configurar ContextMenuStrip y proporcionar su "menú". Pero no estoy seguro si esto funciona cuando lo tienes sin borde. No he podido hacerlo funcionar.
Tengo una ventana sin bordes C WinForms, para la cual anulo WndProc y manejo el mensaje WM_NCHITTEST. Para un área de esa forma, mi función de prueba de aciertos devuelve HTSYSMENU. Al hacer doble clic en esa área, se cierra el formulario con éxito, pero al hacer clic con el botón derecho no se muestra el menú del sistema de la ventana ni aparece al hacer clic con el botón derecho en el nombre de la ventana en la barra de tareas.
Esta forma usa estos estilos:
this.SetStyle( ControlStyles.AllPaintingInWmPaint, true );
this.SetStyle( ControlStyles.UserPaint, true );
this.SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
this.SetStyle( ControlStyles.ResizeRedraw, true );
Y tiene estos valores de propiedad no predeterminados:
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.KeyPreview = true;
this.MaximizeBox = false;
this.MinimizeBox = false;
He intentado manejar WM_NCRBUTTONDOWN y WM_NCRBUTTONUP, y he enviado el mensaje WM_GETSYSMENU, pero no funcionó.
Una ventana sin bordes, si no me equivoco, está marcada de tal manera que no ofrece menú del sistema y que no aparece en la barra de tareas.
El hecho de que una ventana dada no tenga un borde y no aparezca en la barra de tareas es el resultado de los indicadores de estilo establecidos en la ventana. Estos distintivos de estilo en particular se pueden establecer utilizando las llamadas a la API GetWindowLong y SetWindowLong. Sin embargo, debe tener cuidado ya que ciertos estilos simplemente no funcionan juntos.
A lo largo de los años, he escrito varios controles personalizados y estoy persuadiendo constantemente a las ventanas para que se conviertan en algo que originalmente no estaban destinados a ser. Por ejemplo, escribí mi propio control desplegable donde necesitaba una ventana para comportarme como una ventana emergente y no para activarla. El siguiente código hará eso. Tenga en cuenta que el código aparece en el controlador de eventos OnHandleCreated. Esto se debe a que los indicadores deben cambiarse justo después de que se configuró el identificador, lo que indica que Windows ya ha establecido lo que cree que deberían ser las banderas.
protected override void OnHandleCreated(EventArgs e) {
uint dwWindowProperty;
User32.SetParent( this.Handle, IntPtr.Zero );
dwWindowProperty = User32.GetWindowLong( this.Handle, User32.GWL.EXSTYLE );
dwWindowProperty = dwWindowProperty | (uint)User32.WSEX.TOOLWINDOW | (uint)User32.WSEX.NOACTIVATE;
User32.SetWindowLong( this.Handle, User32.GWL.EXSTYLE, dwWindowProperty );
dwWindowProperty = User32.GetWindowLong( this.Handle, User32.GWL.STYLE );
dwWindowProperty = ( dwWindowProperty & ~(uint)User32.WS.CHILD ) | (uint)User32.WS.POPUP;
User32.SetWindowLong( this.Handle, User32.GWL.STYLE, dwWindowProperty );
base.OnHandleCreated (e);
}
//this is a fragment of my User32 library wrapper needed for the previous code segment.
class User32 {
[DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall )]
public static extern int SetWindowLong( IntPtr hWnd, User32.GWL gwlIndex, uint dwNewLong);
[DllImport("user32.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall )]
public static extern uint GetWindowLong( IntPtr hWnd, User32.GWL gwlIndex );
[FlagsAttribute]
public enum WS: uint {
POPUP = 0x80000000,
CHILD = 0x40000000,
}
public enum GWL {
STYLE = -16,
EXSTYLE = -20
}
[FlagsAttribute]
public enum WSEX: uint {
TOP = 0x0,
TOPMOST = 0x8,
TOOLWINDOW = 0x80,
NOACTIVATE = 0x08000000,
}
}
Lamentablemente, el estilo SysMenu no se puede establecer sin utilizar el estilo de título, por lo que no puedo decir si esto es un problema en su implementación.
Puede consultar la lista de estilos original y la lista de estilos ampliados en estos dos enlaces. http://msdn.microsoft.com/en-us/library/ms632600(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx
protected override void WndProc( ref System.Windows.Forms.Message m )
{ // RightClickMenu
if ( m.Msg == 0x313 )
{
this.contextMenuStrip1.Show(this, this.PointToClient(new Point(m.LParam.ToInt32())));
}}
Esto detecta el clic derecho en el "área" de la barra de tareas de las aplicaciones.
tal vez ayude?