2017-01-24 17 views
1

ShowWindowAsyncはすべての場合に機能しません。メモ帳、タスクマネージャー、またはビジュアルスタジオで試してみるとうまくいきます。最小化したときに復元するだけですが、Windowsエクスプローラや別の外部処理で試してみると機能しません。いずれの場合でも、GetProcessesByNameはそれらを見つけるだけで、最小化から戻ってくることはありません。あなたが実際に可能ではない何をしたいですShowWindowAsyncはすべての場合に機能しません

PInvokeFunctionsクラス

[DllImport("user32.dll")] 
public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow); 

[DllImport("user32.dll")] 
public static extern bool SetForegroundWindow(IntPtr WindowHandle); 

方法

public static void FocusProcess(string procName) 
{ 
    Process[] objProcesses = Process.GetProcessesByName(procName); 
    if (objProcesses.Length > 0) 
    { 
     IntPtr hWnd = IntPtr.Zero; 
     hWnd = objProcesses[0].MainWindowHandle; 
     PInvokeFunctions.ShowWindowAsync(new HandleRef(null, hWnd), Constants.PInvokeConstants.SW_RESTORE); // SW_RESTORE = 9 
     PInvokeFunctions.SetForegroundWindow(hWnd); 
    } 
} 

答えて

0

。あなたはプロセスの「メインウィンドウ」を見つけようとしており、それは存在しない概念です。話題はここで詳細に説明されている:There can be more than one (or zero): Converting a process to a window

あなたは人々にこれを説明しようとすると、あなたは時々あなたは私の質問に答えないのはなぜで立ち往生?サイクル。

"スレッドIDがあります。対応するウィンドウを取得するにはどうすればよいですか?"

EnumThreadWindows関数を使用すると、スレッド上のすべてのウィンドウを取得できます。

"はい、私はEnumThreadWindowsについて知っていますが、私はどのようにしてウィンドウを取得できますか?"

あなたはまだあなたが望んでいたことを言っていません。

"スレッドに対応するウィンドウが必要です。"

しかしどちらですか?すべての窓の中でどのように決めますか?

「これは私があなたに求めていることです!

あなたはまだあなたが望むものを記述していません。

「スレッドに対応するウィンドウが必要です。なぜ私の質問に答えませんか?」

「トップレベルの未所有ウィンドウを探しています」というのは一歩前進ですが、依然としてウィンドウを一意に識別するわけではありません。あるプロセスに複数のトップレベルの未所有ウィンドウが存在する可能性があります。たとえば、Explorerには通常、トップレベルの未所有のウィンドウがたくさんあります。デスクトップ、タスクバー、開いているフォルダウィンドウ、およびプロパティシートがあります。エクスプローラのトップレベルの未所有ウィンドウを求める場合、どちらをお探しですか?

そしてレイモンド広告クーデターデグレース:

System.Diagnostics.Processオブジェクトと呼ばれる性質を持っているので、おそらく人々は、一意のプロセスのために「」ウィンドウを指定する方法があるという考えを取得していますMainWindowHandle。そのプロパティのドキュメントは、その概念を払拭するために何もしません。私はそのプロパティが複数のトップレベルの未所有のウィンドウの中でどのように決定するか分かりません。

あなたが見るように、質問を取り消す必要があります。 Chromeのようなプロセスのための 'メイン'ウィンドウがないので、あなたが望むのは根本的に間違っています(現代のブラウザーはすべてブラウジングタブを独自のプロセスで分離します)。あなたが上記の議論に従ったなら、あなたは何をすべきかを知るでしょう。

関連する問題