簡體   English   中英

使用另一個應用程序實例和Caliburn.Micro從任務欄最大化WPF應用程序

[英]Maximize WPF application from the taskbar using another application instance and Caliburn.Micro

我正在Calicali.Micro中編寫一個WPF應用程序,該應用程序在關閉時需要最小化到任務欄。 使用Hardcodet TaskbarIcon控件很容易做到這一點。 此應用程序還應該是我正在使用全局互斥鎖的單實例應用程序。

我遇到的問題是:如果應用程序的另一個實例正在嘗試啟動,我想從任務欄中最大化當前實例。 因此,請檢查互斥鎖(如果無法獲取鎖),找到另一個實例,然后從任務欄將其最大化,然后將其自身關閉。 我無法執行user32.dll ShowWindow,因為在任務欄中沒有窗口句柄可供抓取。

理想情況下,我想從打開的實例到現有實例執行一個SendMessage並告訴它最大化自身,但是我無法弄清楚如何使用Caliburn.Micro處理SendMessage事件。 不幸的是,這是我能想到的唯一解決方案,我不知道該怎么做。

看看PostMessage

是一個很好的例子,有人使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM