別のプロセスでのモーダルメッセージボックスハンドルがロックアップもターゲットプロセス
-
12-09-2019 - |
質問
私は別のプロセス上のウィンドウのモーダルとしてメッセージボックスを表示する場合は、
、それは限り、私のプログラムが応答したままとしてだけで正常に動作します。それが閉じたり終了した場合、メッセージボックスが表示されている間、メッセージボックスを受け取ったウィンドウがロックされた(が、まだ応答)、それはタスクマネージャを経て確定する必要がありますされます。
ここでそれを実証するサンプルコードはあります:
using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace TestMessageBox
{
class Program
{
private WindowWrapper notepad;
Program(IntPtr handle)
{
notepad = new WindowWrapper(handle);
}
static void Main(string[] args)
{
Process[] procs = Process.GetProcessesByName("notepad");
if (procs.Length > 0)
{
Console.WriteLine("Notepad detected...");
Program program = new Program(procs[0].MainWindowHandle);
Thread thread = new Thread(new ThreadStart(program.ShowMessage));
thread.IsBackground = true;
thread.Start();
Console.Write("Press any key to end the program and lock notepad...");
Console.ReadKey();
}
}
void ShowMessage()
{
MessageBox.Show(notepad, "If this is open when the program ends\nit will lock up notepad...");
}
}
/// <summary>
/// Wrapper class so that we can return an IWin32Window given a hwnd
/// </summary>
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
public WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}
public IntPtr Handle
{
get { return _hwnd; }
}
private IntPtr _hwnd;
}
}
それを回避するための方法は?
解決
モーダルダイアログを示す行為は、ダイアログ(あなたの例では、メモ帳のウィンドウ)の親ウィンドウを無効にします。モーダルダイアログが閉じられると、親ウィンドウが再び有効になります。
あなたのプログラムは、それが前にウィンドウを再有効に死亡した場合、そのウィンドウが再度有効に得ることは決してないだろう - それは、親を再度有効にするには、ダイアログを示すのスレッド次第です。 (ユーザーが[OK]をクリックまたは任意の後にあなたの例では、それは、MessageBox.Show()
以内に発生します。)
この作品を作るための唯一の方法は、その責任、それはモーダルダイアログを作成するプロセスが途中で死亡した場合、彼らがあるべきなバックのものを入れていた第二の方法を持っているだろうが、それは恐ろしいです。 watcherプロセスがあまりにも死んだ場合、
何? - そして、それはまだ防弾ではありません所属していません StackOverflow