2010-02-05 32 views
36

Tôi muốn có nó như vậy mà nhấp chuột trái vào NotifyIcon cũng gây ra menu ngữ cảnh (được thiết lập với thuộc tính ContextMenuStrip) để mở. Làm thế nào tôi sẽ đạt được điều này? Tôi có phải xử lý Nhấp và tìm ra vị trí của mình không?
Chỉnh sửa: hiển thị menu có khayIcon.ContextMenuStrip.Show() là một số hành vi không mong muốn:Gọi Trình đơn ngữ cảnh của NotifyIcon

Trình đơn không được hiển thị ở cùng một vị trí như khi nhấp chuột phải vào NotifyIcon (có vẻ như bạn không thể đặt x và y coords đến nơi mà thanh tác vụ, ít nhất là trên Windows 7 đó là những gì tôi đang chạy). Nó sẽ xuất hiện trên thanh tác vụ (không phải là lớn của một thỏa thuận, nhưng sự nhất quán sẽ tốt đẹp).

Trong khi trình đơn được hiển thị, có một biểu tượng bổ sung được thêm vào thanh tác vụ.

Nhấp vào một nơi nào đó ngoài menu không đóng nó (trong khi nếu bạn nhấp chuột phải để hiển thị menu ngữ cảnh, nhấp vào nơi khác sẽ tự động đóng menu ngữ cảnh).

Có thể nào chỉ cần gọi menu, tuy nhiên trình xử lý nhấp chuột được tích hợp sẵn có đang thực hiện không?

Trả lời

82

Bạn thường sẽ xử lý các sự kiện mouseclick để phát hiện các nhấp chuột và gọi ContextMenuStrip.Show() phương pháp:

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) { 
     contextMenuStrip1.Show(Control.MousePosition); 
    } 

Nhưng điều đó không 't thực sự hoạt động đúng, CMS sẽ không đóng khi bạn nhấp vào bên ngoài nó. Vấn đề nằm bên dưới là một quirk Windows (còn gọi là "bug") được mô tả trong this KB article.

Gọi cách giải quyết này trong mã của riêng bạn là khá đau, pinvoke khó chịu. Lớp NotifyIcon có cách giải quyết này trong số ShowContextMenu() method của họ, họ chỉ gặp khó khăn khi truy cập vì đây là phương thức riêng tư. Phản ánh có thể vượt qua giới hạn đó. Tôi phát hiện ra vụ tấn công này 5 năm trước và chưa có ai báo cáo vấn đề với nó. Thiết lập thuộc tính ContextMenuStrip của NFI và thực hiện các sự kiện MouseUp như thế này:

using System.Reflection; 
... 
    private void notifyIcon1_MouseUp(object sender, MouseEventArgs e) { 
     if (e.Button == MouseButtons.Left) { 
     MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic); 
     mi.Invoke(notifyIcon1, null); 
     } 
    } 
+0

@msorens - không muộn để chỉnh sửa :) Got một số thủ thuật nhiều hơn để giải quyết vấn workaround ApplicationContext. Tìm kiếm câu trả lời của tôi cho SetVisibleCore. –

+0

Giải pháp này không sử dụng khả năng gán thuộc tính 'NotifyIcon'' menu' cho đối tượng ContextMenuStrip; và do đó, nó đang làm một hack quá xấu xí để giải quyết một vấn đề mà không nên xảy ra ở nơi đầu tiên. Vui lòng xem http://stackoverflow.com/questions/132612/show-a-contextmenustrip-without-it-showing-in-the-taskbar để biết thêm thông tin. –

+5

Điều đó hoàn toàn vô nghĩa. –

2

Bạn có thể dây trong một sự kiện onClick cho thông báo biểu tượng sau đó gọi chương trình trong trên nhấp chuột

private void wire() 
{ 
    notifyIcon1.Click += new EventHandler(notifyIcon1_Click); 
} 

void notifyIcon1_Click(object sender, EventArgs e) 
{ 
    contextMenuStrip1.Show(Cursor.Position); 
} 
2

Nếu bạn xử lý MouseUp hơn là Click, bạn sẽ có thể cho biết nút được nhấn vào, cũng như số location của lần nhấp. Bạn có thể sử dụng vị trí này là vị trí để hiển thị các ContextMenu

notifyIcon.MouseUp += new MouseEventHandler(delegate(object sender, MouseEventArgs e) { contextMenu.Show(e.Location); }); 
2

sử dụng đoạn mã sau để hiển thị menu ngữ cảnh trên cả hai bên phải và nhấp chuột trái vào NotifyIcon, nếu bạn tìm thấy bất kỳ vấn đề sau đó nhắn tin cho tôi tại arshad_mcs786 @ hotmail. com (Arshad từ Islamabd)
//System.Runtime.InteropServices sử dụng thi như tài liệu tham khảo

[DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] 
    public static extern bool SetForegroundWindow(HandleRef hWnd); 

    private void notifyIcon1_Click(object sender, EventArgs e) 
    { 
     SetForegroundWindow(new HandleRef(this, this.Handle)); 
     int x = Control.MousePosition.X; 
     int y = Control.MousePosition.Y; 
     x = x - 10; 
     y = y - 40; 
     this.contextMenuStrip1.Show(x,y); 
     //this.PointToClient(Cursor.Position) 
    } 
Các vấn đề liên quan