2

Windows タスクバーをクリックして wpf アプリを最小化/復元するのに問題があります。うまくいくこともあれば、うまくいかないこともあります。そこで、アプリのメイン ウィンドウにフックを追加して、イベントが発生するかどうかを確認しました。そうすることもあれば、そうでないこともあります。次に、Spy++を使用して、少なくともイベントが開始されたかどうかを確認します... はい! 彼らです。では、なぜ私はそれらの一部しか受け取っていないのでしょうか?

public MyMainWindow()
{
    InitializeComponent();
    this.SourceInitialized += new EventHandler(OnSourceInitialized);
}

void OnSourceInitialized(object sender, EventArgs e)
{
    HwndSource source = (HwndSource)PresentationSource.FromVisual(this);
    source.AddHook(new HwndSourceHook(HandleMessages));
}

private IntPtr HandleMessages(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    switch (msg) {
        case  0x0112://WM_SYSCOMMAND:
            switch ((int)wParam & 0xFFF0) {
                case  0xF020://SC_MINIMIZE:
                    break;
                case  0xF120://SC_RESTORE:
                    break;
            }
            break;
    }
}

カスタムのメインがあり、カスタマイズされた Bootstrapper で Caliburn Micro を使用しています。


この問題が見られる単純なケースを作成したと思います(これが私の問題の同じ原因であるかどうかはわかりません)。タイマーを使用して、非同期ソケット/activeX 応答を待っていることをエミュレートしました。ご覧のとおり、タスクバーをクリックすると、ウィンドウが最大化/最小化されないことがあります。

それを解決する方法はまだわかりません。

using System;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
using Timer = System.Timers.Timer;


namespace Garbage
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var dispatcherTimer = new DispatcherTimer { Interval = new TimeSpan(0,0,0,0,10) };
        dispatcherTimer.Tick += (o, e) =>
                                    {
                                        var waintingForSocketAsyncRenponseEmulation = new Timer(10);

                                        waintingForSocketAsyncRenponseEmulation.Elapsed += delegate
                                                            {
                                                                lock (this)
                                                                {
                                                                    Monitor.Pulse(this);
                                                                }
                                                            };

                                        waintingForSocketAsyncRenponseEmulation.Start();

                                        lock (this)
                                        {
                                            Monitor.Wait(this);
                                        }
                                    };
        dispatcherTimer.Start();
    }
}

}

4

0 に答える 0