2017-02-04 11 views
2

Я использую PostMessage, чтобы отправить сообщение с заявкой, если другой экземпляр пытается открыть: (CUSTOMTEXT заменен моим APPNAME)PostMessage не получил, когда приложение скрыто от панели задач

NativeMethods.PostMessage((IntPtr)NativeMethods.HWND_BROADCAST, NativeMethods.WM_CUSTOMTEXT_SHOWME, IntPtr.Zero, IntPtr.Zero); 

И в WndProc я получаю сообщение:

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == NativeMethods.WM_CUSTOMTEXT_SHOWME) 
    { 
     MessageBox.Show("Message received"); 
    } 

    base.WndProc(ref m); 
} 

И NativeMethods класс:

class NativeMethods 
{ 
    public const int HWND_BROADCAST = 0xffff; 
    public static readonly int WM_CUSTOMTEXT_SHOWME = RegisterWindowMessage("WM_CUSTOMTEXT_SHOWME"); 

    [DllImport("user32")] 
    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam); 

    [DllImport("user32")] 
    public static extern int RegisterWindowMessage(string message); 
} 

Все работает нормально, но когда я скрываю свое приложение с панели задач (this.ShowInTaskbar = false;), мое приложение перестает получать это сообщение.

Почему? Есть ли обходной путь для этого?

+1

Yuck, это изящество кувалды. Изменение свойства ShowInTaskbar одинаково слабее, слишком много побочных эффектов, способ, которым Winforms реализует его, сравнивается с ремоделированием вашей кухни, сначала срывая дом. Какой способ двигаться вперед не является очевидным из вопроса, подумайте, не * * скрывая кнопку панели задач. Он также невидим, когда вы скрываете окно. Используйте Hide(). –

+0

Приложение представляет собой настраиваемую программу запуска, которая появляется без полей при нажатии на лоток/с помощью глобальной горячей клавиши/пытается запустить новый экземпляр из ярлыка панели задач. Поэтому ShowInTaskbar должен быть ложным. Я не знаю лучшего решения для этого. – darx

ответ

0

Найдено альтернативное решение: Я заменил PostMessage (asyncronous) на SendMessage (синхронный). По какой-то причине SendMessage проходит через PostMessage.

В этом приложении не имеет значения, какой из них я использую, потому что когда сообщение отправляется, приложение просто выходит. Если для обработки этого сообщения требуется мало времени для Windows, никакого вреда не будет. Точка - это только то, что старший экземпляр приложения получает это сообщение.