/// <summary>
        /// ウィンドウを最前面に表示する
        /// </summary>
        public static void SetForceForegroundWindow(IntPtr targetHandle)
        {
            // ターゲットとなるハンドルのスレッドIDを取得する
            var targetThreadId = User32NativeMethods.GetWindowThreadProcessId(targetHandle, out var _);

            // 現在アクティブとなっているウィンドウのスレッドIDを取得する
            var currentActiveThreadId = User32NativeMethods.GetWindowThreadProcessId(User32NativeMethods.GetForegroundWindow(), out var _);

            // アクティブ処理
            User32NativeMethods.SetForegroundWindow(targetHandle);
            if (targetThreadId == currentActiveThreadId)
            {
                // 現在アクティブなウィンドウがキャプチャ対象のウィンドウの場合は前面に持ってくる
                User32NativeMethods.BringWindowToTop(targetHandle);
            }
            else
            {
                // 別のプロセスがアクティブな場合は、そのプロセスにアタッチし、入力を奪う
                User32NativeMethods.AttachThreadInput(targetThreadId, currentActiveThreadId, true);
                try
                {
                    // 前面に持ってくる
                    User32NativeMethods.BringWindowToTop(targetHandle);
                }
                finally
                {
                    // アタッチを解除する
                    User32NativeMethods.AttachThreadInput(targetThreadId, currentActiveThreadId, false);
                }
            }
        }
Beispiel #2
0
        public void ActivateWindow(IntPtr handle)
        {
            User32NativeMethods.SetForegroundWindow(handle);

            int style = User32NativeMethods.GetWindowLong(handle, InteropConstants.GWL_STYLE);

            if ((style & InteropConstants.WS_MINIMIZE) == InteropConstants.WS_MINIMIZE)
            {
                User32NativeMethods.ShowWindowAsync(handle, InteropConstants.SW_RESTORE);
            }
        }