【问题标题】:Maximize WPF application from the taskbar using another application instance and Caliburn.Micro使用另一个应用程序实例和 Caliburn.Micro 从任务栏中最大化 WPF 应用程序
【发布时间】:2015-03-28 23:46:17
【问题描述】:

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

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

理想情况下,我希望从打开实例到现有实例执行 SendMessage,并告诉它最大化自身,但我无法弄清楚如何使用 Caliburn.Micro 处理 SendMessage 事件。不幸的是,这是我能想到的唯一解决方案,我不知道该怎么做。

【问题讨论】:

标签: c# wpf mvvm caliburn.micro


【解决方案1】:

看看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);
}

【讨论】:

  • 问题是,我无法覆盖 WndProc,因为我将 MVVM 与 Caliburn.Micro 一起使用。没有地方(我找不到)可以覆盖该方法。
  • 那是因为 WndProc 来自 Windows 窗体而不是 WPF。我会看看上面建议的答案。
猜你喜欢
  • 2013-12-03
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多