Коллеги, возникла очередная проблема, может кто-то подскажет путь..
Есть Windows-приложение на C#, оно запускает несколько thread'ов.
Каждый thread использует обект типа System.Windows.Forms.NotifyIcon для отображения своей иконки в трее..
По клику на иконке должно показываться контекстное меню.
Если вкратце и по существу, то класс, который запускет поток, инициализирует иконку/меню так:
class Class1
{
private System.Windows.Forms.NotifyIcon notifyIcon;
private MenuItem menuItemExitWatcher;
private void menuItemExitWatcher_Click(object sender, EventArgs e)
{
// just write log record
}
private void initMenu()
{
notifyIcon = new NotifyIcon();
notifyIcon.ContextMenu = new ContextMenu();
menuItemExitWatcher = new MenuItem();
notifyIcon.Icon = new System.Drawing.Icon("c:\\path_to_icon\\icon.ico");
notifyIcon.Visible = true;
notifyIcon.ContextMenu.MenuItems.AddRange(new MenuItem[] { menuItemExitWatcher });
menuItemExitWatcher.Index = notifyIcon.ContextMenu.MenuItems.Count - 1; // Last
menuItemExitWatcher.Text = "E&xit";
menuItemExitWatcher.Enabled = true;
menuItemExitWatcher.Click += new System.EventHandler(menuItemExitWatcher_Click);
}
}
После этого класс запускает новый поток с функцией Execute внутри себя.
Иконка появляется.
Проблема в следующем: при клике на иконку ничего не происходит. Попытка повесить на нее обработчик события Click ничего не дает - событие
не приходит вообще.
Если делать без потоков, то проблема немного другая, но помогает понять суть первой..
Если поставить перед void Main() модификатор [STAThread], и вызывать инициализацию иконки/меню в контексте основного потока (но все еще в объекте класса - не статическом), то при правом клике по иконке меню появляется. Однако, при клике на пункт меню опять же событие
не приходит. При еще одном клике на
любой пункт меню приходит
первое событие.
Как я понял из курения интернета - проблема связана с разными потоками и обработкой событий. То есть события то ли приходят не туда, то ли ждут в очереди, которая не так обрабатывается.. Что-то похожее есть, вроде,
тут..
Хочется иметь несколько потоков, управляющих своими иконками.
Кто подскажет решение или путь в котором двигаться?