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

我有一个自定义 main,我正在使用Caliburn Micro 和自定义 Bootstrapper


我想我做了一个简化的案例,可以看到这个问题(不确定这是否是我的问题的同一来源)。我使用 Timer 来模拟一直在等待异步套接字/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