2010-03-29 33 views
6

Tôi đang cố gắng mở rộng TextBox kiểm soát để thêm chức năng watermarking. Ví dụ tôi đã tìm thấy trên CodeProject là sử dụng chức năng SendMessage đã nhập.SendMessage vs. WndProc

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 

void SetWatermark() 
{ 
    SendMessage(this.Handle, 0x1501, 0, "Sample"); 
} 

Tôi đang tự hỏi tại sao không sử dụng được bảo vệ WndProc thay

void SetWatermark() 
{ 
    var m =new Message() { HWnd = this.Handle, Msg = 0x1501, WParam = (IntPtr)0, LParam = Marshal.StringToHGlobalUni("Sample") }; 
    WndProc(ref m); 
} 

Cả hai dường như làm việc tốt. Hầu như tất cả các ví dụ tôi đã thấy trên internet sử dụng chức năng SendMessage. Tại sao vậy? Chức năng WndProc được thiết kế để thay thế SendMessage?

P.S. Tôi không biết phải chuyển đổi string thành IntPtr và thấy rằng Marshal.StringToHGlobalUni hoạt động tốt. Có đúng chức năng để làm điều này?

Trả lời

11

WndProc không thay thế SendMessage, nó tương đương với .NET WindowProc. WndProc được gọi bằng bơm thông điệp của ứng dụng (nhận được tin nhắn được gửi hoặc đăng bởi SendMessage hoặc PostMessage) để xử lý chúng. Bằng cách gọi trực tiếp WndProc, bạn bằng cách vượt qua xử lý thông báo đặc biệt mà Windows thực hiện, chẳng hạn như gói WM_PAINT thư và có thể gây ra một số sự cố khó chịu khi thư xuất hiện theo thứ tự mà các cửa sổ trong ứng dụng của bạn mong đợi.

Như đã nêu trong MSDN,

Tất cả các tin nhắn được gửi đến WndProc phương pháp sau khi được lọc qua phương pháp PreProcessMessage.

Phương pháp WndProc tương ứng chính xác với chức năng Windows WindowProc. Để biết thêm thông tin về cách xử lý tin nhắn Windows Windows, hãy xem tài liệu về WindowProc trong thư viện MSDN tại http://msdn.microsoft.com/library.

Bằng cách gọi trực tiếp, bạn tước đoạt hệ thống cơ hội thực hiện xử lý trước hoặc bất kỳ thao tác xử lý thư nào khác. Khuôn khổ .NET chạy trên đầu Windows và không gửi hoặc đăng thông báo, hệ thống cơ bản không thể làm bất cứ điều gì với thông báo đó, vì vậy bạn sẽ mất bất kỳ thứ gì mà hệ thống bên dưới có thể làm cho bạn.

Các vấn đề liên quan