Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: piluve en 17 Enero 2014, 12:51 pm



Título: MessageBox , problema a la hora de mostralo.
Publicado por: piluve en 17 Enero 2014, 12:51 pm
Hola!!!

Tengo un problema con esta función de la librería windows.h.

El problema es que estoy utilizando estas ventanas para mostrar mensajes de error cuando el usuario hace cosas indebidas.

Aquí os dejo el código:


Código:
void Mensaje(int cod)
{
    if(cod==0)
    {
        MessageBox(NULL, "Pon la ficha sobre un espacio en blanco" , "Stratego 1.0",MB_OK );
        //MB_ICONASTERISK
        //MessageBox(NULL,)
    }
    if(cod==1)
    {
        //MessageBox(NULL, "Has pulsado una tecla no registrada" , "Stratego 1.0", MB_ICONASTERISK);
    }

}



Tengo dos problemas:

El primero, cuando salta la ventana POR PRIMERA VEZ, salta en segundo plano no por encima de mi programa.

Cuando salta la ventana , si selecciono mi programa y hago cualquier acción , cuando cierro mi Messagebox, estas acciones se hacer.

¿Cómo puedo hacer para evitar estas cosas?

Un saludo


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: Eternal Idol en 17 Enero 2014, 15:50 pm
El primer parametro es un HWND, pasandole el correcto deberias solucionar ambos problemas ya que como dice la documentacion (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505%28v=vs.85%29.aspx):

MB_APPLMODAL
0x00000000L

The user must respond to the message box before continuing work in the window identified by the hWnd parameter. However, the user can move to the windows of other threads and work in those windows.

...

MB_APPLMODAL is the default if neither MB_SYSTEMMODAL nor MB_TASKMODAL is specified.


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: piluve en 18 Enero 2014, 13:05 pm
Hola!

Gracias por tu respuesta, lo que he conseguido es que mi ventana se muestre ahora en "TOP" siempre pero no puedo evitar que si el usuario selecciona la aplicación pueda hacer cosas aún estando el messagebox.

Código:
MessageBox(NULL, "Pon la ficha sobre un espacio en blanco" , "Stratego 1.0",MB_OK|MB_TOPMOST|MB_APPLMODAL);

Creo que ahora el problema esta en que debería asignarle una ventana al campo "NULL" pero no estoy muy seguro de como hacerlo.

Un saludo.


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: x64core en 18 Enero 2014, 17:32 pm
Hola!

Gracias por tu respuesta, lo que he conseguido es que mi ventana se muestre ahora en "TOP" siempre pero no puedo evitar que si el usuario selecciona la aplicación pueda hacer cosas aún estando el messagebox.

Código:
MessageBox(NULL, "Pon la ficha sobre un espacio en blanco" , "Stratego 1.0",MB_OK|MB_TOPMOST|MB_APPLMODAL);

Creo que ahora el problema esta en que debería asignarle una ventana al campo "NULL" pero no estoy muy seguro de como hacerlo.

Un saludo.
Lo que debes hacer es obtener el handle de la ventana de la aplicación principal ( no ventanas hijas ) y pasarselo al primer parametro
de MessageBox. Yo no sé de que manera estas creando la ventana principal así que no podria decirte algo directo o talvez FindWindow pero seria incesario si la estas creando por ejemplo con CreateWindow simplemente guardas el valor retornado por la funcion para usarlo despues.


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: piluve en 18 Enero 2014, 18:35 pm
En realidad no estoy creando una ventana sino que estoy utilizando el CMD de windows.

¿Quizás esto afecte en algo?

Un saludo.


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: x64core en 18 Enero 2014, 19:08 pm
En realidad no estoy creando una ventana sino que estoy utilizando el CMD de windows.

¿Quizás esto afecte en algo?

Un saludo.
¿Que quieres decir?
Estas llamando la CMD desde tu programa C/C++ y enviandole comandos o estas usando directamente la CMD?


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: piluve en 18 Enero 2014, 19:14 pm
Estoy haciendo un programa en modo texto que se ejecuta directamente en el intérprete de windows , el cmd.


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: x64core en 18 Enero 2014, 19:21 pm
Estoy haciendo un programa en modo texto que se ejecuta directamente en el intérprete de windows , el cmd.
usa GetConsoleWindow, el resultado al primer parametro de MessageBox.


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: piluve en 18 Enero 2014, 19:47 pm
Parece que no funciona de esta manera.
 
Dice que "GetConsoleWindow(); was not declared on this scope."

He probado creando este define:
Código:
#define _WIN32_WINNT 0x0500

Y nada.

Esto no va ...


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: x64core en 18 Enero 2014, 19:56 pm
Parece que no funciona de esta manera.
 
Dice que "GetConsoleWindow(); was not declared on this scope."

He probado creando este define:
Código:
#define _WIN32_WINNT 0x0500

Y nada.

Esto no va ...
Si es así entonces es error de compilación, que compilador estas usando? estas incluyendo las cabeceras correctas? Tu código?



Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: piluve en 18 Enero 2014, 20:06 pm
Includes:

Código:
#include <MiWindows.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>


#define _WIN32_WINNT 0x0500
#include<windows.h>


El código consta de más de 1000 líneas y el problema me lo da solo cuando utilizo GetConsoleWindow así que supongo que no será el problema.

El compilador es CodeBlocks.

Un saludo


Título: Re: MessageBox , problema a la hora de mostralo.
Publicado por: x64core en 18 Enero 2014, 20:17 pm
Includes:

Código:
#include <MiWindows.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>


#define _WIN32_WINNT 0x0500
#include<windows.h>


El código consta de más de 1000 líneas y el problema me lo da solo cuando utilizo GetConsoleWindow así que supongo que no será el problema.

El compilador es CodeBlocks.

Un saludo

Bueno entonces es problema del compilador. No uso CodeBlocks, Montones de problemas como estos, con VC++ los evitas. realmente recomiendo VC++ como compilador si se programará para Windows.