Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: TomaSs en 20 Octubre 2012, 00:40 am



Título: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 20 Octubre 2012, 00:40 am
Pues eso, que quería saber si hay alguna manera de evitar el minimizado de un formulario, no quitar el botón de minimizar, sino evitar el minimizado de alguna manera, bien de alguna manera directa que lo evite, o detectando el momento en que sea minimizado y restaurándolo automáticamente.

Y claro, tampoco quiero un timer o un thread que esté constantemente comprobando si ha sido minimizado o no, porque eso es una chapuza tremenda...

Decir que, principalmente quiero esto para, en el momento que al pinchar en el icono de "mostrar escritorio", evitar que sea minimizado mi formulario.


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: Novlucker en 20 Octubre 2012, 00:56 am
Puedes suscribirte al evento SizeChanged del form y chequear el WindowState, algo así ...

Código
  1. private void Form1_SizeChanged(object sender, EventArgs e)
  2. {
  3.    if (this.WindowState == FormWindowState.Minimized)
  4.    {
  5.  
  6.    }
  7. }

Saludos


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 20 Octubre 2012, 01:13 am
Gracias por responder.
Pues la verdad que eso no funciona, porque ese evento si que se lanza cuando yo minimizo desde mi formulario, es decir, mediante el botón de minimizado, o bien haciendo this.WindowState = FormWindowState.Minimized;, pero si yo minimizo desde el botón de "mostrar escritorio", no lanza ese evento, ya que imagino que minimizará por medio de apis del sistema, y no llamando a eventos del propio formulario, por lo que no creo que pueda hacerse con ningún evento.

Tal vez solo sea posible haciendo api hooking o algo así, no se...
A ver si alguien más puede aportar algo.

Gracias!


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: Novlucker en 20 Octubre 2012, 01:42 am
Bien, el problema es que no presté tanta atención a la última oración, donde estaba lo más importante :silbar:

El tema es que al clickear a "Mostrar escritorio" en realidad no se esta minimizando ni cambiando el tamaño de ninguna ventana, simplemente se esta trayendo el escritorio por sobre todas las demás.

Lo que puedes hacer es cambiar la propiedad TopMost del form a true, no recuerdo si tiene una traducción, tengo el Visual en inglés :P, formulario de nivel superior? :P

Saludos


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 20 Octubre 2012, 01:57 am
Vale, perfecto, me has alumbrado bastante
Es cierto que con topmost no lo oculta, de echo lo tenía en topmost pero dejaba de verlo y te explico porque, para ver si aún así podrías ayudarme un poco más.
El tema es, que mi formulario (un formulario muy pequeñito y sin bordes) lo coloco sobre la barra de inicio, concretamente al lado del reloj, pero al pulsar en "mostrar escritorio", a pesar de estar mi formulario en topmost, coloca la barra de inicio sobre mi formulario, por eso dejaba de verlo, porque se queda por detrás de la barra. Sabes si podría hacer algo para que se quede siempre por encima de la barra de inicio?

Así es como quiero que me quede mi formulario (el cuadrito verde)

(http://i.imgur.com/Q48qw.png)

y que a pesar de darle a mostrar escritorio se quede visible sobre la barra de inicio


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: Novlucker en 20 Octubre 2012, 02:16 am
Por desgracia no se me ocurre otra cosa :-\ estoy probando y en mi caso si queda por sobre todo, incluso por sobre la barra de menú, pero de vez en cuando doy click en la barra y la ventana queda detrás, y ahí si no hay manera de traerla al frente :-\

Saludos


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 20 Octubre 2012, 03:07 am
Algo que se me a ocurrido hacer es, redimensionar la barra de inicio y dejarle un huequito a mi formulario, mas o menos así:

(http://i.imgur.com/DVAqx.png)

pero me he puesto a redimensionarla con movewindow y nada, parece ser que a la barra de inicio no se le puede cambiar el tamaño :S


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: seba123neo en 20 Octubre 2012, 05:53 am
queres hacer algo asi como los widget de windows.

aca hay que usar magia negra  :xD, podes combinar la propiedad TopMost y capturar el mensaje que ocurre cuando se minimiza y creo que funciona, este codigo evita el minimizar y tambien el mostrar escritorio de windows (tambien WINDOWS+M o WINDOWS+D).

Código
  1. Imports System
  2. Imports System.Windows.Forms
  3.  
  4. Public Class Form1
  5.  
  6.    Private Const WM_SYSCOMMAND As Int32 = &H112
  7.    Private Const SC_MINIMIZE As Int32 = &HF020
  8.  
  9.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  10.        Me.TopMost = True
  11.    End Sub
  12.  
  13.    Protected Overrides Sub WndProc(ByRef m As Message)
  14.        If m.Msg = WM_SYSCOMMAND Then
  15.            If m.WParam.ToInt32() = SC_MINIMIZE Then Exit Sub
  16.        End If
  17.        MyBase.WndProc(m)
  18.    End Sub
  19.  
  20.    Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
  21.        If Me.WindowState = FormWindowState.Minimized Then
  22.            Me.WindowState = FormWindowState.Normal
  23.        End If
  24.    End Sub
  25. End Class

saludos.


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 20 Octubre 2012, 07:28 am
gracias por tu respuesta seba, pero eso tampoco funciona, porque como dijo novlucker, no es que se minimice el formulario, sino que la barra de tareas lo tapa, sin mas.
otra cosa que he hecho, ha sido incrustar mi formulario dentro del boton de "mostrar escritorio" con SetParent, y así nunca lo tapa la barra de tareas, ya que está dentro de ella, el problema que tiene esto es que al redibujarse el botón de mostrar escritorio, se borra el formulario hasta que pasas sobre el con el puntero (http://i.imgur.com/XBJcG.png) o le haces un refresh para que lo redibuje, no se como se podría hacer para que hiciera refresh automáticamente, o que el propio botón de mostrar escritorio lo respete y no dibuje sobre el, no se si habrá algo...


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: Crazy.sx en 20 Octubre 2012, 08:01 am
Código:
MinimizeBox = false


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 20 Octubre 2012, 08:14 am
Código:
MinimizeBox = false

porlomenos lee un poco, no? xddd


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: Crazy.sx en 20 Octubre 2012, 09:15 am

Pues eso, que quería saber si hay alguna manera de evitar el minimizado de un formulario, no quitar el botón de minimizar, sino evitar el minimizado de alguna manera, bien de alguna manera directa que lo evite, o detectando el momento en que sea minimizado y restaurándolo automáticamente.

Y claro, tampoco quiero un timer o un thread que esté constantemente comprobando si ha sido minimizado o no, porque eso es una chapuza tremenda...

Decir que, principalmente quiero esto para, en el momento que al pinchar en el icono de "mostrar escritorio", evitar que sea minimizado mi formulario.

no quitar el botón de minimizar

porlomenos lee un poco, no? xddd

Yo funciono así. No le quité el botón de minimizar, sigue estando ahí  :xD :xD Sólo que está desactivado.  :P

Ok, ok, ya entendí a lo que vas.

Pero que raro que la solución que te da seba no sea lo que buscás, porque funciona para lo que pides.

Saludos, jeje.




Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 20 Octubre 2012, 09:39 am
Por lo que comento aquí:

gracias por tu respuesta seba, pero eso tampoco funciona, porque como dijo novlucker, no es que se minimice el formulario, sino que la barra de tareas lo tapa, sin mas.

Con lo cual, los eventos que puso seba no se lanzan en ningún momento al pulsar sobre "mostrar escritorio"


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: seba123neo en 20 Octubre 2012, 19:49 pm
la verdad no entiendo, ¿ probaste el codigo que te pase ?.

cuando apretas el minimizar o el mostrar escritorio, se ejecuta un mensaje en la aplicacion que hace que se minimize (no evento), en el codigo que te puse lo que hace es ignorar ese mensaje y por mas que apretes el mostrar escritorio la aplicacion queda como estaba arriba de todo, y si tratas de minimizarlo con el boton de minimizar lo ignora tambien, pone un punto de interrupcion en el codigo y te vas a dar cuenta que al apretar el mostrar escritorio se ejecuta el SC_MINIMIZE que despues se cancela y hace que la aplicacion quede tal cual estaba, no se que es lo que no funciona, sino explicate mejor porque todos entendimos eso.


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 21 Octubre 2012, 21:10 pm
la verdad no entiendo, ¿ probaste el codigo que te pase ?.

cuando apretas el minimizar o el mostrar escritorio, se ejecuta un mensaje en la aplicacion que hace que se minimize (no evento), en el codigo que te puse lo que hace es ignorar ese mensaje y por mas que apretes el mostrar escritorio la aplicacion queda como estaba arriba de todo, y si tratas de minimizarlo con el boton de minimizar lo ignora tambien, pone un punto de interrupcion en el codigo y te vas a dar cuenta que al apretar el mostrar escritorio se ejecuta el SC_MINIMIZE que despues se cancela y hace que la aplicacion quede tal cual estaba, no se que es lo que no funciona, sino explicate mejor porque todos entendimos eso.

El problema es que si se consigue evitar que se minimice, pero como mi formulario está sobre la barra de tareas, así:

(http://i.imgur.com/Q48qw.png)

pues al darle a mostrar escritorio, se pone la barra de tareas sobre mi formulario, quedando este por detrás, la idea sería que nunca quedara por detrás de la barra de tareas


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: seba123neo en 21 Octubre 2012, 23:41 pm
logre hacer que al dar mstrar escriotrio se quede donde esta, pero el tema es que si apretas 2 veces rapido algo pasa y se vuelve a ocultar.

digo yo, si queres que la aplicacion este ahi siempre visible, porque no pones un icono en la barra de tareas como hacen todos los programas y listo, ahi no tendrias que lidiar con todo esto, ya que siempre quedaria el icono ahi.



Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 22 Octubre 2012, 00:30 am
yo también lo he logrado y me pasa lo mismo que a ti, cuando doy dos veces muy rápido pasa detrás y si le vuelvo a dar a mostrar escritorio ya si se pone delante, pero finalmente lo he conseguido evitar haciéndole un sleep, así lo he hecho:


       
Código
  1. private bool trayendo = false;
  2.        const Int32 WM_NCPAINT = 0x85;
  3.  
  4.        protected override void WndProc(ref Message m)
  5.        {
  6.            if (m.Msg == WM_NCPAINT && !trayendo)
  7.            {
  8.                trayendo = true;
  9.                traerFrente();
  10.            }
  11.            base.WndProc(ref m);
  12.        }
  13.  
  14.        private void traerFrente()
  15.        {
  16.            Thread.Sleep(150);
  17.            this.BringToFront();
  18.            trayendo = false;
  19.        }

Como puedes ver, lo he hecho analizando en WndProc el flag WM_NCPAINT, en vez de el WM_SYSCOMMAND, con el cual no entraba al if
Como lo hiciste tu? de la misma forma?


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: seba123neo en 22 Octubre 2012, 14:49 pm
parecido, pero con el mensaje WM_KILLFOCUS que se ejecuta cuando el formulario pierde el foco y ahi lo pongo al frente y funciona tambien. por ahi capas que ese mensaje WM_NCPAINT se ejecuta mas veces y hace que se ponga lento si lo queres arrastrar al form, fijate.


Título: Re: Como evitar el minimizado de un formulario???
Publicado por: TomaSs en 22 Octubre 2012, 16:39 pm
parecido, pero con el mensaje WM_KILLFOCUS que se ejecuta cuando el formulario pierde el foco y ahi lo pongo al frente y funciona tambien. por ahi capas que ese mensaje WM_NCPAINT se ejecuta mas veces y hace que se ponga lento si lo queres arrastrar al form, fijate.

Claro, pero a mi formulario le he quitado los bordes, y supuestamente es para que no se mueva nunca, es decir, que una vez que se ejecuta se coloca donde se tiene que colocar y no se le permite que se mueva xdd

De todos modos, muchas gracias por la ayuda a todos los que ayudaron, gracias ;)