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