使用另一个应用程序实例和Caliburn.Micro从任务栏最大化WPF应用程序

时间:2015-01-29 16:43:01

标签: c# wpf mvvm caliburn.micro

我在Caliburn.Micro中编写一个WPF应用程序,需要在关闭时最小化到任务栏。使用Hardcodet TaskbarIcon控件很容易。这个应用程序也应该是我使用全局互斥锁的单实例应用程序。

我遇到的问题是:如果应用程序的另一个实例正在尝试启动,我想从任务栏最大化当前实例。因此,检查互斥锁,如果它无法获得锁定,找到另一个实例并从任务栏中最大化它并自行关闭。我无法执行user32.dll ShowWindow,因为在任务栏中没有窗口句柄可以抓取它。

我理想地希望从开放实例到现有实例执行SendMessage并告诉它自己最大化,但我无法弄清楚如何使用Caliburn.Micro处理SendMessage事件。不幸的是,这是我能想到的唯一解决方案,我无法弄清楚如何去做。

1 个答案:

答案 0 :(得分:0)

查看PostMessage

Here是一个很好的例子,有人使用PostMessage来完成您正在谈论的内容。

基本上,您使用PostMessage来广播自定义消息:

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

然后重写WndProc以接收消息:

protected override void WndProc(ref Message m) 
{
    if(m.Msg == NativeMethods.WM_SHOWME) 
    {
        // code here to maximize 
    }
    base.WndProc(ref m);
}

请注意,您需要在所需的win32内注册自定义消息和extern:

internal class NativeMethods 
{
    public const int HWND_BROADCAST = 0xffff;
    public static readonly int WM_SHOWME = RegisterWindowMessage("WM_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);
}