我在通过单击 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();
}
}
}