pinvoke を使用する必要があると想定していますが、どの関数呼び出しが必要かわかりません。
シナリオ: レガシー アプリケーションが実行されます。そのアプリケーションのハンドルを取得します。
する必要がある:
- そのアプリケーションを一番上 (他のすべてのウィンドウの前) に移動します。
- アクティブウィンドウにする
どの Windows 関数呼び出しが必要ですか?
pinvoke を使用する必要があると想定していますが、どの関数呼び出しが必要かわかりません。
シナリオ: レガシー アプリケーションが実行されます。そのアプリケーションのハンドルを取得します。
する必要がある:
どの Windows 関数呼び出しが必要ですか?
ウィンドウへのハンドルがない場合は、前にこれを使用します。
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
ここで、アプリケーション ウィンドウへのハンドルがあると仮定します。
[DllImport("user32.dll", SetLastError = true)]
static extern bool SetForegroundWindow(IntPtr hWnd);
これにより、別のウィンドウにキーボード フォーカスがある場合にタスクバーが点滅します。
ウィンドウを強制的に前面に出したい場合は、ForceForegroundWindow (サンプル実装) を使用します。
これは非常に信頼できることが証明されています。ShowWindowAsync 関数は、別のスレッドによって作成されたウィンドウ用に特別に設計されています。SW_SHOWDEFAULT は、ウィンドウが表示される前に復元され、アクティブ化されることを確認します。
[DllImport("user32.dll", SetLastError = true)]
internal static extern bool ShowWindowAsync(IntPtr windowHandle, int nCmdShow);
[DllImport("user32.dll", SetLastError = true)]
internal static extern bool SetForegroundWindow(IntPtr windowHandle);
次に、呼び出しを行います。
ShowWindowAsync(windowHandle, SW_SHOWDEFAULT);
ShowWindowAsync(windowHandle, SW_SHOW);
SetForegroundWindow(windowHandle);
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow);
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr WindowHandle);
public const int SW_RESTORE = 9;
ShowWindowAsync メソッドを使用して最小化されたアプリケーションを表示し、SetForegroundWindow メソッドを使用して背面のアプリケーションを前面に表示します。
私のアプリケーションで使用したように、これらのメソッドを使用して、Skype をアプリケーションの前に持ってくることができます。ボタンクリックで
private void FocusSkype()
{
Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName("skype");
if (objProcesses.Length > 0)
{
IntPtr hWnd = IntPtr.Zero;
hWnd = objProcesses[0].MainWindowHandle;
ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE);
SetForegroundWindow(objProcesses[0].MainWindowHandle);
}
}