2013-09-24 2 views
3

У меня есть приложение TCP Chat. Когда приходит новое сообщение, я хочу, чтобы панель задач светилась, пока пользователь снова не откроет форму (в случае, если она не была включена/активирована).Световая сигнализация панели задач

Пример того, что я имею в виду: http://puu.sh/4z01n.png

Как я могу сделать это свечение, как это?

Спасибо!

Если вы все еще не понимаете, что я имею в виду .. Изображение, которое я представил, является тем, что появляется на панели задач на панели задач, когда что-то «светится». Это значит, что есть нотация. Это то, что я хочу добиться.

+5

Вы имеете в виду [это] (http://stackoverflow.com/questions/9970207/how-to-let-a-minimized-form-to-notify-user-to-open-it-from-taskbar) ? –

ответ

5

Я надеюсь, что это поможет вам

[DllImport("User32.dll")] 
[return:MarshalAs(UnmanagedType.Bool)] 
static extern bool FlashWindowEx(ref FLASHINFO pwfi); 


    [StructLayout(LayoutKind.Sequential)] 
    public struct FLASHWINFO { 
     public UInt32 cbSize; 
     public IntPtr hwnd; 
     public UInt32 dwFlags; 
     public UInt32 uCount; 
     public UInt32 dwTimeout; 
    } 


[Flags] 
     public enum FlashMode { 
      /// 
      /// Stop flashing. The system restores the window to its original state. 
      /// 
      FLASHW_STOP = 0, 
      /// 
      /// Flash the window caption. 
      /// 
      FLASHW_CAPTION = 1, 
      /// 
      /// Flash the taskbar button. 
      /// 
      FLASHW_TRAY = 2, 
      /// 
      /// Flash both the window caption and taskbar button. 
      /// This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags. 
      /// 
      FLASHW_ALL = 3, 
      /// 
      /// Flash continuously, until the FLASHW_STOP flag is set. 
      /// 
      FLASHW_TIMER = 4, 
      /// 
      /// Flash continuously until the window comes to the foreground. 
      /// 
      FLASHW_TIMERNOFG = 12 
     } 

     public static bool FlashWindow(IntPtr hWnd, FlashMode fm) { 
      FLASHWINFO fInfo = new FLASHWINFO(); 

      fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo)); 
      fInfo.hwnd = hWnd; 
      fInfo.dwFlags = (UInt32)fm; 
      fInfo.uCount = UInt32.MaxValue; 
      fInfo.dwTimeout = 0; 

      return FlashWindowEx(ref fInfo); 
     } 

Взятые из моей вики на Flashing Taskbar

2

Вам нужна совместимость для достижения этой цели, в первую очередь добавить System.Runtime.InteropServices пространство имен для вашего класса, в вас классе определить эта функция в начале,

[DllImport("user32.dll")] 
    static extern bool FlashWindow(IntPtr hwnd, bool FlashStatus); 

это функция API, и это описание говорит, Функция FlashWindow один раз мигает указанным окном.. Затем добавьте Timer в свой класс (перетащите его из панели инструментов, установите его интервал до 500 миллисекунд). Затем, предполагая, что Form1 - это окно, которое вы хотите использовать, используйте следующий код для этого;

private void Form1_Activated(object sender, EventArgs e) 
    { 
     timer1.Stop();//Stop the timer to stop flashing. 
    } 

    private void Form1_Deactivate(object sender, EventArgs e) 
    { 
     timer1.Start();//Start timer if window loses focus. 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     FlashWindow(this.Handle, true);//Flash the window untill it gets focused. 
    } 

Ну, вызовите timer1.Start();, когда новое сообщение arrives.A sample только в том случае, если вам нужно.

Надеюсь, это вам поможет.

+0

По какой-то причине он все еще мигает, хотя я фокусирую окно. Должен ли я устанавливать Focused proeprty или что-то еще? .. – user2810715

+0

@ user2810715 Я обновил код, посмотрим, работает ли он сейчас. – PurpleXenon

Смежные вопросы