Tôi có một NotifyIcon trong khay hệ thống. Làm thế nào tôi có thể phát hiện khi người dùng đã nhấp chuột trái vào nó? Tôi cho rằng sự kiện MouseDown
sẽ là những gì tôi muốn sử dụng nhưng nó chỉ xử lý nhấp chuột phải và nhấp chuột giữa nút. Đối với nhấp chuột trái, nó chỉ kích hoạt sau khi người dùng đã thoát (như trong họ vừa thực hiện một cú nhấp chuột bình thường). Có cách nào để có được sự kiện MouseDown không?NotifyIcon có tương đương với MouseDown không?
Trả lời
Đây là theo thiết kế, trình bao tổng hợp thông báo MouseDown từ sự kiện lên. Bạn sẽ thấy lý do tại sao nó hoạt động theo cách này khi bạn nhấp và giữ nút và sau đó bắt đầu kéo. Lưu ý cách cửa sổ tràn vùng thông báo bật lên và cho phép bạn kéo biểu tượng vào đó để xóa nó khỏi vùng hiển thị. Nó không thể làm việc cả hai cách.
Về mặt kỹ thuật, bạn có thể móc cửa sổ thuộc sở hữu của Explorer.exe để nhận được thông báo lỗi trước khi Explorer thực hiện với SetWindowsHookEx(). Tuy nhiên điều đó đòi hỏi một loại DLL mà bạn không thể viết trong C#, nó cần phải được tiêm vào Explorer. Rất bất ổn và khó đánh bại cuộc thi đang cố gắng làm điều tương tự. Cũng là loại mã gây ra những đêm không ngủ cho đội ngũ appcompat Microsoft.
Dường như cơ bản Win32 API Shell_NotifyIcon
gửi một thông điệp WM_LBUTTONDOWN
khi người dùng nhấp chuột vào biểu tượng. Theo số MSDN.
Kiểm tra mã nguồn Windows Forms cho NotifyIcon tiết lộ việc xử lý sự kiện chuột xuống chuẩn, vì vậy nếu thông báo Win32 được gửi vào thời gian "chính xác", nó sẽ hoạt động như bạn muốn/mong đợi.
Tôi phải đồng ý với nhận xét trước rằng NotifyIcon sẽ nuốt WM_LBUTTONDOWN vì nó cần chụp chuột để cho phép người dùng kéo biểu tượng.
Có thể là this article về cách tạo biểu tượng khay cho WPF sẽ hữu ích vì nó cho biết cách sử dụng SetWindowsHookEx
v.v. từ C#.
Điều đó có nghĩa là không có cách nào để xử lý sự kiện được tổ chức bởi vì nó được thiết kế? – Skoder
Tôi không nghĩ có cách nào dễ dàng. Có thể móc các tin nhắn WM_XXX ở mức thấp (trong C++) trước khi thanh tác vụ xử lý chúng, nhưng đó là một thời gian dài kể từ khi tôi đã làm bất cứ điều gì như thế. – Phil
Tôi cũng đã thử một vài thứ. Bạn có tôi tò mò. Tôi thậm chí còn cài đặt VS11 để thử nó ở đó. Không may mắn. Tôi gần như nghĩ rằng nó là một lỗi. Tôi hy vọng ai đó cũng có câu trả lời. – JimDel
Tôi nghĩ rằng nó có thể là một cái gì đó để làm với thực tế là nó có thể được kéo (được xử lý bởi Windows chính nó chứ không phải là ứng dụng). Có lẽ sự kiện 'mousedown' đang được Windows hấp thụ thay vì sủi bọt lên đến ứng dụng. – Skoder
Vì vậy, điều này trên [MSDN] (http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.mousedown.aspx) là hoàn toàn không chính xác? – Steve