2011-07-22 24 views
5

Para comunicarme con un determinado servicio, debo anular el WindProc. y recibir mensajes de ventana.WndProc: Cómo obtener mensajes de ventana cuando se minimiza el formulario

Sin embargo, cuando se minimiza el formulario, ya no recibo ningún mensaje. Sé que tiene que ser así, pero ¿hay alguna solución para esto? No quiero tener un formulario oculto que permanezca siempre abierto ...

+0

¿Ha estado buscando en el 'NC_ * 'mensajes? Al igual que el control deslizante en la barra de título, esto también podría ser un "área no cliente". Además, ¿qué quieres decir con los mensajes de la ventana? ¿Como cuando un mouse está sobre la forma minimizada? – Abel

Respuesta

8

También he necesitado resolver un problema similar recientemente. La respuesta de Abel me puso en la dirección correcta. Aquí está un ejemplo completo de cómo lo hice, cambiando una ventana normal en un mensaje de sólo ventana:

class MessageWindow : Form { 

    [DllImport("user32.dll")] 
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

    public MessageWindow() { 
    var accessHandle = this.Handle; 
    } 

    protected override void OnHandleCreated(EventArgs e) { 
    base.OnHandleCreated(e); 
    ChangeToMessageOnlyWindow();   
    } 

    private void ChangeToMessageOnlyWindow() {   
    IntPtr HWND_MESSAGE = new IntPtr(-3); 
    SetParent(this.Handle, HWND_MESSAGE);   
    } 

    protected override void WndProc(ref Message m) { 
    // respond to messages here 
    } 
} 

Prestar atención al constructor: Me he dado cuenta que necesito para acceder a la propiedad de la manija o de otra manera el método OnHandleCreated no se llamará. No estoy seguro de la razón, tal vez alguien puede explicar por qué.

Creo que mi código de ejemplo también responder a una pregunta relacionada: How do I create a message-only window from windows forms?

+0

gracias, funciona como un encanto – lenniep

+0

ATENCIÓN: debe establecer ShowInTaskbar = false. ATENCIÓN: una ventana de solo mensajes no sirve de nada si desea enviar mensajes desde otro proceso porque, a pesar de que MSDN dice que se debe encontrar una ventana de solo mensaje con FindWindowEx, no es así. – Elmue

3

Si desea recibir mensajes de ventana, pero no desea mostrar un formulario para recibirlos, puede usar una ventana de solo mensaje , que nunca se muestra. Si usa eso, ya no es necesario el formulario de C# real que utiliza para interactuar con el usuario para recibir también los mensajes de su servicio de ventana.

Here's more on the subject as MSDN. Sin embargo, es una advertencia, requiere un poco de juego con la API de Windows, porque una ventana de solo mensaje no es soportada directamente por .NET.

0

Usted puede intentar NativeWindow para recibir mensajes (código de VB, lo siento):

Imports System.Windows.Forms 

Public Class MyClass: Inherits NativeWindow 

Private piFormHandle As Integer = 0 
Sub New() 
    Me.CreateHandle(New CreateParams) 
    piFormHandle = CInt(Me.Handle) 
End Sub 

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
    Select Case (m.Msg) 
     Case MyMessage 
    End Select 
    MyBase.WndProc(m) 
End Sub 

End Class 
Cuestiones relacionadas