2011-07-22 10 views
5

Aby komunikować się z pewną usługą, muszę zastąpić WindProc. i odbierać wiadomości w oknie.WndProc: Jak uzyskać komunikaty okna po zminimalizowaniu formularza

Jednak po zminimalizowaniu formularza nie otrzymuję już żadnej wiadomości. Wiem, że tak musi być, ale czy istnieje obejście tego problemu? Nie chcę mieć ukrytego formularza, który pozostaje zawsze otwarty ...

+0

Czy zostały patrząc na 'NC_ * 'wiadomości? Podobnie jak wskaźnik w pasku tytułu, może to być także obszar "poza obszarem klienta". Ponadto: co masz na myśli z wiadomościami w oknie? Jak wtedy, gdy mysz unosi się nad zminimalizowaną formą? – Abel

Odpowiedz

8

Niedawno musiałem rozwiązać podobny problem. Odpowiedź Abla postawiła mnie we właściwym kierunku. Powyżej znajduje się pełna przykładów, jak to zrobiłem, zmieniając normalne okno do wiadomości-jedynego okna:

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 
    } 
} 

zwrócić uwagę na konstruktora: Odkryłem, że muszę dostępu do właściwości uchwytu lub inaczej metoda OnHandleCreated nie zostanie wywołana. Nie jestem pewien powodu, może ktoś może wyjaśnić dlaczego.

wierzę mój przykładowy kod również odpowie powiązany pytanie: How do I create a message-only window from windows forms?

+0

dziękuję, działa jak czar – lenniep

+0

UWAGA: Musisz ustawić ShowInTaskbar = false. UWAGA: Okno tylko do wiadomości jest bezużyteczne, jeśli chcesz wysyłać wiadomości z innego procesu, ponieważ pomimo tego, że MSDN mówi, że okno z komunikatem FindWindowEx powinno zostać znalezione, to tak nie jest. – Elmue

3

Jeśli chcesz odbierać wiadomości w oknie, ale nie chcesz wyświetlać formularza do ich odbierania, możesz użyć okna tylko z komunikatem , który nigdy nie jest wyświetlany. Jeśli używasz tego, rzeczywisty formularz C# używany do interakcji z użytkownikiem nie jest już potrzebny, aby również otrzymywać wiadomości z usługi okna.

Here's more on the subject as MSDN. Jednak ostrzeżenie wymaga sporo zabawy z Window API, ponieważ okno z samym komunikatem nie jest bezpośrednio obsługiwane przez .NET.

0

można spróbować NativeWindow otrzymywać wiadomości (kod VB, przepraszam):

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 
Powiązane problemy