我在Caliburn.Micro中编写一个WPF应用程序,需要在关闭时最小化到任务栏。使用Hardcodet TaskbarIcon控件很容易。这个应用程序也应该是我使用全局互斥锁的单实例应用程序。
我遇到的问题是:如果应用程序的另一个实例正在尝试启动,我想从任务栏最大化当前实例。因此,检查互斥锁,如果它无法获得锁定,找到另一个实例并从任务栏中最大化它并自行关闭。我无法执行user32.dll ShowWindow,因为在任务栏中没有窗口句柄可以抓取它。
我理想地希望从开放实例到现有实例执行SendMessage并告诉它自己最大化,但我无法弄清楚如何使用Caliburn.Micro处理SendMessage事件。不幸的是,这是我能想到的唯一解决方案,我无法弄清楚如何去做。
答案 0 :(得分:0)
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);
}