当应用程序从任务栏隐藏时,未收到PostMessage

3

如果另一个实例尝试打开,我使用PostMessage向我的应用程序发送消息:

(CUSTOMTEXT替换为我的应用程序名称)
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
呃,这就像是一把大锤子的优雅。改变ShowInTaskbar属性同样粗暴,带来了太多的副作用,Winforms实现它的方式就像是先拆掉房子再重新装修厨房。从问题中并不明显该如何前进,考虑不要隐藏任务栏按钮。当你隐藏窗口时,它同样是看不见的。使用Hide()方法即可。 - Hans Passant
应用程序是可配置的程序启动器,当单击托盘图标/使用全局热键/尝试从任务栏快捷方式启动新实例时,它会弹出无边框窗口。因此,ShowInTaskbar必须为false。我不知道更好的解决方案来实现这一点。 - darx
1个回答

2
发现替代方案:我用同步的SendMessage替换了异步的PostMessage。不知何故,SendMessage可以通过,而PostMessage不能。
在这个应用程序中,使用哪一个都无所谓,因为当消息被发送时,应用程序只是退出。如果Windows需要一点时间来处理这条消息,也没有任何伤害。重点是旧版本的应用程序接收到了这条消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接