/// <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); }
private static IntPtr SelectBitmap(SafeDCHandle targetDCHandle, IntPtr bitmapHandle) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、オブジェクト選択処理を呼び出す Win32ApiResult Function() { IntPtr win32ReturnValue = Win32Api.SelectObject(targetDCHandle, bitmapHandle); bool win32Result = Win32Api.SelectObjectParameter.IsSuccess(win32ReturnValue, false); return(new Win32ApiResult(win32ReturnValue, win32Result)); } // 実行 string dllName = "gdi32.dll"; string methodName = nameof(Win32Api.SelectObject); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } // 以前に選択されていたビットマップオブジェクトへのハンドルを返却 return((IntPtr)result.ReturnValue); }
/// <summary> /// 指定されたデバイスと互換性のあるメモリデバイスコンテキスト(DC)を作成する /// </summary> /// <param name="targetDCHandle"> /// 既存のデバイスコンテキスト(DC)へのハンドル /// 指定したデバイスコンテキスト(DC)関連するメモリデバイスコンテキスト(DC)を作成する /// NULL(<see cref="IntPtr.Zero"/>)を指定した場合、 /// アプリケーションの現在の画面と互換性のあるメモリデバイスコンテキストを作成する /// </param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理「DLL:gdi32.dll、メソッド:CreateCompatibleDC」の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理「DLL:gdi32.dll、メソッド:CreateCompatibleDC」の処理に失敗した場合に発生 /// </exception> /// <returns>作成したメモリデバイスコンテキスト(DC)へのハンドル</returns> private static SafeDCHandle CreateCompatibleDC(IntPtr targetDCHandle) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、メモリデバイスコンテキストの作成処理を呼び出す Win32ApiResult Function() { SafeDCHandle win32ReturnValue = Win32Api.CreateCompatibleDC(targetDCHandle); int win32ErrorCode = Marshal.GetLastWin32Error(); bool win32Result = Win32Api.CreateCompatibleDCParameter.IsSuccess(win32ReturnValue); return(new Win32ApiResult(win32ReturnValue, win32Result, win32ErrorCode)); } // 実行 string dllName = "gdi32.dll"; string methodName = nameof(Win32Api.CreateCompatibleDC); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } // 作成したメモリデバイスコンテキスト(DC)へのハンドルを返却 return((SafeDCHandle)result.ReturnValue); }
/// <summary> /// 引数で指定された他のモジュールのアイコンへのハンドル(<paramref name="iconCursorHandle"/>)を /// 現在のモジュールのアイコンへのハンドルに複製する /// </summary> /// <remarks> /// この機能は、別のモジュールが所有しているアイコンを、現在のモジュールへの独自のハンドルで取得する /// 他のモジュールが解放されてもアプリケーションアイコンはアイコンとして使用することができる /// </remarks> /// <param name="iconCursorHandle">アイコン/カーソルへのハンドル</param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:CopyIcon」の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:CopyIcon」の処理に失敗した場合に発生 /// </exception> /// <returns>複製したアイコンへのハンドル</returns> private static SafeCopyIconHandle CopyIcon(IntPtr iconCursorHandle) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、アイコンの複製処理を呼び出す Win32ApiResult Function() { SafeCopyIconHandle win32ReturnValue = Win32Api.CopyIcon(iconCursorHandle); int win32ErrorCode = Marshal.GetLastWin32Error(); bool win32Result = !Win32Api.CopyIconParameter.IsSuccess(win32ReturnValue); return(new Win32ApiResult(win32ReturnValue, win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.CopyIcon); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } // 複製したアイコンへのハンドルを返却 return((SafeCopyIconHandle)result.ReturnValue); }
/// <summary> /// アイコンの情報を取得する /// (取得したアイコン情報のカラーBitmapハンドル(<see cref="IconInfo.ICONINFO.ColorBitmapHandle"/>) /// マスクBitmapハンドル(<see cref="IconInfo.ICONINFO.ColorBitmapHandle"/>)は /// <see cref="DeleteObject(IntPtr)"/> で破棄する必要がある) /// </summary> /// <param name="iconCursorHandle">アイコン/カーソルへのハンドル</param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:GetIconInfo」の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:GetIconInfo」の処理に失敗した場合に発生 /// </exception> /// <returns>取得したアイコン情報</returns> private static IconInfo.ICONINFO GetIconInfo(SafeCopyIconHandle iconCursorHandle) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、アイコンの情報を取得処理を呼び出す Win32ApiResult Function() { bool win32Result = Win32Api.GetIconInfo(iconCursorHandle, out IconInfo.ICONINFO info); int win32ErrorCode = Marshal.GetLastWin32Error(); return(new Win32ApiResult(info, win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.GetIconInfo); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } // 取得したアイコン情報を返却 return((IconInfo.ICONINFO)result.ReturnValue); }
/// <summary> /// グローバルのカーソルの情報を取得する /// </summary> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:GetCursorInfo」の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理「DLL:user32.dll、メソッド:GetCursorInfo」の処理に失敗した場合に発生 /// </exception> /// <returns>取得したカーソル情報</returns> private static Cursor.CURSORINFO GetCursorInfo() { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、グローバルのカーソルの情報を取得処理を呼び出す Win32ApiResult Function() { Cursor.CURSORINFO info = new Cursor.CURSORINFO { StructureSize = Marshal.SizeOf(typeof(Cursor.CURSORINFO)), }; bool win32Result = Win32Api.GetCursorInfo(ref info); int win32ErrorCode = Marshal.GetLastWin32Error(); return(new Win32ApiResult(info, win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.GetCursorInfo); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result && result.ErrorCode != (int)ErrorCode.NO_ERROR) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } // 取得したカーソル情報を返却 return((Cursor.CURSORINFO)result.ReturnValue); }
/// <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> /// 送信元のデバイスコンテキストに設定されたビットマップ情報(ピクセル情報)を /// 送信先のデバイスコンテキスにビットブロック転送する /// </summary> /// <param name="destDCHandle">送信先のデバイスコンテキストへのハンドル</param> /// <param name="destPointX">送信先の描画位置:X(左上が基準)</param> /// <param name="destPointY">送信先の描画位置:Y(左上が基準)</param> /// <param name="width">転送元 及び、転送先の幅(転送するデータの幅)</param> /// <param name="height">転送元 及び、転送先の高さ(転送するデータの高さ)</param> /// <param name="sourceDCHandle">送信元のデバイスコンテキストへのハンドル</param> /// <param name="sourcePointX">送信元の基準位置:X(左上が基準)</param> /// <param name="sourcePointY">送信元の基準位置:Y(左上が基準)</param> /// <param name="ropCode">合成方法を定めるラスタオペレーションコード</param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理「DLL:gdi32.dll、メソッド:BitBlt」の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理「DLL:gdi32.dll、メソッド:BitBlt」の処理に失敗した場合に発生 /// </exception> private static void BitBlt( SafeDCHandle destDCHandle, int destPointX, int destPointY, int width, int height, SafeDCHandle sourceDCHandle, int sourcePointX, int sourcePointY, ROPCode ropCode) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、ビットブロック転送処理を呼び出す Win32ApiResult Function() { bool win32Result = Win32Api.BitBlt( destDCHandle: destDCHandle, destPointX: destPointX, destPointY: destPointY, width: width, height: height, sourceDCHandle: sourceDCHandle, sourcePointX: sourcePointX, sourcePointY: sourcePointY, ropCode: (uint)ropCode); int win32ErrorCode = Marshal.GetLastWin32Error(); return(new Win32ApiResult(win32Result, win32ErrorCode)); } // 実行 string dllName = "gdi32.dll"; string methodName = nameof(Win32Api.BitBlt); 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"/>)のウインドウハンドルを持つウィンドウにおいて、 /// そのウィンドウのクライアント領域の上下左右の座標情報を取得する /// (クライアント領域の座標は相対座標のため 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); }
private static void DeleteObject(IntPtr objectHandle) { // Win32Apiの実行処理 // Win32ApiのWindou共通の呼び出し機能を用いて、オブジェクトの破棄処理を呼び出す Win32ApiResult Function() { bool win32Result = Win32Api.DeleteObject(objectHandle); return(new Win32ApiResult(win32Result)); } // 実行 string dllName = "gdi32.dll"; string methodName = nameof(Win32Api.DeleteObject); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 正常終了したかチェック if (!result.Result) { throw Win32ApiCommon.GetWin32OperateException(dllName, methodName); } }
/// <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); }
/// <summary> /// 引数(<paramref name="windowHandle"/>)のウインドウハンドルを持つウィンドウに、 /// 引数で指定したメッセージを送信する /// </summary> /// <param name="windowHandle"> /// 送信対象のウィンドウのハンドル /// </param> /// <param name="message"> /// 送信するべきメッセージを指定 /// </param> /// <param name="wparam"> /// メッセージ特有の1番目の追加情報を指定 /// </param> /// <param name="lparam"> /// メッセージ特有の2番目の追加情報を指定 /// </param> /// <param name="isSucessFunc"> /// 指定したメッセージの戻り値に対する成功失敗を判定する処理を指定 /// 引数1:指定したメッセージの戻り値 /// 戻り値:判定結果、成功:True、失敗:False /// </param> /// <param name="isThrowExceptionCloseFail"> /// ウィンドウを閉じる処理に失敗した場合に例外を発生させるかどうかを指定するフラグ /// 閉じるだけの処理であるため失敗しても良いと判断される場合は False を設定、 /// 閉じる処理の成功の保証がいる場合は Ture を設定 /// 失敗するパターンとしては下記のパターンが考えられる /// ・メモ帳等を閉じる際に表示される「保存しますか?」のダイアログが表示され、 /// 待機となりタイムアウトが発生した場合 /// </param> /// <param name="isExcludeTimeoutExceptions"> /// 発生させる例外のうち、タイムアウトに関する例外は除外するかどうかを指定するフラグ /// 引数 <paramref name="isExcludeTimeoutExceptions"/> が True の場合のみ有効 /// このフラグを True した場合、タイムアウトに関するもの以外の例外のみが発生する /// このフラグを False にした場合、タイムアウトに関するものも含めて例外が発生する /// 保存の確認ダイアログ等の待ちでタイムアウトが発生する場合があるため、 /// その際に例外を発生させるかどうかの制御として使用 /// </param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの下記の処理の呼び出しに失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:IsWindow」 /// ・「DLL:user32.dll、メソッド:SendMessage」 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの下記の処理に失敗した場合に発生 /// ・「DLL:user32.dll、メソッド:IsWindow」 /// ・「DLL:user32.dll、メソッド:SendMessage」 /// </exception> public static void SendMessage( HandleRef windowHandle, int message, IntPtr wparam, IntPtr lparam, Func <IntPtr, bool> isSucessFunc, bool isThrowExceptionCloseFail, bool isExcludeTimeoutExceptions) { // 対象のウィンドウが存在しない場合は処理を終了する if (!WindowOperate.IsWindow(windowHandle)) { return; } // オプション及びタイムアウト値の設定 Win32Api.SendMessageTimeoutParameter.OptionFlag flag = Win32Api.SendMessageTimeoutParameter.OptionFlag.SMTO_NORMAL | Win32Api.SendMessageTimeoutParameter.OptionFlag.SMTO_ABORTIFHUNG; uint optionFlag = (uint)flag; uint timeout = Win32Api.SendMessageTimeoutParameter.TimeoutTime; // Win32Apiの実行処理 // Win32ApiのMessage共通の呼び出し機能を用いて、ウィンドウへのメッセージ送信処理を呼び出す Win32ApiResult Function() { IntPtr tmpResult = Win32Api.SendMessageTimeout( windowHandle: windowHandle, message: message, wParam: wparam, lParam: lparam, optionFlag: optionFlag, timeoutTime: timeout, messageResult: out IntPtr messageResult); int win32ErrorCode = Marshal.GetLastWin32Error(); bool win32Result = Win32Api.SendMessageTimeoutParameter.IsSuccess(tmpResult); win32Result &= isSucessFunc(messageResult); return(new Win32ApiResult(win32Result, win32ErrorCode)); } // 実行 string dllName = "user32.dll"; string methodName = nameof(Win32Api.SendMessageTimeout); Win32ApiResult result = Win32ApiCommon.Run(Function, dllName, methodName); // 例外を発生させる場合のみ、正常終了したかチェックを行う if (isThrowExceptionCloseFail && !result.Result) { // タイムアウトに関する例外は判定 if (Win32Api.SendMessageTimeoutParameter.IsTimeoutError(result.Result, result.ErrorCode)) { // タイムアウトに関連する例外の場合 // タイムアウトに関する例外が除外されていない場合は例外をスローする if (!isExcludeTimeoutExceptions) { // 送信先のスレッドがハングアップした場合、エラーコードが 0:正常終了となる // その場合とそれ以外に分けて例外を生成する Win32OperateException ex; if (result.ErrorCode == (int)ErrorCode.NO_ERROR) { string timeoutMessage = ErrorMessage.Win32OperateErrorTimeout; ex = Win32ApiCommon.GetWin32OperateException( dllName, methodName, timeoutMessage); } else { ex = Win32ApiCommon.GetWin32OperateException( dllName, methodName, result.ErrorCode); } // タイムアウトに関する例外をスロー throw ex; } } else { // タイムアウトエラー以外の例外をスロー throw Win32ApiCommon.GetWin32OperateException(dllName, methodName, result.ErrorCode); } } }