/// <summary> /// 画面上の全てのトップレベルウィンドウを列挙する /// </summary> /// <remarks> /// このメソッドを呼び出すと、下記の動作を繰り返し実行しトップレベルウィンドウの列挙を行う /// 1. トップレベルウィンドウを取得 /// 2. トップレベルウィンドウのハンドルを引数のコールバック関数(<paramref name="callBack"/>)に渡す /// 3. コールバック関数(<paramref name="callBack"/>)を実行する /// /// 上記処理を全てのトップレベルウィンドウを列挙し終えるか、 /// コールバック関数(<paramref name="callBack"/>)から 0(False)が返却されるまで繰り返す /// </remarks> /// <param name="callBack"> /// <see cref="Func{T1, T2, TResult}"/> で定義されるコールバック関数を指定 /// 引数及び、戻り値の詳細は下記のとおり /// ・引数1 (型:IntPtr):コールバック元から引き渡されるトップレベルウィンドウのハンドル /// ・引数2 (型:IntPtr):コールバック元から引き渡される値 /// ・戻り値(型:bool):コールバック元の列挙処理を継続する場合は True、中断する場合は False を返却 /// </param> /// <param name="callBackValue"> /// コールバック関数に渡す値を指定 /// </param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:EnumWindows」の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:EnumWindows」の処理に失敗した場合に発生 /// </exception> public static void EnumWindows(Func <IntPtr, IntPtr, bool> callBack, IntPtr callBackValue) { // 引数のコールバック関数をデリゲートに変換するためのローカル関数 bool CallBackDelegate(IntPtr windowHandle, IntPtr value) { return(callBack(windowHandle, value)); } // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、ウィンドウ列挙処理を呼び出し列挙を行う Win32ApiResult Function() { bool win32Result = Win32Api.EnumWindows(CallBackDelegate, callBackValue); int win32ErrorCode = Marshal.GetLastWin32Error(); return(new Win32ApiResult(win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.EnumWindows); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } }
/// <summary> /// 引数(<paramref name="windowHandle"/>)のウインドウハンドルを持つウィンドウを /// 最小化状態から元に戻す(元に戻したウィンドウはアクティブになる) /// </summary> /// <param name="windowHandle">最小化状態を戻す対象のウィンドウのハンドル</param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの下記の処理の呼び出しに失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:IsIconic」 /// ・「DLL:user32.dll、メソッド:OpenIcon」 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの下記の処理に失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:IsIconic」 /// ・「DLL:user32.dll、メソッド:OpenIcon」 /// </exception> public static void OpenIconicWindow(HandleRef windowHandle) { // 既に最小化状態でないの場合は処理をせずに終了する if (!IsIconic(windowHandle)) { return; } // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、ウィンドウの最小化状態を元に戻す Win32ApiResult Function() { bool win32Result = Win32Api.OpenIcon(windowHandle); int win32ErrorCode = Marshal.GetLastWin32Error(); return(new Win32ApiResult(win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.OpenIcon); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } }
/// <summary> /// 引数(<paramref name="windowHandle"/>)のウインドウハンドルを持つウィンドウにおいて /// そのウィンドウを作成した、スレッドのID 及び プロセスID等の情報を取得する /// </summary> /// <param name="windowHandle">取得対象のウィンドウのハンドル</param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:GetWindowThreadProcessId」の呼び出しに /// 失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:GetWindowThreadProcessId」の処理に /// 失敗した場合に発生 /// </exception> /// <returns>ウィンドウを作成したスレッドIDとプロセスID等のウィンドウの情報</returns> public static WindowInfo GetWindowThreadProcessId(HandleRef windowHandle) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、スレッドID、プロセスIDの取得処理を呼び出す Win32ApiResult Function() { int threadId = Win32Api.GetWindowThreadProcessId(windowHandle, out int processId); int win32ErrorCode = Marshal.GetLastWin32Error(); bool win32Result = Win32Api.GetWindowThreadProcessIdParameter.IsSuccess(threadId); WindowInfo windowInfo = new WindowInfo(windowHandle, threadId, processId); return(new Win32ApiResult(windowInfo, win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.GetWindowThreadProcessId); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } // 取得したスレッドIDとプロセスID等のウィンドウの情報を返却 return((WindowInfo)result.ReturnValue); }
/// <summary> /// ディスクトップウィンドウのハンドルを取得する /// </summary> /// <param name="isThrowExceptionGetFail"> /// ディスクトップウィンドウのハンドルが取得できなかった場合に /// 例外を発生させるかどうかを指定するフラグ /// (例外を発生させる場合:True、例外を発生させない場合:False /// Falseを指定しハンドルが取得できなかった場合は <see cref="IntPtr.Zero"/> を返却する) /// </param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの下記の処理の呼び出しに失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:GetDesktopWindow」 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの下記の処理に失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:GetDesktopWindow」 /// </exception> /// <returns> /// ディスクトップウィンドウのハンドル /// </returns> public static IntPtr GetDesktopWindow(bool isThrowExceptionGetFail) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、ディスクトップウィンドウのハンドルを取得する Win32ApiResult Function() { // ディスクトップウィンドウのハンドルを取得 IntPtr windowHandle = Win32Api.GetDesktopWindow(); // チェックOKの場合は取得したウィンドウハンドルを、NGの場合はIntPtr.Zeroを返却 return(new Win32ApiResult(windowHandle)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.GetDesktopWindow); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); IntPtr handle = (IntPtr)result.ReturnValue; // 例外発生フラグが立っている場合、取得成功か判定 if (isThrowExceptionGetFail && handle == IntPtr.Zero) { // 取得失敗の場合、例外をスローする throw Win32ApiCommon.GetWin32OperateException(dllName, methodName); } // 取得したウインドウハンドルを返却 return(handle); }
/// <summary> /// 引数(<paramref name="windowHandle"/>)のウインドウハンドルを持つウィンドウの /// サイズ、位置を変更する /// </summary> /// <param name="windowHandle">変更対象のウィンドウのハンドル</param> /// <param name="sizePoint">設定するウィンドウのサイズと位置</param> /// <exception cref="ArgumentNullException"> /// 引数の <paramref name="sizePoint"/> がNULLの場合に発生 /// </exception> /// <exception cref="PlatformInvokeException"> /// Win32Apiの下記の処理の呼び出しに失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:IsWindow」 /// ・「DLL:user32.dll、メソッド:SetWindowSizeLocation」 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの下記の処理に失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:IsWindow」 /// ・「DLL:user32.dll、メソッド:SetWindowSizeLocation」 /// </exception> public static void SetWindowSizeLocation(HandleRef windowHandle, SizePoint sizePoint) { // 対象のウィンドウが存在しない場合は処理を終了する if (!IsWindow(windowHandle)) { return; } // NULLチェック if (sizePoint == null) { throw new ArgumentNullException(nameof(sizePoint)); } // ウィンドウを閉じるコマンドメッセージをの定義 // Zオーダーの配置順序の変更なしを指定 IntPtr order = IntPtr.Zero; uint option = (uint)Win32Api.SetWindowPosParameter.OptionFlag.SWP_NOZORDER; // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、ウィンドウのサイズ、位置を変更する Win32ApiResult Function() { // 実行 bool win32Result = Win32Api.SetWindowPos( windowHandle: windowHandle, windowHandleOrder: order, pointX: sizePoint.PositionX, pointY: sizePoint.PositionY, sizeWidth: sizePoint.SizeWidth, sizeHeight: sizePoint.SizeHeight, optionFlag: option); int win32ErrorCode = Marshal.GetLastWin32Error(); return(new Win32ApiResult(win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.SetWindowPos); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } }
/// <summary> /// 引数(<paramref name="windowHandle"/>)のウインドウハンドルを持つウィンドウが、 /// 最小化(アイコン化)されているかチェックする /// </summary> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:IsIconic」の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:IsIconic」の処理に失敗した場合に発生 /// </exception> /// <param name="windowHandle">チェック対象のウィンドウのハンドル</param> /// <returns>ウィンドウが最小化されている場合:True、最小化されていない場合:False</returns> public static bool IsIconic(HandleRef windowHandle) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、ウィンドウの最小化チェック処理を呼び出す Win32ApiResult Function() { bool win32ReturnValue = Win32Api.IsIconic(windowHandle); return(new Win32ApiResult(win32ReturnValue)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.IsIconic); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 取得したウインドウハンドルを返却 return((bool)result.ReturnValue); }
/// <summary> /// 引数(<paramref name="windowHandle"/>)のウインドウハンドルを持つウィンドウにおいて、 /// そのウィンドウのクライアント領域の上下左右の座標情報を取得する /// (クライアント領域の座標は相対座標のため X:0, Y:0 となる) /// </summary> /// <param name="windowHandle">取得対象のウィンドウのハンドル</param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの下記の処理の呼び出しに失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:IsWindow」 /// ・「DLL:user32.dll、メソッド:IsWindowVisible」 /// ・「DLL:user32.dll、メソッド:IsIconic」 /// ・「DLL:user32.dll、メソッド:GetClientRect」 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの下記の処理に失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:IsWindow」 /// ・「DLL:user32.dll、メソッド:IsWindowVisible」 /// ・「DLL:user32.dll、メソッド:IsIconic」 /// ・「DLL:user32.dll、メソッド:GetClientRect」 /// </exception> /// <returns> /// ウィンドウのクライアント領域のサイズ位置情報 /// ウィンドウが存在しない、非表示、最小化状態の場合はNULLを返却 /// </returns> public static SizePoint GetClientRect(HandleRef windowHandle) { // ウィンドウが存在しない、非表示、最小化状態の場合は処理をせずに終了する if (!IsWindow(windowHandle) || !IsWindowVisible(windowHandle) || IsIconic(windowHandle)) { return(null); } // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、上下左右の座標情報の取得処理を呼び出す Win32ApiResult Function() { bool win32Result = Win32Api.GetClientRect(windowHandle, out Win32Api.RECT rect); int win32ErrorCode = Marshal.GetLastWin32Error(); int width = rect.Right - rect.Left; int height = rect.Bottom - rect.Top; int positionX = rect.Left; int positionY = rect.Top; SizePoint sizePoint = new SizePoint(width, height, positionX, positionY); return(new Win32ApiResult(sizePoint, win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.GetClientRect); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } // 取得したウィンドウのサイズ位置情報を返却 return((SizePoint)result.ReturnValue); }
/// <summary> /// 現在ユーザーが作業している最前面ウィンドウのハンドルを取得する /// 取得できなかった場合は <see cref="IntPtr.Zero"/> を返却する /// </summary> /// <param name="isThrowExceptionGetFail"> /// 取得したウィンドウハンドルに該当するウィンドウが下記の場合、 /// 例外を発生させるかどうかを指定するフラグ /// ・アクティブウィンドウが存在しない /// ・取得したウィンドウハンドルのウィンドウがウィンドウではない /// ・表示されない(非表示)ウィンドウ /// ・無効(入力を受け付けない)なウィンドウ /// ・ディスクトップを示すウィンドウ /// このフラグを True にした場合、上記状態の場合に例外をスローする /// このフラグを False にした場合、上記状態の場合に <see cref="IntPtr.Zero"/> を返却する /// </param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの下記の処理の呼び出しに失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:GetForegroundWindow」 /// ・「DLL:user32.dll、メソッド:IsWindow」 /// ・「DLL:user32.dll、メソッド:IsWindowVisible」 /// ・「DLL:user32.dll、メソッド:IsWindowEnabled」 /// ・「DLL:user32.dll、メソッド:GetDesktopWindow」 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの下記の処理に失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:GetForegroundWindow」 /// ・「DLL:user32.dll、メソッド:IsWindow」 /// ・「DLL:user32.dll、メソッド:IsWindowVisible」 /// ・「DLL:user32.dll、メソッド:IsWindowEnabled」 /// ・「DLL:user32.dll、メソッド:GetDesktopWindow」 /// (例外発生フラグが True の場合で、 /// 取得したウィンドウハンドルの値が相応しくない場合もこの例外を発生させる) /// </exception> /// <returns> /// 現在ユーザーが作業している最前面ウィンドウのハンドル /// 取得できなかった場合は<see cref="IntPtr.Zero"/> を返却する /// </returns> public static IntPtr GetForegroundWindowHandle(bool isThrowExceptionGetFail) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、最前面のウィンドウのハンドルを取得する Win32ApiResult Function() { // 最前面のウィンドウのハンドルを取得 IntPtr windowHandle = Win32Api.GetForegroundWindow(); // 取得したウィンドウのチェック HandleRef tmpHandle = new HandleRef(0, windowHandle); bool win32Result = windowHandle != IntPtr.Zero && Win32Api.IsWindow(tmpHandle) && Win32Api.IsWindowVisible(tmpHandle) && Win32Api.IsWindowEnabled(tmpHandle) && windowHandle != Win32Api.GetDesktopWindow(); // チェックOKの場合は取得したウィンドウハンドルを、NGの場合はIntPtr.Zeroを返却 return(new Win32ApiResult(win32Result ? windowHandle : IntPtr.Zero)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.GetForegroundWindow); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); IntPtr handle = (IntPtr)result.ReturnValue; // 例外発生フラグが立っている場合、取得成功か判定 if (isThrowExceptionGetFail && handle == IntPtr.Zero) { // 取得失敗の場合、例外をスローする throw Win32ApiCommon.GetWin32OperateException(dllName, methodName); } // 取得したウインドウハンドルを返却 return(handle); }