2011-07-22 26 views
5

Để liên lạc với một dịch vụ nhất định, tôi phải ghi đè số WindProc. và nhận tin nhắn cửa sổ.WndProc: Cách nhận thông báo cửa sổ khi biểu mẫu được thu nhỏ

Tuy nhiên, khi biểu mẫu được thu nhỏ, tôi không nhận được bất kỳ tin nhắn nào nữa. Tôi biết rằng nó phải như thế, nhưng có cách giải quyết nào cho việc này không? Tôi không muốn có biểu mẫu ẩn luôn luôn mở ...

+0

Bạn đã từng nhìn vào 'NC_ * 'tin nhắn? Cũng giống như di chuột trong thanh tiêu đề, đây cũng có thể là "khu vực không phải khách hàng". Ngoài ra: bạn có ý gì với các thông điệp cửa sổ? Giống như khi chuột được di chuột qua biểu mẫu thu nhỏ? – Abel

Trả lời

8

Tôi cũng cần giải quyết một vấn đề tương tự gần đây. Câu trả lời của Abel đặt tôi đi đúng hướng. Dưới đây là một ví dụ đầy đủ về cách tôi đã làm nó, bằng cách thay đổi một cửa sổ bình thường vào một tin nhắn chỉ cửa sổ:

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

Chú ý đến các nhà xây dựng: Tôi đã phát hiện ra rằng tôi cần phải truy cập vào các tài sản Xử lý hoặc phương thức OnHandleCreated sẽ không được gọi. Không chắc chắn lý do, có lẽ ai đó có thể giải thích tại sao.

Tôi tin rằng mẫu mã của tôi cũng sẽ trả lời một câu hỏi liên quan: How do I create a message-only window from windows forms?

+0

cảm ơn, hoạt động như một nét duyên dáng – lenniep

+0

CHÚ Ý: Bạn phải đặt ShowInTaskbar = false. CHÚ Ý: Một cửa sổ chỉ thông báo là vô ích nếu bạn muốn gửi tin nhắn từ một tiến trình khác bởi vì mặc dù MSDN nói rằng một cửa sổ thông báo chỉ được tìm thấy với FindWindowEx, nó không phải là. – Elmue

3

Nếu bạn muốn nhận tin nhắn cửa sổ nhưng không muốn hiển thị biểu mẫu để nhận chúng, bạn có thể sử dụng cửa sổ chỉ thông báo , không bao giờ được hiển thị. Nếu bạn sử dụng nó, C# Form thực tế bạn sử dụng để tương tác với người dùng không còn cần thiết để nhận các tin nhắn từ dịch vụ cửa sổ của bạn nữa.

Here's more on the subject as MSDN. Một cảnh báo mặc dù, nó đòi hỏi một chút chơi xung quanh với Window API, bởi vì một cửa sổ thông báo chỉ không được hỗ trợ trực tiếp bởi .NET.

0

Bạn có thể thử NativeWindow để nhận tin nhắn (mã VB, xin lỗi):

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 
Các vấn đề liên quan