Harmohan Singh Ответов: 2

Taskbariteminfo не показывает наложение заданное из кода


Привет, я пытаюсь установить achieve skype like notification для моего приложения wpf tired solutions, чтобы достичь этого из кода позади, но либо застреваю на ошибке "вызывающий поток не может получить доступ к объекту, потому что им владеет другой поток", либо когда я создаю новый поток и добавляю наложение в TaskbarItemInfo, ничего не происходит

Что я уже пробовал:

public void createIcon(string countNot)
        {
            try
            {
                RectangleF rectF = new RectangleF(0, 0, 40, 40);
                Bitmap bitmap = new Bitmap(40, 40, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(bitmap);
                g.FillRectangle(System.Drawing.Brushes.White, 0, 0, 40, 40);
                g.DrawString(countNot, new Font("Arial", 25), System.Drawing.Brushes.Black, new PointF(0, 0));

                IntPtr hBitmap = bitmap.GetHbitmap();

                ImageSource wpfBitmap =
                    Imaging.CreateBitmapSourceFromHBitmap(
                        hBitmap, IntPtr.Zero, Int32Rect.Empty,
                        BitmapSizeOptions.FromEmptyOptions());
                
                new Thread(() =>
                {

                    Thread.CurrentThread.IsBackground = false;
                    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate {

                        TaskbarItemInfo ittem = new TaskbarItemInfo();
                        ittem.Overlay = wpfBitmap;
                        

                    }, null);
                }).Start();
               
                





            }
            catch (Exception ex)
            {
                string path = @"C:\Logs\logs.txt";
                File.AppendAllLines(path, new[] { "---------------------" + "\rn" + ex.Message + "\n" + " stack trace: " + ex.StackTrace });

            }
        }

Gerry Schmitz

Похоже, много хлопот напрасно. WPF не требует этого низкоуровневого crud.

Harmohan Singh

Не понял тебя Джерри

Richard Deeming

new Thread(() =>
{
    Thread.CurrentThread.IsBackground = false;
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, (SendOrPostCallback)delegate {
        TaskbarItemInfo ittem = new TaskbarItemInfo();
        ittem.Overlay = wpfBitmap;
    }, null);
}).Start();


Почему вы запускаете новый поток только для того, чтобы вернуться в поток пользовательского интерфейса?

Если вы уже находитесь в потоке пользовательского интерфейса, просто создайте и обновите его. TaskbarItemInfo непосредственно. Если вы находитесь в потоке, не относящемся к пользовательскому интерфейсу, просто позвоните Application.Current.Dispatcher.BeginInvoke непосредственно. Ни случае требует new Thread(...).Start() обертка.

2 Ответов

Рейтинг:
2

Richard Deeming

Разве это не то же самое, что теперь встроено в via TaskbarItemInfo[^]?

Graeme_Grant

Я давно на него не смотрел ... проверю и обновлю свой код ... спасибо

Рейтинг:
1

Wastedtalent

Может ли что-то подобное этому помочь?

WPF NotifyIcon[^]