Mostrar un msgbox en primer plano

Resuelto
quent -  
 quent -
Hola,
He hecho un programa con Microsoft Visual Basic 2010 Express. Este programa es muy simple: ingreso una cantidad de horas, minutos y segundos y hace el conteo. Cuando llega al final, muestro un msgbox para avisar que ha terminado. Hasta ahí, ningún problema.
mi problema es que cuando el conteo se termina y estoy trabajando en otro programa en ese momento, no aparece la ventana en primer plano y por tanto no veo que ha terminado.
no he encontrado ninguna solución en internet.

Gracias de antemano por sus respuestas

18 respuestas

cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Sí, es posible:

Form1
 My.Computer.Audio.Play("C:\Windows\Media\Alarm01.wav", AudioPlayMode.BackgroundLoop) 'reproduce en bucle Form2.ShowDialog()


Form2
 'Detiene la reproducción del sonido My.Computer.Audio.Stop() Me.Hide()


--
@+ El Pivert
1
quent
 
¡Es exactamente lo que quería, gracias!
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Hola,

¿por qué no reproducir un sonido en lugar de un MsgBox, como esto:

 My.Computer.Audio.Play("C:\Windows\Media\Alarm01.wav", AudioPlayMode.WaitToComplete) 'reproduce por completo, no se detiene hasta que termina la pieza


la ruta del archivo wave es para Windows 8.1, a verificar en el PC
--
@+ El Pivert
0
MrWhitediamond Mensajes publicados 31 Estado Miembro 1
 
Para crear un MsgBox en primer plano debes usar una de las siguientes valores:

16 --> OK
17 --> OK + CANCEL
18 --> ABORT + RETRY + IGNORE
19 --> YES + NO + CANCEL
20 --> YES + NO
21 --> RETRY + CANCEL

La ventana se mostrará en CRITICAL, lo que significa en primer plano pero también con el sonido de Windows.

Ejemplo de código en vbscript:

x= MsgBox ("El Texto de la ventana",20,"El Título de la ventana")
if x = 6 then //si el usuario hace clic en SI
.....
elseif x = 7 then
.....
end if
0
quent
 
Hola y gracias por vuestras respuestas,
para responder a cs_Le Pivert, en efecto tu método funciona y es por eso que lo voy a usar si no encuentro otra solución pero el problema es que todavía tengo el sonido de mi PC encendido :) (a menos que exista un comando para encender automáticamente el sonido)

para responder a MrWhitediamond, eso no soluciona mi problema porque hiciste como mi código pero cambiando el botón OK por botones sí y no pero eso tampoco muestra la ventana en primer plano. por otro lado hablas de mostrarse en critical, no sé qué querías decir con eso pero me recordó que hay un parámetro que permite mostrar la ventana con un signo de exclamación como si hubiese un error lo que tal vez tenga el efecto de mostrarla en primer plano. no pude probar porque no recuerdo ese parámetro así que si alguien lo conoce, podría intentar.

gracias de nuevo por intentar resolver mi problema.
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Aquí tienes mensaje en español manteniendo la estructura HTML: Voila un ejemplo

 MessageBox.Show("Operación cancelada por el usuario!", "Apertura", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)


pones un punto detrás de MessageBoxIcon. y tendrás un menú contextual con las otras opciones

--
@+ El Pivert
0
quent
 
Gracias,
pude probar pero desafortunadamente no funciona.
por cierto, ¿conoces alguna función que permita encender el sonido de la computadora o hacer sonar una campana aunque el sonido esté apagado? (algunas aplicaciones lo hacen)
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Me lo esperaba!

En este momento te propongo una segunda solución:

Haz tu MsgBox personalizada con un formulario

Vas al proyecto - Añadir un Formulario de Windows.
Normalmente se llamará Form2, si no, tú te ajustas

En el Form1, en lugar de la llamada a tu MsgBox, pon esto:

 Form2.ShowDialog()


Y en tu Form2 añade un Label y un botón con este código:

Public Class Form2 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Me.Hide() End Sub Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Me.Text = "MsgBox perso" Label1.Text = "Ceci est un message" & Environment.NewLine & "c'est la 2ème ligne" & Environment.NewLine & "c'est la 3ème ligne" Label1.AutoSize = True TopMost = True 'Formulario se muestra por encima de los demás ControlBox = False Button1.Text = "Fermer" End Sub End Class


Voilà, bonne programmation
--
@+ Le Pivert
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Para el sonido, prueba los archivos que empiezan con Windows, como esto:

Windows - Alarma de batería

Ver si funcionan sin el sonido

--
@+ El Pivert
0
quent
 
Tu método con la form2 funciona perfectamente!!! ¡muchísimas gracias!
Ya solo me queda adaptar la ventana como quiero.

Para el sonido he intentado poner la tonada "Windows - Alarma batería.wav" pero falla y dice que no encuentra el archivo, mientras que con "Alarm01.wav" todo funciona bien!
quizás no pueda leer archivos cuyo nombre contiene espacios...

¡Gracias de nuevo!
0
quent
 
Hola,
me gustaría pedirte una ayuda adicional para mi proyecto:
tu idea de añadir un timbre/sonnerie me interesó y voy a agregar uno además del mensaje. me gustaría poder tener el mensaje abierto al mismo tiempo que suena la sonnerie y que si se cierra el mensaje antes de que termine la sonnerie, se apague la sonnerie a mitad. ¿Es posible?
0
quent
 
Hola,
Una cosa más: ¿se puede, ya sea activar automáticamente el sonido de la PC, o verificar si el sonido de la PC está encendido?
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
No I don’t see, edit a new post you’ll get more responses!

--
@+ Le Pivert
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Tienes suerte, ¡he encontrado lo que buscas!!!

Colocas 3 botones con este código:

Option Strict On Imports System.Runtime.InteropServices Public Class Form1 <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr End Function Const WM_APPCOMMAND As UInteger = &H319 Const APPCOMMAND_VOLUME_UP As UInteger = &HA Const APPCOMMAND_VOLUME_DOWN As UInteger = &H9 Const APPCOMMAND_VOLUME_MUTE As UInteger = &H8 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Button1.Text = "Monter" Button2.Text = "Baisser" Button3.Text = "Muet" End Sub Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr)) End Sub Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_DOWN * &H10000, IntPtr)) End Sub Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H200EB0, IntPtr), CType(APPCOMMAND_VOLUME_MUTE * &H10000, IntPtr)) End Sub End Class 


Haces clic en Muet una vez más para volver a activar el sonido. a ti de adaptarlo en tu proyecto.

--
@+ Le Pivert
0
quent
 
Hola,
¿has probado este código?
porque yo cuando me las líneas
Option Strict On Imports System.Runtime.InteropServices

me subraya todos los elementos de mi form1 y si no los pongo subraya las líneas
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr End Function

y en todos los casos no puede compilar
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Por supuesto que lo probé!

aquí va, inténtalo:

http://www.cjoint.com/data3/3AjiiXwTTly.htm

--
@+ El Pivert
0
quent
 
El código que me diste funciona bien, pero he entendido qué es lo que no va: tengo las variables h, m y s que corresponden a las horas, minutos y segundos de mi cuenta atrás y estas informaciones las recupero en textbox. Normalmente, hace bien la conversión string → integer, pero con las líneas

Option Strict On Imports System.Runtime.InteropServices

no quiere realizar la conversión de un tipo a otro. ¿Tienes alguna idea?
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Normalmente tienes tus variables que muestran el error en rojo, solo hay que hacer clic derecho sobre él para corregirlo. Si no, lo más sencillo es eliminar esa línea

Option Strict On

Pongo Option Strict On para codificar de forma limpia, es una buena costumbre a adoptar

--
@+ Le Pivert
0
quent
 
¡He encontrado! ¡Hacer falta usar la función CInt() para convertir mi variable!
Entonces el código que me diste funciona bien pero tengo otro problema: si el sonido está encendido y pulso mute, se apaga. En segundo lugar, puedo subir y bajar el volumen pero no puedo elegir un valor fijo; yo quisiera encender el sonido y fijar su valor para que sea siempre el mismo, y las funciones que me diste no me permiten hacerlo.
¿conoces alguna forma de fijar el sonido a un cierto valor o de conocer su valor actual para subir o bajar lo necesario?
0
cs_Le Pivert Mensajes publicados 8437 Estado Colaborador 730
 
Lo que quieres hacer es una aplicación de control de volumen. Creo que para asociarlo a tu MsgBox es un poco pesado. Te propongo una alternativa.

Cuando pongas esto para subir el volumen, se desactiva el modo silencio:

SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr))


Si lo pones 3 veces, sube 3 veces; lo he probado:

 SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr)) SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr)) SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr))


La ventaja con 3 líneas de código es que desactivas el modo silencio y subes el volumen tres veces más.

Buen fin de semana
--
@+ Le Pivert
0
quent
 
Hola,
He adaptado tu idea para obtener exactamente el volumen que quiero:
bajo el sonido 50 veces porque el volumen máximo de mi PC es 100 y la línea
SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_DOWN * &H10000, IntPtr))

baja 2, así que quedo en 0 y luego incremento el número de veces que quiero (por ejemplo 15 veces si quiero un volumen de 30) y en el camino se quita el silencio. Eso da:
For i = 1 To 50 SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_DOWN * &H10000, IntPtr)) Next For i = 1 To 15 SendMessage(Me.Handle, WM_APPCOMMAND, CType(&H30292, IntPtr), CType(APPCOMMAND_VOLUME_UP * &H10000, IntPtr)) Next

no es muy optimizado pero funciona bien.
¡muchas gracias por tu ayuda!
0