unit my_apivalue; //{$DEFINE _DEBUG} {$DEFINE BUGSEYE} interface uses Classes, Windows, Graphics; type T_ExecuteFunc = procedure() of object; type T_Execute = class(TObject) FsName : String; FFunc : T_ExecuteFunc; FsCategory : String; constructor Create(sName: String; AFunc: T_ExecuteFunc; sCategory: String); property Name: String read FsName; property Func: T_ExecuteFunc read FFunc; property SortCategory: String read FsCategory; end; type T_MyAPIValue = class(TObject) private FsCRLF : WideString; FsTITLE_CRLF : WideString; FsSTRUCT_CRLF : WideString; FsSTRUCT_POINT : WideString; FsSTRUCT_RECT : WideString; FItems : TStrings; FOrgItems : TStrings; FbRefresh : Boolean; FsAPIName : String; FsDeclaration : WideString; //関数宣言 FsDescription : WideString; //関数の説明 FDescription : TStrings; //関数の説明 FWindowList : TStrings; FsParams : array of WideString; //各パラメータのタイトル FsHints : array of WideString; //各パラメータの説明 FsValues : array of WideString; //APIを呼び出した値、もしくは呼び出す際の値 FhWndHandle : HWND; FptPos : TPoint; FhLoadModule : HMODULE; FpFuncAddr : Pointer; procedure FLoadModule(sLibrary, sFuncAddr: String); function FGetText(sItems: array of WideString): WideString; function FGetParam(iIndex: Integer): WideString; function FGetValue(iIndex: Integer): WideString; function FGetHint (iIndex: Integer): WideString; function FGetCount: Integer; function FGetParamCount: Integer; function FGetValueCount: Integer; procedure FAddFunc(sName: String; AFunc: T_ExecuteFunc; sCategory: String = ''); //以下テストするAPIのラッパー関数 procedure FGetBkColor; procedure FGetDCPenColor; procedure FGetDeviceCaps; procedure FGetSystemMetrics; // procedure FSystemParametersInfo; procedure FExtractIcon; procedure FDwmGetWindowAttribute; procedure FEnumChildWindows; procedure FEnumThreadWindows; procedure FGetAncestor; procedure FGetClassInfoEx; procedure FGetClassLong; procedure FGetClassName; procedure FGetClientRect; procedure FGetComboboxInfo; procedure FGetLayeredWindowAttributes; procedure FGetListBoxInfo; procedure FGetNextWindow; procedure FGetParent; procedure FGetScrollBarInfo; procedure FGetScrollInfo; procedure FGetScrollPos; procedure FGetScrollRange; procedure FGetTitleBarInfo; procedure FGetTopWindow; procedure FGetWindow; procedure FGetWindowInfo; procedure FGetWindowLong; procedure FGetWindowPlacement; procedure FGetWindowRect; procedure FGetWindowText; procedure FGetWindowTextLength; procedure FGetWindowThreadProcessId; procedure FIsWindowEnabled; procedure FIsWindowUnicode; procedure FIsZoomed; {$IFNDEF BUGSEYE} procedure FIsIconic; procedure FIsWindowVisible; {$ENDIF} procedure FRealGetWindowClass; procedure FGetBinaryType; procedure FGetFileAttributes; procedure FGetWindowModuleFileName; procedure FGetFileVersionInfo; procedure FGetFileVersionInfoSize; procedure FVerQueryValue; procedure FOpenProcess; procedure FGetPriorityClass; {$IFDEF BUGSEYE} //TPointを引数にとるAPI procedure FChildWindowFromPoint; procedure FChildWindowFromPointEx; procedure FRealChildWindowFromPoint; procedure FWindowFromPoint; procedure FScreenToClient; procedure FGetCursorPos; procedure FGetPhysicalCursorPos; procedure FLogicalToPhysicalPoint; procedure FPhysicalToLogicalPoint; {$ENDIF} //メッセージ //ComboBoxとListBox共通 procedure FAdd_LBIntValue (iValue: DWORD); procedure FAdd_CBIntValue (iValue: DWORD); procedure FCBLB_GetCount (hHandle: HWND; iMessage: UINT); procedure FCBLB_GetText (hHandle: HWND; iMessage: UINT); procedure FCBLB_GetTextLen(hHandle: HWND; iMessage: UINT); //ComboBox procedure FCB_GetCount; procedure FCB_GetCurSel; procedure FCB_GetLBText; procedure FCB_GetLBTextLen; //ListBox procedure FLB_GetCount; procedure FLB_GetCurSel; procedure FLB_GetText; procedure FLB_GetTextLen; //TrackBar // procedure FTBM_GetBuddy; // procedure FTBM_GetChannelRECT; procedure FTBM_GetLineSize; procedure FTBM_GetNumTics; procedure FTBM_GetPageSize; procedure FTBM_GetPos; // procedure FTBM_GetPTics; procedure FTBM_GetRangeMax; procedure FTBM_GetRangeMin; procedure FTBM_GetThumbLength; // procedure FTBM_GetThumbRECT; procedure FTBM_GetTic; procedure FTBM_GetTicPos; procedure FTBM_GetToolTips; procedure FTBM_GetUnicodeFormat; //WM_〜 procedure FWM_GetText; procedure FWM_GetTextLength; protected procedure FAddItems(sItems: array of String); procedure FAddDescription(sLines: array of WideString); procedure FAddElement(sParam, sHint: WideString); overload; procedure FAddElement(sParam: WideString; sHint: array of WideString); overload; procedure FAddElement(sParam: WideString); overload; procedure FClearValue; procedure FSetElement(iCount: Integer); function FGetSendText: WideString; function FGetBoolValue(bValue: Boolean): WideString; function FGetColorName(clColor: TColor): WideString; function FGetIntValue(iValue: Integer): WideString; function FGetHexValue(iValue: DWORD; iPrec: Integer): WideString; overload; function FGetHexValue(iValue: Integer): WideString; overload; function FGetHexValue(iValue: DWORD): WideString; overload; function FGetPointValue(APoint: TPoint): WideString; function FGetRectValue(ARect: TRect): WideString; procedure FAddStrValue(sValue: WideString; bQuot: Boolean = False); procedure FAddBlank(iCount: Integer); overload; procedure FAddBlank; overload; function FAddWindowValue(hHandle: HWND): Boolean; overload; function FAddWindowValue: Boolean; overload; procedure FAddColorName(clColor: TColor); procedure FAddBoolValue(bValue: Boolean); procedure FAddIntValue(iValue: Integer); procedure FAddHexValue(iValue: DWORD; iPrec: Integer); overload; procedure FAddHexValue(iValue: Integer); overload; procedure FAddHexValue(iValue: DWORD); overload; procedure FAddPointValue(APoint: TPoint); procedure FAddRectValue(ARect: TRect); procedure FAddDumpValue(pData: PAnsiChar; iCount: Integer; bUnicode: Boolean = False); property CRLF : WideString read FsCRLF; property TITLE_CRLF : WideString read FsTITLE_CRLF; property STRUCT_CRLF : WideString read FsSTRUCT_CRLF; property STRUCT_POINT: WideString read FsSTRUCT_POINT; property STRUCT_RECT : WideString read FsSTRUCT_RECT; public constructor Create; destructor Destroy; override; procedure Clear; function IsNowAPI(sDeclaration: String): Boolean; function Execute(sTestAPI: String; hWindow: HWND; ptPos: TPoint): Integer; virtual; property APIName: String read FsAPIName; property Declaration: WideString read FsDeclaration write FsDeclaration; property Description: WideString read FsDescription write FsDescription; property Params[iIndex: Integer]: WideString read FGetParam; property Values[iIndex: Integer]: WideString read FGetValue; property Hints [iIndex: Integer]: WideString read FGetHint; property Count: Integer read FGetCount; property ParamCount: Integer read FGetParamCount; property ValueCount: Integer read FGetValueCount; property Items: TStrings read FItems; end; function SortCategroyFunc(AString: TStringList; iIndex1, iIndex2: Integer): Integer; implementation uses {$IFDEF _DEBUG} myDebug, {$ENDIF} ActiveX, Forms, Messages, PsAPI, CommCtrl, ShellAPI, SysUtils; //スタイル function gfnbFlagCheck(iStyle: Longint; iCheck: Longint): Boolean; forward; //myWindow.pas function gfnsClassNameGet (hHandle: HWND): WideString; forward; function gfnsWindowTextGet (hHandle: HWND): WideString; forward; function gfnrcWindowRectGet(hHandle: HWND): TRect; forward; function gfnsExeNameGet (hHandle: HWND): WideString; forward; function gfnsSystem32DirGet: WideString; forward; function gfnptScreenToClient(hHandle: HWND; ptPos: TPoint): TPoint; forward; //myString.pas? function gfnsLanguageGet(iLanguage: WORD): WideString; forward; function gfnsCodePageGet(iLanguage, iCodePage: WORD): WideString; forward; function F_GetWindowValue(hHandle: HWND): WideString; forward; type TGetPhysicalCursorPos = function(var lpPoint: TPoint): BOOL; stdcall; var F_hDWMapidllModule : HMODULE; F_DwmGetWindowAttribute : function(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall; F_hUser32dllModule : HMODULE; F_GetLayeredWindowAttributes : function(hwnd: HWND; var crKey: COLORREF; var bAlpha: BYTE; var dwFlags: DWORD): BOOL; stdcall; F_GetPhysicalCursorPos : TGetPhysicalCursorPos; const //constの定義でどうしても必要となる lcsCRLF = #13#10; lcsTITLE_CRLF = #13#10; //#13#10; lcsSTRUCT_CRLF = #13#10; lcsSTRUCT_POINT = lcsSTRUCT_CRLF + 'typedef struct tagPOINT {' + lcsCRLF + ' LONG x; //点のX座標' + lcsCRLF + ' LONG y; //点のY座標' + lcsCRLF + '} POINT;' ; lcsSTRUCT_RECT = lcsSTRUCT_CRLF + 'typedef struct tagRECT {' + lcsCRLF + ' LONG left; //左上隅のX座標' + lcsCRLF + ' LONG top; //左上隅のY座標' + lcsCRLF + ' LONG right; //右下隅のX座標' + lcsCRLF + ' LONG bottom; //右下隅のY座標' + lcsCRLF + '} RECT;' ; constructor T_MyAPIValue.Create; begin inherited; FsCRLF := #13#10; FsTITLE_CRLF := CRLF; // + CRLF; FsSTRUCT_CRLF := CRLF; FsSTRUCT_POINT := STRUCT_CRLF + 'typedef struct tagPOINT {' + CRLF + ' LONG x; //点のX座標' + CRLF + ' LONG y; //点のY座標' + CRLF + '} POINT;' ; FsSTRUCT_RECT := STRUCT_CRLF + 'typedef struct tagRECT {' + CRLF + ' LONG left; //左上隅のX座標' + CRLF + ' LONG top; //左上隅のY座標' + CRLF + ' LONG right; //右下隅のX座標' + CRLF + ' LONG bottom; //右下隅のY座標' + CRLF + '} RECT;' ; FDescription := TStringList.Create; FWindowList := TStringList.Create; FItems := TStringList.Create; FOrgItems := TStringList.Create; //デバイス // FAddFunc('GetBkColor', FGetBkColor, 'api-info'); // FAddFunc('GetDCPenColor', FGetDCPenColor, 'api-info'); FAddFunc('GetDeviceCaps', FGetDeviceCaps, 'api-info'); FAddFunc('GetSystemMetrics', FGetSystemMetrics, 'api-info'); // FAddFunc('SystemParametersInfo', FSystemParametersInfo, 'api-info'); //Icon FAddFunc('ExtractIcon', FExtractIcon, 'api-graphic'); //ウィンドウ取得 FAddFunc('GetAncestor', FGetAncestor, 'api'); FAddFunc('GetNextWindow', FGetNextWindow, 'api'); FAddFunc('GetParent', FGetParent, 'api'); FAddFunc('GetTopWindow', FGetTopWindow, 'api'); FAddFunc('GetWindow', FGetWindow, 'api'); FAddFunc('EnumChildWindows', FEnumChildWindows, 'api'); //Rect系 FAddFunc('GetWindowPlacement', FGetWindowPlacement, 'api'); FAddFunc('GetWindowRect', FGetWindowRect, 'api'); FAddFunc('GetClientRect', FGetClientRect, 'api'); FAddFunc('IsWindowEnabled', FIsWindowEnabled, 'api'); FAddFunc('IsWindowUnicode', FIsWindowUnicode, 'api'); FAddFunc('IsZoomed', FIsZoomed, 'api'); {$IFNDEF BUGSEYE} FAddFunc('IsIconic', FIsIconic, 'api'); FAddFunc('IsWindowVisible', FIsWindowVisible, 'api'); {$ENDIF} //ウィンドウの情報取得 FAddFunc('DwmGetWindowAttribute', FDwmGetWindowAttribute, 'api'); FAddFunc('GetLayeredWindowAttributes', FGetLayeredWindowAttributes, 'api'); FAddFunc('GetClassInfoEx', FGetClassInfoEx, 'api'); FAddFunc('GetClassLong', FGetClassLong, 'api'); FAddFunc('GetWindowInfo', FGetWindowInfo, 'api'); FAddFunc('GetWindowLong', FGetWindowLong, 'api'); FAddFunc('GetClassName', FGetClassName, 'api'); FAddFunc('RealGetWindowClass', FRealGetWindowClass, 'api'); FAddFunc('GetScrollBarInfo', FGetScrollBarInfo, 'api'); FAddFunc('GetScrollInfo', FGetScrollInfo, 'api'); FAddFunc('GetScrollPos', FGetScrollPos, 'api'); FAddFunc('GetScrollRange', FGetScrollRange, 'api'); FAddFunc('GetTitleBarInfo', FGetTitleBarInfo, 'api'); //プロセスハンドル系 FAddFunc('OpenProcess', FOpenProcess, 'api'); FAddFunc('GetPriorityClass', FGetPriorityClass, 'api'); FAddFunc('GetWindowThreadProcessId', FGetWindowThreadProcessId, 'api'); FAddFunc('EnumThreadWindows', FEnumThreadWindows, 'api'); FAddFunc('GetBinaryType', FGetBinaryType, 'api'); FAddFunc('GetFileAttributes', FGetFileAttributes, 'api'); FAddFunc('GetWindowModuleFileName', FGetWindowModuleFileName, 'api'); FAddFunc('GetFileVersionInfo', FGetFileVersionInfo, 'api'); FAddFunc('GetFileVersionInfoSize', FGetFileVersionInfoSize, 'api'); FAddFunc('VerQueryValue', FVerQueryValue, 'api'); {$IFDEF BUGSEYE} //座標を引数に求める系 FAddFunc('ChildWindowFromPoint', FChildWindowFromPoint, 'api'); FAddFunc('ChildWindowFromPointEx', FChildWindowFromPointEx, 'api'); FAddFunc('RealChildWindowFromPoint', FRealChildWindowFromPoint, 'api'); FAddFunc('WindowFromPoint', FWindowFromPoint, 'api'); FAddFunc('ScreenToClient', FScreenToClient, 'api'); FAddFunc('GetCursorPos', FGetCursorPos, 'api'); FAddFunc('GetPhysicalCursorPos', FGetPhysicalCursorPos, 'api'); FAddFunc('LogicalToPhysicalPoint', FLogicalToPhysicalPoint, 'api'); FAddFunc('PhysicalToLogicalPoint', FPhysicalToLogicalPoint, 'api'); {$ENDIF} //コンボボックスメッセージ FAddFunc('GetComboBoxInfo', FGetComboBoxInfo, 'api'); FAddFunc('CB_GETCOUNT', FCB_GetCount, 'msg-ComboBox'); FAddFunc('CB_GETCURSEL', FCB_GetCurSel, 'msg-ComboBox'); FAddFunc('CB_GETLBTEXT', FCB_GetLBText, 'msg-ComboBox'); FAddFunc('CB_GETLBTEXTLEN', FCB_GetLBTextLen , 'msg-ComboBox'); //リストボックスメッセージ FAddFunc('GetListBoxInfo', FGetListBoxInfo, 'api'); FAddFunc('LB_GETCOUNT', FLB_GetCount, 'msg-ListBox'); FAddFunc('LB_GETCURSEL', FLB_GetCurSel, 'msg-ListBox'); FAddFunc('LB_GETTEXT', FLB_GetText, 'msg-ListBox'); FAddFunc('LB_GETTEXTLEN', FLB_GetTextLen, 'msg-ListBox'); //トラックバーメッセージ // FAddFunc('TBM_GETBUDDY', FTBM_GetBuddy, 'msg-TrackBar'); //他のアプリの値を取得できないどころかエラーを吐かせてしまうこともあるのでコメントアウト // FAddFunc('TBM_GETCHANNELRECT', FTBM_GetChannelRECT, 'msg-TrackBar'); FAddFunc('TBM_GETLINESIZE', FTBM_GetLineSize, 'msg-TrackBar'); FAddFunc('TBM_GETNUMTICS', FTBM_GetNumTics, 'msg-TrackBar'); FAddFunc('TBM_GETPAGESIZE', FTBM_GetPageSize, 'msg-TrackBar'); FAddFunc('TBM_GETPOS', FTBM_GetPos, 'msg-TrackBar'); // FAddFunc('TBM_GETPTICS', FTBM_GetPTics, 'msg-TrackBar'); //うまくいかない FAddFunc('TBM_GETRANGEMAX', FTBM_GetRangeMax, 'msg-TrackBar'); FAddFunc('TBM_GETRANGEMIN', FTBM_GetRangeMin, 'msg-TrackBar'); FAddFunc('TBM_GETTHUMBLENGTH', FTBM_GetThumbLength, 'msg-TrackBar'); //他のアプリの値を取得できないどころかエラーを吐かせてしまうこともあるのでコメントアウト // FAddFunc('TBM_GETTHUMBRECT', FTBM_GetThumbRect, 'msg-TrackBar'); FAddFunc('TBM_GETTIC', FTBM_GetTic, 'msg-TrackBar'); FAddFunc('TBM_GETTICPOS', FTBM_GetTicPos, 'msg-TrackBar'); FAddFunc('TBM_GETTOOLTIPS', FTBM_GetToolTips, 'msg-TrackBar'); FAddFunc('TBM_GETUNICODEFORMAT', FTBM_GetUnicodeFormat, 'msg-TrackBar'); //WM〜メッセージ FAddFunc('GetWindowText', FGetWindowText, 'api'); FAddFunc('GetWindowTextLength', FGetWindowTextLength, 'api'); FAddFunc('WM_GETTEXT', FWM_GetText, 'msg-WindowText'); FAddFunc('WM_GETTEXTLENGTH', FWM_GetTextLength, 'msg-WindowText'); TStringList(FOrgItems).CustomSort(SortCategroyFunc); FItems.Assign(FOrgItems); end; //============================================================================== //テストするAPIを実装 // ExtractIcon ----------------------------------------------------------------- procedure T_MyAPIValue.FExtractIcon; const lcs_DECLARATION = 'HICON ExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName, UINT nIconIndex);'; lcs_DESCRIPTION = '指定された実行可能ファイル、ダイナミックリンクライブラリ(dll)、アイコンファイルのいずれかからそのファイル内のアイコンのハンドルを取得します。' + lcsTITLE_CRLF + 'hInst この関数を呼び出すアプリケーションのインスタンスハンドルを指定します。' + lcsCRLF + 'lpszExeFileName 実行可能ファイル、dll、アイコンファイルのいずれかのファイル名を指定します。' + lcsCRLF + 'nIconIndex 取得するアイコンのインデックスを0ベースで指定します。-1を指定するとファイル内のアイコンの総数が返ります。' + lcsCRLF + '戻り値 関数が成功するとアイコンのハンドルが返ります。ただしnIconIndexパラメータに-1を指定した場合はファイル内のアイコンの総数が返ります。' + '指定したファイルが実行可能ファイル、dll、アイコンファイルのいずれでもない場合、1が返ります。ファイル内にアイコンが見つからなかった場合NULLが返ります。' ; var ls_FileName : WideString; li_Count : Integer; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', '対象ウィンドウ'); // FAddElement('hInst', 'この関数を呼び出すアプリケーションのインスタンスハンドルを指定します。'); FAddElement('lpszExeFileName', 'アイコンを調べるファイル名を指定します。'); FAddElement('nIconIndex: -1', 'アイコンの数を返します。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin // lh_Instance := HINST(GetWindowLong(Application.Handle, GWL_HINSTANCE)); ls_FileName := gfnsExeNameGet(FhWndHandle); li_Count := ExtractIconW(HINST(GetWindowLong(Application.Handle, GWL_HINSTANCE)), PWideChar(ls_FileName), UINT(-1)); // FAddIntValue(lh_Instance); FAddStrValue(ls_FileName); FAddIntValue(li_Count); end; end; // GetBkColor ------------------------------------------------------------------ procedure T_MyAPIValue.FGetBkColor; const lcs_DECLARATION = 'COLORREF GetBkColor(HDC hdc);'; lcs_DESCRIPTION = '指定されたデバイスコンテキストの現在の背景色を返します。' + lcsTITLE_CRLF + 'hdc 調べるデバイスコンテキストのハンドルを指定します。' + lcsCRLF + '戻り値 関数が成功すると現在の背景色が返ります。関数が失敗するとCLR_INVALID(-1)が返ります。'; var lh_DC : HDC; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', '対象ウィンドウ。'); FAddElement('戻り値', '現在の背景色。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lh_DC := 0; try lh_DC := GetDC(FhWndHandle); FAddColorName(GetBkColor(lh_DC)); finally ReleaseDC(FhWndHandle, lh_DC); end; end; end; // GetDCPenColor --------------------------------------------------------------- procedure T_MyAPIValue.FGetDCPenColor; const lcs_DECLARATION = 'COLORREF GetDCPenColor(HDC hdc);'; lcs_DESCRIPTION = '指定されたデバイスコンテキストで指定されているペンの色を取得します。指定された色値をデバイスで表示できない場合は物理的に最も近い値色が返ります。' + lcsTITLE_CRLF + 'hdc 調べるデバイスコンテキストのハンドルを指定します。' + lcsCRLF + '戻り値 関数が成功すると現在指定されているペンの色に対する色参照が返ります。関数が失敗するとCLR_INVALID(-1)が返ります。'; var lh_DC : HDC; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', '対象ウィンドウ。'); FAddElement('戻り値', '現在指定されているペンの色。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lh_DC := 0; try lh_DC := GetDC(FhWndHandle); FAddColorName(GetDCPenColor(lh_DC)); finally ReleaseDC(FhWndHandle, lh_DC); end; end; end; // GetDeviceCaps --------------------------------------------------------------- procedure T_MyAPIValue.FGetDeviceCaps; //2000以降に追加されたカラーマネジメント用の定数 const CM_NONE = $0; CM_DEVICE_ICM = $1; CM_GAMMA_RAMP = $2; CM_CMYK_COLOR = $4; COLORMGMTCAPS = 121; function _GetTECHNOLOGY(iValue: Integer): WideString; begin case iValue of DT_PLOTTER : Result := 'ベクタプロッタ'; DT_RASDISPLAY : Result := 'ラスタディスプレイ'; DT_RASPRINTER : Result := 'ラスタプリンタ'; DT_RASCAMERA : Result := 'ラスタカメラ'; DT_CHARSTREAM : Result := '文字ストリーム'; DT_METAFILE : Result := 'メタファイル'; DT_DISPFILE : Result := 'ディスプレイファイル'; else Result := '未定義'; end; end; //http://chokuto.ifdef.jp/advanced/function/GetDeviceCaps.html procedure _SetSHADEBLENDCAPS(iValue: Integer); begin FSetElement(FGetValueCount); FAddElement('nIndex: SHADEBLENDCAPS', 'nIndexにSHADEBLENDCAPSを指定した時の戻り値。デバイスコンテキストのシェーディング(陰影)とブレンディング(混色)の能力を示す値。'); if (iValue = SB_NONE) then begin FAddStrValue('このデバイスコンテキストはシェーディングとブレンディングの能力をサポートしていません。'); end else begin if (gfnbFlagCheck(iValue, SB_CONST_ALPHA)) then FAddStrValue('SB_CONST_ALPHA ' + 'BLENDFUNCTION構造体のSourceConstantAlphaメンバを使います。'); if (gfnbFlagCheck(iValue, SB_GRAD_RECT)) then FAddStrValue('SB_GRAD_RECT ' + 'GradientFill関数を使って長方形を処理する能力があります。'); if (gfnbFlagCheck(iValue, SB_GRAD_TRI)) then FAddStrValue('SB_GRAD_TRI ' + 'GradientFill関数を使って三角形を処理する能力があります。'); if (gfnbFlagCheck(iValue, SB_PIXEL_ALPHA)) then FAddStrValue('SB_PIXEL_ALPHA ' + 'AlphaBlend関数を使ってピクセルごとのアルファ(透明度、輝度)を操作する能力があります。'); if (gfnbFlagCheck(iValue, SB_PREMULT_ALPHA)) then FAddStrValue('SB_PREMULT_ALPHA ' + 'AlphaBlend関数を使ってあらかじめ倍率を設定されたアルファを操作する能力があります。'); end; end; procedure _SetRASTERCAPS(iValue: Integer); begin FSetElement(FGetValueCount); FAddElement('nIndex: RASTERCAPS', 'nIndexにRASTERCAPSを指定した時の戻り値。デバイスコンテキストのラスタ能力。'); if (gfnbFlagCheck(iValue, RC_BANDING)) then FAddStrValue('RC_BANDING ' + 'バンド処理のサポートが必要です。バンド処理とは、1つのページを複数のセクション(バンド)へ分割する手法のことで、処理時間は多少長くなりますが、1つのページを作成するために必要なメモリを削減できます。'); if (gfnbFlagCheck(iValue, RC_BITBLT)) then FAddStrValue('RC_BITBLT ' + 'ビットマップの転送能力があります。'); if (gfnbFlagCheck(iValue, RC_BITMAP64)) then FAddStrValue('RC_BITMAP64 ' + '64KBより大きいビットマップをサポートしています。'); if (gfnbFlagCheck(iValue, RC_DI_BITMAP)) then FAddStrValue('RC_DI_BITMAP ' + 'SetDIBits関数とGetDIBits関数をサポートしています。'); if (gfnbFlagCheck(iValue, RC_DIBTODEV)) then FAddStrValue('RC_DIBTODEV ' + 'SetDIBitsToDevice関数をサポートしています。'); if (gfnbFlagCheck(iValue, RC_FLOODFILL)) then FAddStrValue('RC_FLOODFILL ' + '塗りつぶしを行う能力があります。'); if (gfnbFlagCheck(iValue, RC_GDI20_OUTPUT)) then FAddStrValue('RC_GDI20_OUTPUT ' + '16ビット版のWindows 2.0の機能をサポートしています。'); if (gfnbFlagCheck(iValue, RC_PALETTE)) then FAddStrValue('RC_PALETTE ' + 'パレットベースのデバイスとして指定できます。'); if (gfnbFlagCheck(iValue, RC_SCALING)) then FAddStrValue('RC_SCALING ' + 'スケーリングを行う能力があります。'); if (gfnbFlagCheck(iValue, RC_STRETCHBLT)) then FAddStrValue('RC_STRETCHBLT ' + 'StretchBlt関数を実行する能力があります。'); if (gfnbFlagCheck(iValue, RC_STRETCHDIB)) then FAddStrValue('RC_STRETCHDIB ' + 'StretchDIBits関数を実行する能力があります。'); end; procedure _SetCURVECAPS(iValue: Integer); begin FSetElement(FGetValueCount); FAddElement('nIndex: CURVECAPS', 'nIndexにCURVECAPSを指定した時の戻り値。デバイスコンテキストの曲線描画能力。'); if (iValue = CC_NONE) then begin FAddStrValue('このデバイスコンテキストは曲線をサポートしていません。'); end else begin if (gfnbFlagCheck(iValue, CC_CHORD)) then FAddStrValue('CC_CHORD ' + '弓形(弧と弦からなる図形)の弧を描画できます。'); if (gfnbFlagCheck(iValue, CC_CIRCLES)) then FAddStrValue('CC_CIRCLES ' + '円を描画できます。'); if (gfnbFlagCheck(iValue, CC_ELLIPSES)) then FAddStrValue('CC_ELLIPSES ' + '楕円を描画できます。'); if (gfnbFlagCheck(iValue, CC_INTERIORS)) then FAddStrValue('CC_INTERIORS ' + '内部の塗りつぶしを行えます。'); if (gfnbFlagCheck(iValue, CC_PIE)) then FAddStrValue('CC_PIE ' + '扇形を描画できます。'); if (gfnbFlagCheck(iValue, CC_ROUNDRECT)) then FAddStrValue('CC_ROUNDRECT ' + '角の丸い長方形を描画できます。'); if (gfnbFlagCheck(iValue, CC_STYLED)) then FAddStrValue('CC_STYLED ' + 'スタイル付きの境界線を描画できます。'); if (gfnbFlagCheck(iValue, CC_WIDE)) then FAddStrValue('CC_WIDE ' + '太い境界線を描画できます。'); if (gfnbFlagCheck(iValue, CC_WIDESTYLED)) then FAddStrValue('CC_WIDESTYLED ' + 'スタイル付きの太い境界線を描画できます。'); end; end; procedure _SetLINECAPS(iValue: Integer); begin FSetElement(FGetValueCount); FAddElement('nIndex: LINECAPS', 'nIndexにLINECAPSを指定した時の戻り値。デバイスコンテキストの直線描画能力。'); if (iValue = LC_NONE) then begin FAddStrValue('このデバイスコンテキストは直線をサポートしていません。'); end else begin if (gfnbFlagCheck(iValue, LC_INTERIORS)) then FAddStrValue('LC_INTERIORS ' + '内部の塗りつぶしを行えます。'); if (gfnbFlagCheck(iValue, LC_MARKER)) then FAddStrValue('LC_MARKER ' + '1個のマーカーを描画できます。'); if (gfnbFlagCheck(iValue, LC_POLYLINE)) then FAddStrValue('LC_POLYLINE ' + '連続直線を描画できます。'); if (gfnbFlagCheck(iValue, LC_POLYMARKER)) then FAddStrValue('LC_POLYMARKER ' + '複数のマーカーを描画できます。'); if (gfnbFlagCheck(iValue, LC_STYLED)) then FAddStrValue('LC_STYLED ' + 'スタイル付きの直線を描画できます。'); if (gfnbFlagCheck(iValue, LC_WIDE)) then FAddStrValue('LC_WIDE ' + '太い直線を描画できます。'); if (gfnbFlagCheck(iValue, LC_WIDESTYLED)) then FAddStrValue('LC_WIDESTYLED ' + 'スタイル付きの太い直線を描画できます。'); end; end; procedure _SetPOLYGONALCAPS(iValue: Integer); begin FSetElement(FGetValueCount); FAddElement('nIndex: POLYGONALCAPS', 'nIndexにPOLYGONALCAPSを指定した時の戻り値。デバイスコンテキストの多角形描画能力。'); if (iValue = PC_NONE) then begin FAddStrValue('このデバイスコンテキストは多角形をサポートしていません。'); end else begin if (gfnbFlagCheck(iValue, PC_INTERIORS)) then FAddStrValue('PC_INTERIORS ' + '内部の描画を行えます。'); if (gfnbFlagCheck(iValue, PC_POLYGON)) then FAddStrValue('PC_POLYGON ' + '交互モードの塗りつぶしを行えます。'); if (gfnbFlagCheck(iValue, PC_RECTANGLE)) then FAddStrValue('PC_RECTANGLE ' + '長方形を描画できます。'); if (gfnbFlagCheck(iValue, PC_SCANLINE)) then FAddStrValue('PC_SCANLINE ' + '単一の走査行を描画できます。'); if (gfnbFlagCheck(iValue, PC_STYLED)) then FAddStrValue('PC_STYLED ' + 'スタイル付きの境界線を描画できます。'); if (gfnbFlagCheck(iValue, PC_WIDE)) then FAddStrValue('PC_WIDE ' + '太い境界線を描画できます。'); if (gfnbFlagCheck(iValue, PC_WIDESTYLED)) then FAddStrValue('PC_WIDESTYLED ' + 'スタイル付きの太い境界線を描画できます。'); if (gfnbFlagCheck(iValue, PC_WINDPOLYGON)) then FAddStrValue('PC_WINDPOLYGON ' + '全域モードでの多角形の塗りつぶしを行えます。'); end; end; procedure _SetTEXTCAPS(iValue: Integer); begin FSetElement(FGetValueCount); FAddElement('nIndex: TEXTCAPS', 'nIndexにTEXTCAPSを指定した時の戻り値。デバイスコンテキストのテキスト表示能力。'); if (gfnbFlagCheck(iValue, TC_OP_CHARACTER)) then FAddStrValue('TC_OP_CHARACTER ' + 'キャラクタの出力精度を調整する能力があります。'); if (gfnbFlagCheck(iValue, TC_OP_STROKE)) then FAddStrValue('TC_OP_STROKE ' + 'ストロークの出力精度を調整する能力があります。'); if (gfnbFlagCheck(iValue, TC_CP_STROKE)) then FAddStrValue('TC_CP_STROKE ' + 'ストローククリップの精度を調整する能力があります。'); if (gfnbFlagCheck(iValue, TC_CR_90)) then FAddStrValue('TC_CR_90 ' + 'キャラクタの90度回転を行う能力があります。'); if (gfnbFlagCheck(iValue, TC_CR_ANY)) then FAddStrValue('TC_CR_ANY ' + 'キャラクタの任意の角度の回転を行う能力があります。'); if (gfnbFlagCheck(iValue, TC_SF_X_YINDEP)) then FAddStrValue('TC_SF_X_YINDEP ' + 'X方向とY方向の独立したスケーリング(長体と平体)を行えます。'); if (gfnbFlagCheck(iValue, TC_SA_DOUBLE)) then FAddStrValue('TC_SA_DOUBLE ' + 'キャラクタの2倍のスケーリング(倍角)を行えます。'); if (gfnbFlagCheck(iValue, TC_SA_INTEGER)) then FAddStrValue('TC_SA_INTEGER ' + 'キャラクタの整数倍のスケーリング(n倍角)を行えます。'); if (gfnbFlagCheck(iValue, TC_SA_CONTIN)) then FAddStrValue('TC_SA_CONTIN ' + 'キャラクタの任意の倍率のスケーリングを行えます。'); if (gfnbFlagCheck(iValue, TC_EA_DOUBLE)) then FAddStrValue('TC_EA_DOUBLE ' + '2倍の太さの文字(太字)を描画できます。'); if (gfnbFlagCheck(iValue, TC_IA_ABLE)) then FAddStrValue('TC_IA_ABLE ' + 'イタリック体を描画できます。'); if (gfnbFlagCheck(iValue, TC_UA_ABLE)) then FAddStrValue('TC_UA_ABLE ' + '下線を描画できます。'); if (gfnbFlagCheck(iValue, TC_SO_ABLE)) then FAddStrValue('TC_SO_ABLE ' + '取り消し線を描画できます。'); if (gfnbFlagCheck(iValue, TC_RA_ABLE)) then FAddStrValue('TC_RA_ABLE ' + 'ラスタフォントを描画できます。'); if (gfnbFlagCheck(iValue, TC_VA_ABLE)) then FAddStrValue('TC_VA_ABLE ' + 'ベクトルフォントを描画できます。'); if (gfnbFlagCheck(iValue, TC_SCROLLBLT)) then FAddStrValue('TC_SCROLLBLT ' + 'ビットブロック転送(ブリット)によるスクロールを行えません。このフラグが予期とは逆のことを意味する可能性があることに注意してください。'); end; procedure _SetCOLORMGMTCAPS(iValue: Integer); begin FSetElement(FGetValueCount); FAddElement('nIndex: COLORMGMTCAPS', 'nIndexにを指定した時の戻り値。デバイスコンテキストの色の管理(カラーマネジメント)能力。'); if (iValue = CM_NONE) then begin FAddStrValue('このデバイスコンテキストはICM(イメージ色の管理)をサポートしていません。'); end else begin if (gfnbFlagCheck(iValue, CM_CMYK_COLOR)) then FAddStrValue('CM_CMYK_COLOR ' + 'CMYK(シアン、マゼンタ、イエロー、ブラック)のカラースペース(色空間)に基づくICC(International Color Consortium)のカラープロファイルを受け入れます。'); if (gfnbFlagCheck(iValue, CM_DEVICE_ICM)) then FAddStrValue('CM_DEVICE_ICM ' + 'デバイスドライバまたはデバイスの側でICM(イメージ色の管理)を実施できます。'); if (gfnbFlagCheck(iValue, CM_GAMMA_RAMP)) then FAddStrValue('CM_GAMMA_RAMP ' + 'GetDeviceGammaRamp関数とSetDeviceGammaRamp関数をサポートしています。'); end; end; const lcs_DECLARATION = 'int GetDeviceCaps(HDC hdc, int nIndex)'; lcs_DESCRIPTION = '指定されたデバイスコンテキストに関するデバイスコンテキスト固有の情報を取得します。' + lcsTITLE_CRLF + 'hdc 調べるデバイスコンテキストのハンドルを指定します。' + lcsCRLF + 'nIndex 取得する情報のインデックスを指定します。以下の値のどれかを指定します。' + lcsCRLF + ' DRIVERVERSION デバイスドライバのバージョン。' + lcsCRLF + ' TECHNOLOGY デバイステクノロジ(タイプ)。' + lcsCRLF + ' HORZSIZE ミリメートル単位の画面の物理的な幅。' + lcsCRLF + ' VERTSIZE ミリメートル単位の画面の物理的な高さ。' + lcsCRLF + ' HORZRES ピクセル単位の画面の幅。' + lcsCRLF + ' VERTRES ピクセル単位の画面の高さ。' + lcsCRLF + ' LOGPIXELSX 画面の水平方向での論理インチ当たりのピクセル数。' + lcsCRLF + ' LOGPIXELSY 画面の垂直方向での論理インチ当たりのピクセル数。' + lcsCRLF + ' BITSPIXEL ピクセルあたりのカラービットの数。' + lcsCRLF + ' PLANES カラープレーンの数。' + lcsCRLF + ' NUMBRUSHES デバイス固有のブラシの数。' + lcsCRLF + ' NUMPENS デバイス固有のペンの数。' + lcsCRLF + ' NUMFONTS デバイス固有のフォントの数。' + lcsCRLF + ' NUMCOLORS デバイスのカラー深度が8bpp(ピクセル当たり8ビット)以下の場合はデバイスのカラーテーブル内のエントリ数。色深度が8bppを超える場合は-1。' + lcsCRLF + ' ASPECTX 線の描画に使うデバイスピクセルの相対的な幅。' + lcsCRLF + ' ASPECTY 線の描画に使うデバイスピクセルの相対的な高さ。' + lcsCRLF + ' ASPECTXY 線の描画に使うデバイスピクセルの対角線の幅。' + lcsCRLF + ' PDEVICESIZE 予約済み。' + lcsCRLF + ' CLIPCAPS デバイスのクリッピング能力を示すフラグ。デバイスが長方形のクリップをサポートする場合は1、それ以外の場合は0。' + lcsCRLF + ' SIZEPALETTE システムパレット内のエントリ数。' + lcsCRLF + ' NUMRESERVED システムパレット内の予約エントリ数。' + lcsCRLF + ' COLORRES デバイスの実際の色深度を表すピクセル当たりのビット数。' + lcsCRLF + ' PHYSICALWIDTH 印刷デバイス用。ページの物理的な幅をデバイス単位で表示。' + lcsCRLF + ' PHYSICALHEIGHT 印刷デバイス用。ページの物理的な高さをデバイス単位で表示。' + lcsCRLF + ' PHYSICALOFFSETX 印刷デバイス用。物理的なページの左端から印刷可能領域の左端までの距離をデバイス単位で表示。' + lcsCRLF + ' PHYSICALOFFSETY 印刷デバイス用。物理的なページの上端から印刷可能領域の上端までの距離をデバイス単位で表示。' + lcsCRLF + ' VREFRESH ディスプレイデバイス用。デバイスの現在のリフレッシュレート(垂直同期周波数)を1秒当たりのサイクル数(Hz)で表示。' + lcsCRLF + ' SCALINGFACTORX プリンタの水平軸の倍率。' + lcsCRLF + ' SCALINGFACTORY プリンタの垂直軸の倍率。' + lcsCRLF + ' BLTALIGNMENT 水平方向のアラインメント(整列単位)の優先値をピクセル単位で取得。' + lcsCRLF + ' SHADEBLENDCAPS デバイスのシェーディング(陰影)とブレンディング(混色)の能力を示す値。' + lcsCRLF + ' RASTERCAPS デバイスのラスタ能力。' + lcsCRLF + ' CURVECAPS デバイスの曲線描画能力。' + lcsCRLF + ' LINECAPS デバイスの直線描画能力。' + lcsCRLF + ' POLYGONALCAPS デバイスの多角形描画能力。' + lcsCRLF + ' TEXTCAPS デバイスのテキスト表示能力。' + lcsCRLF + ' COLORMGMTCAPS デバイスの色の管理(カラーマネジメント)能力。' + lcsCRLF + '戻り値 要求した情報のインデックスに対応する値が返ります。nIndexパラメータにBITSPIXELを指定し、デバイスコンテキストの色深度が15bppまたは16bppの場合は16が返ります。'; var lh_DC : HDC; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', '対象ウィンドウ'); FAddElement('nIndex: DRIVERVERSION', 'nIndexにDRIVERVERSIONを指定した時の戻り値。デバイスドライバのバージョン。'); FAddElement('nIndex: TECHNOLOGY', 'nIndexにTECHNOLOGYを指定した時の戻り値。デバイステクノロジ(タイプ)'); FAddElement('nIndex: HORZSIZE', 'nIndexにHORZSIZEを指定した時の戻り値。ミリメートル単位の画面の物理的な幅。'); FAddElement('nIndex: VERTSIZE', 'nIndexにVERTSIZEを指定した時の戻り値。ミリメートル単位の画面の物理的な高さ。'); FAddElement('nIndex: HORZRES', 'nIndexにHORZRESを指定した時の戻り値。ピクセル単位の画面の幅。'); FAddElement('nIndex: VERTRES', 'nIndexにVERTRESを指定した時の戻り値。ピクセル単位の画面の高さ。'); FAddElement('nIndex: LOGPIXELSX', 'nIndexにLOGPIXELSXを指定した時の戻り値。画面の水平方向での論理インチ当たりのピクセル数。'); FAddElement('nIndex: LOGPIXELSY', 'nIndexにLOGPIXELSYを指定した時の戻り値。画面の垂直方向での論理インチ当たりのピクセル数。'); FAddElement('nIndex: BITSPIXEL', 'nIndexにBITSPIXELを指定した時の戻り値。ピクセルあたりのカラービットの数。'); FAddElement('nIndex: PLANES', 'nIndexにPLANESを指定した時の戻り値。カラープレーンの数。'); FAddElement('nIndex: NUMBRUSHES', 'nIndexにNUMBRUSHESを指定した時の戻り値。デバイス固有のブラシの数。'); FAddElement('nIndex: NUMPENS', 'nIndexにNUMPENSを指定した時の戻り値。デバイス固有のペンの数。'); FAddElement('nIndex: NUMFONTS', 'nIndexにNUMFONTSを指定した時の戻り値。デバイス固有のフォントの数。'); FAddElement('nIndex: NUMCOLORS', 'nIndexにNUMCOLORSを指定した時の戻り値。デバイスのカラー深度が8bpp(ピクセル当たり8ビット)以下の場合はデバイスのカラーテーブル内のエントリ数。色深度が8bppを超える場合は-1。'); FAddElement('nIndex: ASPECTX', 'nIndexにASPECTXを指定した時の戻り値。線の描画に使うデバイスピクセルの相対的な幅。'); FAddElement('nIndex: ASPECTY', 'nIndexにASPECTYを指定した時の戻り値。線の描画に使うデバイスピクセルの相対的な高さ。'); FAddElement('nIndex: ASPECTXY', 'nIndexにASPECTXYを指定した時の戻り値。線の描画に使うデバイスピクセルの対角線の幅。'); FAddElement('nIndex: PDEVICESIZE', 'nIndexにPDEVICESIZEを指定した時の戻り値。予約済み。'); FAddElement('nIndex: CLIPCAPS', 'nIndexにCLIPCAPSを指定した時の戻り値。デバイスのクリッピング能力を示すフラグ。デバイスが長方形のクリップをサポートする場合は1、それ以外の場合は0。'); FAddElement('nIndex: SIZEPALETTE', 'nIndexにSIZEPALETTEを指定した時の戻り値。システムパレット内のエントリ数。'); FAddElement('nIndex: NUMRESERVED', 'nIndexにNUMRESERVEDを指定した時の戻り値。システムパレット内の予約エントリ数。'); FAddElement('nIndex: COLORRES', 'nIndexにCOLORRESを指定した時の戻り値。デバイスの実際の色深度を表すピクセル当たりのビット数。'); FAddElement('nIndex: PHYSICALWIDTH', 'nIndexにPHYSICALWIDTHを指定した時の戻り値。印刷デバイス用。ページの物理的な幅をデバイス単位で表示。'); FAddElement('nIndex: PHYSICALHEIGHT', 'nIndexにPHYSICALHEIGHTを指定した時の戻り値。印刷デバイス用。ページの物理的な高さをデバイス単位で表示。'); FAddElement('nIndex: PHYSICALOFFSETX', 'nIndexにPHYSICALOFFSETXを指定した時の戻り値。印刷デバイス用。物理的なページの左端から印刷可能領域の左端までの距離をデバイス単位で表示。'); FAddElement('nIndex: PHYSICALOFFSETY', 'nIndexにPHYSICALOFFSETYを指定した時の戻り値。印刷デバイス用。物理的なページの上端から印刷可能領域の上端までの距離をデバイス単位で表示。'); FAddElement('nIndex: VREFRESH', 'nIndexにVREFRESHを指定した時の戻り値。ディスプレイデバイス用。デバイスの現在のリフレッシュレート(垂直同期周波数)を1秒当たりのサイクル数(Hz)で表示。'); FAddElement('nIndex: SCALINGFACTORX', 'nIndexにSCALINGFACTORXを指定した時の戻り値。プリンタの水平軸の倍率。'); FAddElement('nIndex: SCALINGFACTORY', 'nIndexにSCALINGFACTORYを指定した時の戻り値。プリンタの垂直軸の倍率。'); FAddElement('nIndex: BLTALIGNMENT', 'nIndexにBLTALIGNMENTを指定した時の戻り値。水平方向のアラインメント(整列単位)の優先値をピクセル単位で取得。'); { FAddElement('nIndex: SHADEBLENDCAPS', 'nIndexにSHADEBLENDCAPSを指定した時の戻り値。デバイスのシェーディング(陰影)とブレンディング(混色)の能力を示す値。'); FAddElement('nIndex: RASTERCAPS', 'nIndexにRASTERCAPSを指定した時の戻り値。デバイスのラスタ能力。'); FAddElement('nIndex: CURVECAPS', 'nIndexにCURVECAPSを指定した時の戻り値。デバイスの曲線描画能力。'); FAddElement('nIndex: LINECAPS', 'nIndexにLINECAPSを指定した時の戻り値。デバイスの直線描画能力。'); FAddElement('nIndex: POLYGONALCAPS', 'nIndexにPOLYGONALCAPSを指定した時の戻り値。デバイスの多角形描画能力。'); FAddElement('nIndex: TEXTCAPS', 'nIndexにTEXTCAPSを指定した時の戻り値。デバイスのテキスト表示能力。'); FAddElement('nIndex: COLORMGMTCAPS', 'nIndexにを指定した時の戻り値。デバイスの色の管理(カラーマネジメント)能力。'); } end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lh_DC := 0; try lh_DC := GetDC(FhWndHandle); FAddIntValue(GetDeviceCaps(lh_DC, DRIVERVERSION)); FAddStrValue(_GetTECHNOLOGY(GetDeviceCaps(lh_DC, TECHNOLOGY))); FAddIntValue(GetDeviceCaps(lh_DC, HORZSIZE)); FAddIntValue(GetDeviceCaps(lh_DC, VERTSIZE)); FAddIntValue(GetDeviceCaps(lh_DC, HORZRES)); FAddIntValue(GetDeviceCaps(lh_DC, VERTRES)); FAddIntValue(GetDeviceCaps(lh_DC, LOGPIXELSX)); FAddIntValue(GetDeviceCaps(lh_DC, LOGPIXELSY)); FAddIntValue(GetDeviceCaps(lh_DC, BITSPIXEL)); FAddIntValue(GetDeviceCaps(lh_DC, PLANES)); FAddIntValue(GetDeviceCaps(lh_DC, NUMBRUSHES)); FAddIntValue(GetDeviceCaps(lh_DC, NUMPENS)); FAddIntValue(GetDeviceCaps(lh_DC, NUMFONTS)); FAddIntValue(GetDeviceCaps(lh_DC, NUMCOLORS)); FAddIntValue(GetDeviceCaps(lh_DC, ASPECTX)); FAddIntValue(GetDeviceCaps(lh_DC, ASPECTY)); FAddIntValue(GetDeviceCaps(lh_DC, ASPECTXY)); FAddIntValue(GetDeviceCaps(lh_DC, PDEVICESIZE)); FAddIntValue(GetDeviceCaps(lh_DC, CLIPCAPS)); FAddIntValue(GetDeviceCaps(lh_DC, SIZEPALETTE)); FAddIntValue(GetDeviceCaps(lh_DC, NUMRESERVED)); FAddIntValue(GetDeviceCaps(lh_DC, COLORRES)); FAddIntValue(GetDeviceCaps(lh_DC, PHYSICALWIDTH)); FAddIntValue(GetDeviceCaps(lh_DC, PHYSICALHEIGHT)); FAddIntValue(GetDeviceCaps(lh_DC, PHYSICALOFFSETX)); FAddIntValue(GetDeviceCaps(lh_DC, PHYSICALOFFSETY)); FAddIntValue(GetDeviceCaps(lh_DC, VREFRESH)); FAddIntValue(GetDeviceCaps(lh_DC, SCALINGFACTORX)); FAddIntValue(GetDeviceCaps(lh_DC, SCALINGFACTORY)); FAddIntValue(GetDeviceCaps(lh_DC, BLTALIGNMENT)); _SetSHADEBLENDCAPS(GetDeviceCaps(lh_DC, SHADEBLENDCAPS)); _SetRASTERCAPS (GetDeviceCaps(lh_DC, RASTERCAPS)); _SetCURVECAPS (GetDeviceCaps(lh_DC, CURVECAPS)); _SetLINECAPS (GetDeviceCaps(lh_DC, LINECAPS)); _SetPOLYGONALCAPS (GetDeviceCaps(lh_DC, POLYGONALCAPS)); _SetTEXTCAPS (GetDeviceCaps(lh_DC, TEXTCAPS)); _SetCOLORMGMTCAPS (GetDeviceCaps(lh_DC, COLORMGMTCAPS)); finally ReleaseDC(FhWndHandle, lh_DC); end; end; end; // GetSystemMetrics ------------------------------------------------------------ procedure T_MyAPIValue.FGetSystemMetrics; const SM_XVIRTUALSCREEN = 76; SM_YVIRTUALSCREEN = 77; SM_CXVIRTUALSCREEN = 78; SM_CYVIRTUALSCREEN = 79; SM_CMONITORS = 80; SM_SAMEDISPLAYFORMAT = 81; SM_IMMENABLED = 82; SM_REMOTESESSION = $1000; const lcs_DECLARATION = 'int GetSystemMetrics(int nIndex);'; lcs_DESCRIPTION = 'さまざまなシステムメトリックの値(表示要素の幅と高さ)とシステムの現在の構成を取得します。表示要素とはウィンドウの一部、またはシステムが表示する画面の一部を意味します。' + lcsTITLE_CRLF + 'nIndex 取得したいシステムメトリックまたは現在の構成を指定します。下記の値が指定できます。' + lcsCRLF + '戻り値 関数が成功すると要求した値または現在の構成を示す値が、失敗すると0が返ります。' + lcsCRLF + 'SM_ARRANGE 最小化ウィンドウの配置方法を示す値を取得します。' + lcsCRLF + 'SM_CLEANBOOT システムがどのように起動されたかを示す値を取得します。' + lcsCRLF + 'SM_CMONITORS デスクトップ上のモニタの数を取得します。' + lcsCRLF + 'SM_CMOUSEBUTTONS マウスボタンの数(マウスがないときは0)を取得します。' + lcsCRLF + 'SM_CXBORDER 立体効果のないウィンドウの境界線の幅を取得します。' + lcsCRLF + 'SM_CYBORDER 立体効果のないウィンドウの境界線の高さを取得します。' + lcsCRLF + 'SM_CXCURSOR マウスカーソルの幅を取得します。' + lcsCRLF + 'SM_CYCURSOR マウスカーソルの高さを取得します。' + lcsCRLF + 'SM_CXDLGFRAME タイトルバーがありサイズが変更できないウィンドウの枠の幅を取得します。SM_CXFIXEDFRAMEと同じです。' + lcsCRLF + 'SM_CYDLGFRAME タイトルバーがありサイズが変更できないウィンドウの枠の高さを取得します。SM_CYFIXEDFRAMEと同じです。' + lcsCRLF + 'SM_CXDOUBLECLK ダブルクリックと認識される範囲の幅を取得します。' + lcsCRLF + 'SM_CYDOUBLECLK ダブルクリックと認識される範囲の高さを取得します。' + lcsCRLF + 'SM_CXDRAG ドラッグの開始と見なされない範囲の幅を取得します。' + lcsCRLF + 'SM_CYDRAG ドラッグの開始と見なされない範囲の高さを取得します。' + lcsCRLF + 'SM_CXEDGE 立体効果付きのウィンドウの境界線の幅を取得します。' + lcsCRLF + 'SM_CYEDGE 立体効果付きのウィンドウの境界線の高さを取得します。' + lcsCRLF + 'SM_CXFIXEDFRAME タイトルバーがありサイズが変更できないウィンドウの枠の幅を取得します。SM_CXDLGFRAMEと同じです。' + lcsCRLF + 'SM_CYFIXEDFRAME タイトルバーがありサイズが変更できないウィンドウの枠の高さを取得します。SM_CYDLGFRAMEと同じです。' + lcsCRLF + 'SM_CXFRAME サイズ変更可能なウィンドウの枠の幅を取得します。SM_CXSIZEFRAMEと同じです。' + lcsCRLF + 'SM_CYFRAME サイズ変更可能なウィンドウの枠の高さを取得します。SM_CYSIZEFRAMEと同じです。' + lcsCRLF + 'SM_CXFULLSCREEN プライマリモニタの最大化ウィンドウのクライアント領域の幅を取得します。' + lcsCRLF + 'SM_CYFULLSCREEN プライマリモニタの最大化ウィンドウのクライアント領域の高さを取得します。' + lcsCRLF + 'SM_CXHSCROLL 水平スクロールバーの矢印の幅を取得します。' + lcsCRLF + 'SM_CYHSCROLL 水平スクロールバーの矢印の高さを取得します。' + lcsCRLF + 'SM_CXHTHUMB 水平スクロールバーのスクロールボックス(つまみ)の幅を取得します。' + lcsCRLF + 'SM_CXICON アイコンの既定の幅を取得します。' + lcsCRLF + 'SM_CYICON アイコンの既定の高さを取得します。' + lcsCRLF + 'SM_CXICONSPACING アイコンを整列するときに使われるグリッドの幅を取得します。' + lcsCRLF + 'SM_CYICONSPACING アイコンを整列するときに使われるグリッドの高さを取得します。' + lcsCRLF + 'SM_CXMAXIMIZED プライマリモニタの最大化ウィンドウの幅を取得します。' + lcsCRLF + 'SM_CYMAXIMIZED プライマリモニタの最大化ウィンドウの高さを取得します。' + lcsCRLF + 'SM_CXMAXTRACK タイトルバーがありサイズが変更できないウィンドウの最大の幅を取得します。このサイズはデスクトップ全体に相当します。' + lcsCRLF + 'SM_CYMAXTRACK タイトルバーがありサイズが変更できないウィンドウの最大の高さを取得します。このサイズはデスクトップ全体に相当します。' + lcsCRLF + 'SM_CXMENUCHECK メニューのチェックマークの幅を取得します。' + lcsCRLF + 'SM_CYMENUCHECK メニューのチェックマークの高さを取得します。' + lcsCRLF + 'SM_CXMENUSIZE MDIの子ウィンドウの[閉じる]ボタンなどのタイトルバーに表示されるボタンの幅を取得します。' + lcsCRLF + 'SM_CYMENUSIZE MDIの子ウィンドウの[閉じる]ボタンなどのタイトルバーに表示されるボタンの高さを取得します。' + lcsCRLF + 'SM_CXMIN ウィンドウの最小サイズの幅を取得します。' + lcsCRLF + 'SM_CYMIN ウィンドウの最小サイズの高さを取得します。' + lcsCRLF + 'SM_CXMINIMIZED 最小化ウィンドウの通常のサイズの幅を取得します。' + lcsCRLF + 'SM_CYMINIMIZED 最小化ウィンドウの通常のサイズの高さを取得します。' + lcsCRLF + 'SM_CXMINSPACING 最小化ウィンドウの配置に使われるグリッドの幅を取得します。' + lcsCRLF + 'SM_CYMINSPACING 最小化ウィンドウの配置に使われるグリッドの高さを取得します。' + lcsCRLF + 'SM_CXMINTRACK ウィンドウの最小トラッキングサイズの幅を取得します。' + lcsCRLF + 'SM_CYMINTRACK ウィンドウの最小トラッキングサイズの高さを取得します。' + lcsCRLF + 'SM_CXSCREEN プライマリモニタの画面全体の幅を取得します。' + lcsCRLF + 'SM_CYSCREEN プライマリモニタの画面全体の高さを取得します。' + lcsCRLF + 'SM_CXSIZE ウィンドウのタイトルバー内のボタンの幅を取得します。' + lcsCRLF + 'SM_CYSIZE ウィンドウのタイトルバー内のボタンの高さを取得します。' + lcsCRLF + 'SM_CXSIZEFRAME サイズ変更可能なウィンドウの枠の幅を取得します。SM_CXFRAMEと同じです。' + lcsCRLF + 'SM_CYSIZEFRAME サイズ変更可能なウィンドウの枠の高さを取得します。SM_CYFRAMEと同じです。' + lcsCRLF + 'SM_CXSMICON 小アイコンの推奨サイズの幅を取得します。' + lcsCRLF + 'SM_CYSMICON 小アイコンの推奨サイズの高さを取得します。' + lcsCRLF + 'SM_CXSMSIZE タイトルバー内の小さいボタンのサイズの幅を取得します。' + lcsCRLF + 'SM_CYSMSIZE タイトルバー内の小さいボタンのサイズの高さを取得します。' + lcsCRLF + 'SM_CXVIRTUALSCREEN 仮想画面の幅を取得します。' + lcsCRLF + 'SM_CYVIRTUALSCREEN 仮想画面の高さを取得します。' + lcsCRLF + 'SM_CXVSCROLL 垂直スクロールバーの幅を取得します。' + lcsCRLF + 'SM_CYVSCROLL 垂直スクロールバーの矢印の高さを取得します。' + lcsCRLF + 'SM_CYCAPTION 通常のタイトルバーの高さを取得します。' + lcsCRLF + 'SM_CYKANJIWINDOW 画面下の漢字ウィンドウの高さを取得します。' + lcsCRLF + 'SM_CYMENU 1行分のメニューバーの高さを取得します。' + lcsCRLF + 'SM_CYSMCAPTION 小さなタイトルバーの高さを取得します。' + lcsCRLF + 'SM_CYVTHUMB 垂直スクロールバーのスクロールボックス(つまみ)の高さを取得します。' + lcsCRLF + 'SM_DBCSENABLED ダブルバイト文字セット(DBCS)のUser.exeがインストールされていればTRUEが、されていなければFALSEが返ります。' + lcsCRLF + 'SM_DEBUG デバッグ版のUser.exeがインストールされていればTRUEが、されていなければFALSEが返ります。' + lcsCRLF + 'SM_IMMENABLED IME機能が有効になっていればTRUEが、なっていなければFALSEが帰ります。' + lcsCRLF + 'SM_IMMENABLED システムがUnicodeベースのアプリケーションで、UnicodeベースのIMEを使う準備ができていればTRUEが、されていなければFALSEが返ります。' + lcsCRLF + 'SM_MENUDROPALIGNMENT メニューバーの項目に対してドロップダウンメニューを右寄せする場合はTRUEが、そうでなければFALSEが返ります。' + lcsCRLF + 'SM_MIDEASTENABLED ヘブライ語やアラビア語(右から左へ表示)が利用可能なシステムであればTRUEが、そうでなければFALSEが返ります。' + lcsCRLF + 'SM_MOUSEPRESENT マウスが接続されていればTRUEが、そうでなければFALSEが返ります。' + lcsCRLF + 'SM_MOUSEWHEELPRESENT ホイール付きマウスが接続されていればTRUEが、そうでなければFALSEが返ります。' + lcsCRLF + 'SM_NETWORK ネットワークが存在すれば最下位ビットに1の値が、存在しなければ最下位ビットに0の値が返ります。他のビットは将来の使用に備えて予約されています。' + lcsCRLF + 'SM_PENWINDOWS Windows for Pen computing extensionsがインストールされていればTRUEが、そうでなければFALSEが返ります。' + lcsCRLF + 'SM_REMOTESESSION この値はTerminal Services環境で使うことを意図おり、呼び出し側プロセスがTerminal Servicesのクライアントセッションに関連付けられている場合はTRUEが、コンソールセッションに関連付けられている場合はFALSEが返ります。' + lcsCRLF + 'SM_SECURE セキュリティが存在していればTRUEが、そうでなければFALSEが返ります。' + lcsCRLF + 'SM_SAMEDISPLAYFORMAT 複数のモニタが存在する場合、すべてのモニタが同じカラーフォーマットを使っていればTRUEが、そうでなければ0が返ります。' + lcsCRLF + 'SM_SHOWSOUNDS ユーザー補助機能の[サウンド解説を使う]が有効になっていればTRUE、そうでなければFALSEが返ります。' + lcsCRLF + 'SM_SLOWMACHINE コンピュータのプロセッサが遅い場合はTRUEが、それ以外の場合はFALSEが返ります。' + lcsCRLF + 'SM_SWAPBUTTON 左右のマウスボタンの機能を交換していればTRUEが、交換していなければFALSEが返ります。' + lcsCRLF + 'SM_XVIRTUALSCREEN 仮想画面の座標の左端の値を取得します。' + lcsCRLF + 'SM_YVIRTUALSCREEN 仮想画面の座標の上端の値を取得します。' ; procedure _AddArrangeValue(iValue: Integer); var ls_Ret : WideString; begin case iValue of 0, 4: ls_Ret := 'スクリーンの左下隅から開始し、左から右へ水平方向に配置します。'; 1, 5: ls_Ret := 'スクリーンの右下隅から開始し、右から左へ水平方向に配置します。'; 2, 6: ls_Ret := 'スクリーンの左上隅から開始し、上から下へ垂直方向に配置します。'; 3, 7: ls_Ret := 'スクリーンの右上隅から開始し、上から下へ垂直方向に配置します。'; 8: ls_Ret := '画面の外へ移動し、非表示にします。'; else ls_Ret := '不明'; end; FAddStrValue(WideFormat('(%d) %s', [iValue, ls_Ret])); end; procedure _AddCleanBootValue(iValue: Integer); var ls_Ret : WideString; begin case iValue of 0: ls_Ret := '通常の起動。'; 1: ls_Ret := 'Safe モードでの起動。'; 2: ls_Ret := 'ネットワークを使ったSafeモードでの起動。'; else ls_Ret := '不明'; end; FAddStrValue(WideFormat('(%d) %s', [iValue, ls_Ret])); end; procedure _AddBoolValue(iValue: Integer); var ls_Ret : WideString; begin if (iValue = 0) then ls_Ret := 'FALSE' else ls_Ret := 'TRUE'; FAddStrValue(WideFormat('(%d) %s', [iValue, ls_Ret])); end; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('nIndex: SM_ARRANGE', '最小化ウィンドウの配置方法を示す値を取得します。'); FAddElement('nIndex: SM_CLEANBOOT', 'システムがどのように起動されたかを示す値を取得します。'); FAddElement('nIndex: SM_CMONITORS', 'デスクトップ上のモニタの数を取得します。'); FAddElement('nIndex: SM_CMOUSEBUTTONS', 'マウスボタンの数(マウスがないときは0)を取得します。'); FAddElement('nIndex: SM_CXBORDER', '立体効果のないウィンドウの境界線の幅を取得します。'); FAddElement('nIndex: SM_CYBORDER', '立体効果のないウィンドウの境界線の高さを取得します。'); FAddElement('nIndex: SM_CXCURSOR', 'マウスカーソルの幅を取得します。'); FAddElement('nIndex: SM_CYCURSOR', 'マウスカーソルの高さを取得します。'); FAddElement('nIndex: SM_CXDLGFRAME', 'タイトルバーがありサイズが変更できないウィンドウの枠の幅を取得します。SM_CXFIXEDFRAMEと同じです。'); FAddElement('nIndex: SM_CYDLGFRAME', 'タイトルバーがありサイズが変更できないウィンドウの枠の高さを取得します。SM_CYFIXEDFRAMEと同じです。'); FAddElement('nIndex: SM_CXDOUBLECLK', 'ダブルクリックと認識される範囲の幅を取得します。'); FAddElement('nIndex: SM_CYDOUBLECLK', 'ダブルクリックと認識される範囲の高さを取得します。'); FAddElement('nIndex: SM_CXDRAG', 'ドラッグの開始と見なされない範囲の幅を取得します。'); FAddElement('nIndex: SM_CYDRAG', 'ドラッグの開始と見なされない範囲の高さを取得します。'); FAddElement('nIndex: SM_CXEDGE', '立体効果付きのウィンドウの境界線の幅を取得します。'); FAddElement('nIndex: SM_CYEDGE', '立体効果付きのウィンドウの境界線の高さを取得します。'); FAddElement('nIndex: SM_CXFIXEDFRAME', 'タイトルバーがありサイズが変更できないウィンドウの枠の幅を取得します。SM_CXDLGFRAMEと同じです。'); FAddElement('nIndex: SM_CYFIXEDFRAME', 'タイトルバーがありサイズが変更できないウィンドウの枠の高さを取得します。SM_CYDLGFRAMEと同じです。'); FAddElement('nIndex: SM_CXFRAME', 'サイズ変更可能なウィンドウの枠の幅を取得します。SM_CXSIZEFRAMEと同じです。'); FAddElement('nIndex: SM_CYFRAME', 'サイズ変更可能なウィンドウの枠の高さを取得します。SM_CYSIZEFRAMEと同じです。'); FAddElement('nIndex: SM_CXFULLSCREEN', 'プライマリモニタの最大化ウィンドウのクライアント領域の幅を取得します。'); FAddElement('nIndex: SM_CYFULLSCREEN', 'プライマリモニタの最大化ウィンドウのクライアント領域の高さを取得します。'); FAddElement('nIndex: SM_CXHSCROLL', '水平スクロールバーの矢印の幅を取得します。'); FAddElement('nIndex: SM_CYHSCROLL', '水平スクロールバーの矢印の高さを取得します。'); FAddElement('nIndex: SM_CXHTHUMB', '水平スクロールバーのスクロールボックス(つまみ)の幅を取得します。'); FAddElement('nIndex: SM_CXICON', 'アイコンの既定の幅を取得します。'); FAddElement('nIndex: SM_CYICON', 'アイコンの既定の高さを取得します。'); FAddElement('nIndex: SM_CXICONSPACING', 'アイコンを整列するときに使われるグリッドの幅を取得します。'); FAddElement('nIndex: SM_CYICONSPACING', 'アイコンを整列するときに使われるグリッドの高さを取得します。'); FAddElement('nIndex: SM_CXMAXIMIZED', 'プライマリモニタの最大化ウィンドウの幅を取得します。'); FAddElement('nIndex: SM_CYMAXIMIZED', 'プライマリモニタの最大化ウィンドウの高さを取得します。'); FAddElement('nIndex: SM_CXMAXTRACK', 'タイトルバーがありサイズが変更できないウィンドウの最大の幅を取得します。このサイズはデスクトップ全体に相当します'); FAddElement('nIndex: SM_CYMAXTRACK', 'タイトルバーがありサイズが変更できないウィンドウの最大の高さを取得します。このサイズはデスクトップ全体に相当します。'); FAddElement('nIndex: SM_CXMENUCHECK', 'メニューのチェックマークの幅を取得します。'); FAddElement('nIndex: SM_CYMENUCHECK', 'メニューのチェックマークの高さを取得します。'); FAddElement('nIndex: SM_CXMENUSIZE', 'MDIの子ウィンドウの[閉じる]ボタンなどのタイトルバーに表示されるボタンの幅を取得します。'); FAddElement('nIndex: SM_CYMENUSIZE', 'MDIの子ウィンドウの[閉じる]ボタンなどのタイトルバーに表示されるボタンの高さを取得します。'); FAddElement('nIndex: SM_CXMIN', 'ウィンドウの最小サイズの幅を取得します。'); FAddElement('nIndex: SM_CYMIN', 'ウィンドウの最小サイズの高さを取得します。'); FAddElement('nIndex: SM_CXMINIMIZED', '最小化ウィンドウの通常のサイズの幅を取得します。'); FAddElement('nIndex: SM_CYMINIMIZED', '最小化ウィンドウの通常のサイズの高さを取得します。'); FAddElement('nIndex: SM_CXMINSPACING', '最小化ウィンドウの配置に使われるグリッドの幅を取得します。'); FAddElement('nIndex: SM_CYMINSPACING', '最小化ウィンドウの配置に使われるグリッドの高さを取得します。'); FAddElement('nIndex: SM_CXMINTRACK', 'ウィンドウの最小トラッキングサイズの幅を取得します。'); FAddElement('nIndex: SM_CYMINTRACK', 'ウィンドウの最小トラッキングサイズの高さを取得します。'); FAddElement('nIndex: SM_CXSCREEN', 'プライマリモニタの画面全体の幅を取得します。'); FAddElement('nIndex: SM_CYSCREEN', 'プライマリモニタの画面全体の高さを取得します。'); FAddElement('nIndex: SM_CXSIZE', 'ウィンドウのタイトルバー内のボタンの幅を取得します。'); FAddElement('nIndex: SM_CYSIZE', 'ウィンドウのタイトルバー内のボタンの高さを取得します。'); FAddElement('nIndex: SM_CXSIZEFRAME', 'サイズ変更可能なウィンドウの枠の幅を取得します。SM_CXFRAMEと同じです。'); FAddElement('nIndex: SM_CYSIZEFRAME', 'サイズ変更可能なウィンドウの枠の高さを取得します。SM_CYFRAMEと同じです。'); FAddElement('nIndex: SM_CXSMICON', '小アイコンの推奨サイズの幅を取得します。'); FAddElement('nIndex: SM_CYSMICON', '小アイコンの推奨サイズの高さを取得します。'); FAddElement('nIndex: SM_CXSMSIZE', 'タイトルバー内の小さいボタンのサイズの幅を取得します。'); FAddElement('nIndex: SM_CYSMSIZE', 'タイトルバー内の小さいボタンのサイズの高さを取得します。'); FAddElement('nIndex: SM_CXVIRTUALSCREEN', '仮想画面の幅を取得します。'); FAddElement('nIndex: SM_CYVIRTUALSCREEN', '仮想画面の高さを取得します。'); FAddElement('nIndex: SM_CXVSCROLL', '垂直スクロールバーの幅を取得します。'); FAddElement('nIndex: SM_CYVSCROLL', '垂直スクロールバーの矢印の高さを取得します。'); FAddElement('nIndex: SM_CYCAPTION', '通常のタイトルバーの高さを取得します。'); FAddElement('nIndex: SM_CYKANJIWINDOW', '画面下の漢字ウィンドウの高さを取得します。'); FAddElement('nIndex: SM_CYMENU', '1行分のメニューバーの高さを取得します。'); FAddElement('nIndex: SM_CYSMCAPTION', '小さなタイトルバーの高さを取得します。'); FAddElement('nIndex: SM_CYVTHUMB', '垂直スクロールバーのスクロールボックス(つまみ)の高さを取得します。'); FAddElement('nIndex: SM_DBCSENABLED', 'ダブルバイト文字セット(DBCS)のUser.exeがインストールされていればTRUEが、されていなければFALSEが返ります。'); FAddElement('nIndex: SM_DEBUG', 'デバッグ版のUser.exeがインストールされていればTRUEが、されていなければFALSEが返ります。'); FAddElement('nIndex: SM_IMMENABLED', 'IME機能が有効になっていればTRUEが、なっていなければFALSEが帰ります。'); FAddElement('nIndex: SM_IMMENABLED', 'システムがUnicodeベースのアプリケーションで、UnicodeベースのIMEを使う準備ができていればTRUEが、されていなければFALSEが返ります。'); FAddElement('nIndex: SM_MENUDROPALIGNMENT', 'メニューバーの項目に対してドロップダウンメニューを右寄せする場合はTRUEが、そうでなければFALSEが返ります。'); FAddElement('nIndex: SM_MIDEASTENABLED', 'ヘブライ語やアラビア語(右から左へ表示)が利用可能なシステムであればTRUEが、そうでなければFALSEが返ります。'); FAddElement('nIndex: SM_MOUSEPRESENT', 'マウスが接続されていればTRUEが、そうでなければFALSEが返ります。'); FAddElement('nIndex: SM_MOUSEWHEELPRESENT', 'ホイール付きマウスが接続されていればTRUEが、そうでなければFALSEが返ります。'); FAddElement('nIndex: SM_NETWORK', 'ネットワークが存在すれば最下位ビットに1の値が、存在しなければ最下位ビットに0の値が返ります。他のビットは将来の使用に備えて予約されています。'); FAddElement('nIndex: SM_PENWINDOWS', 'Windows for Pen computing extensionsがインストールされていればTRUEが、そうでなければFALSEが返ります。'); FAddElement('nIndex: SM_REMOTESESSION', 'この値はTerminal Services環境で使うことを意図おり、呼び出し側プロセスがTerminal Servicesのクライアントセッションに関連付けられている場合はTRUEが、コンソールセッションに関連付けられている場合はFALSEが返ります。'); FAddElement('nIndex: SM_SECURE', 'セキュリティが存在していればTRUEが、そうでなければFALSEが返ります。'); FAddElement('nIndex: SM_SAMEDISPLAYFORMAT', '複数のモニタが存在する場合、すべてのモニタが同じカラーフォーマットを使っていればTRUEが、そうでなければ0が返ります。'); FAddElement('nIndex: SM_SHOWSOUNDS', 'ユーザー補助機能の[サウンド解説を使う]が有効になっていればTRUE、そうでなければFALSEが返ります。'); FAddElement('nIndex: SM_SLOWMACHINE', 'コンピュータのプロセッサが遅い場合はTRUEが、それ以外の場合はFALSEが返ります。'); FAddElement('nIndex: SM_SWAPBUTTON', '左右のマウスボタンの機能を交換していればTRUEが、交換していなければFALSEが返ります。'); FAddElement('nIndex: SM_XVIRTUALSCREEN', '仮想画面の座標の左端の値を取得します。'); FAddElement('nIndex: SM_YVIRTUALSCREEN', '仮想画面の座標の上端の値を取得します。'); end else begin //値のみ初期化 FClearValue; end; _AddArrangeValue(GetSystemMetrics(SM_ARRANGE)); //最小化ウィンドウの配置方法を示す値を取得します。 _AddCleanBootValue(GetSystemMetrics(SM_CLEANBOOT)); //システムがどのように起動されたかを示す値を取得します。 FAddIntValue(GetSystemMetrics(SM_CMONITORS)); //デスクトップ上のモニタの数を取得します。 FAddIntValue(GetSystemMetrics(SM_CMOUSEBUTTONS)); //マウスボタンの数(マウスがないときは0)を取得します。 FAddIntValue(GetSystemMetrics(SM_CXBORDER)); //立体効果のないウィンドウの境界線の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYBORDER)); //立体効果のないウィンドウの境界線の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXCURSOR)); //マウスカーソルの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYCURSOR)); //マウスカーソルの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXDLGFRAME)); //タイトルバーがありサイズが変更できないウィンドウの枠の幅を取得します。SM_CXFIXEDFRAMEと同じです。 FAddIntValue(GetSystemMetrics(SM_CYDLGFRAME)); //タイトルバーがありサイズが変更できないウィンドウの枠の高さを取得します。SM_CYFIXEDFRAMEと同じです。 FAddIntValue(GetSystemMetrics(SM_CXDOUBLECLK)); //ダブルクリックと認識される範囲の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYDOUBLECLK)); //ダブルクリックと認識される範囲の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXDRAG)); //ドラッグの開始と見なされない範囲の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYDRAG)); //ドラッグの開始と見なされない範囲の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXEDGE)); //立体効果付きのウィンドウの境界線の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYEDGE)); //立体効果付きのウィンドウの境界線の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXFIXEDFRAME)); //タイトルバーがありサイズが変更できないウィンドウの枠の幅を取得します。SM_CXDLGFRAMEと同じです。 FAddIntValue(GetSystemMetrics(SM_CYFIXEDFRAME)); //タイトルバーがありサイズが変更できないウィンドウの枠の高さを取得します。SM_CYDLGFRAMEと同じです。 FAddIntValue(GetSystemMetrics(SM_CXFRAME)); //サイズ変更可能なウィンドウの枠の幅を取得します。SM_CXSIZEFRAMEと同じです。 FAddIntValue(GetSystemMetrics(SM_CYFRAME)); //サイズ変更可能なウィンドウの枠の高さを取得します。SM_CYSIZEFRAMEと同じです。 FAddIntValue(GetSystemMetrics(SM_CXFULLSCREEN)); //プライマリモニタの最大化ウィンドウのクライアント領域の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYFULLSCREEN)); //プライマリモニタの最大化ウィンドウのクライアント領域の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXHSCROLL)); //水平スクロールバーの矢印の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYHSCROLL)); //水平スクロールバーの矢印の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXHTHUMB)); //水平スクロールバーのスクロールボックス(つまみ)の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CXICON)); //アイコンの既定の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYICON)); //アイコンの既定の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXICONSPACING)); //アイコンを整列するときに使われるグリッドの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYICONSPACING)); //アイコンを整列するときに使われるグリッドの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXMAXIMIZED)); //プライマリモニタの最大化ウィンドウの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYMAXIMIZED)); //プライマリモニタの最大化ウィンドウの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXMAXTRACK)); //タイトルバーがありサイズが変更できないウィンドウの最大の幅を取得します。このサイズはデスクトップ全体に相当します。 FAddIntValue(GetSystemMetrics(SM_CYMAXTRACK)); //タイトルバーがありサイズが変更できないウィンドウの最大の高さを取得します。このサイズはデスクトップ全体に相当します。 FAddIntValue(GetSystemMetrics(SM_CXMENUCHECK)); //メニューのチェックマークの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYMENUCHECK)); //メニューのチェックマークの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXMENUSIZE)); //MDIの子ウィンドウの[閉じる]ボタンなどのタイトルバーに表示されるボタンの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYMENUSIZE)); //MDIの子ウィンドウの[閉じる]ボタンなどのタイトルバーに表示されるボタンの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXMIN)); //ウィンドウの最小サイズの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYMIN)); //ウィンドウの最小サイズの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXMINIMIZED)); //最小化ウィンドウの通常のサイズの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYMINIMIZED)); //最小化ウィンドウの通常のサイズの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXMINSPACING)); //最小化ウィンドウの配置に使われるグリッドの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYMINSPACING)); //最小化ウィンドウの配置に使われるグリッドの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXMINTRACK)); //ウィンドウの最小トラッキングサイズの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYMINTRACK)); //ウィンドウの最小トラッキングサイズの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXSCREEN)); //プライマリモニタの画面全体の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYSCREEN)); //プライマリモニタの画面全体の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXSIZE)); //ウィンドウのタイトルバー内のボタンの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYSIZE)); //ウィンドウのタイトルバー内のボタンの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXSIZEFRAME)); //サイズ変更可能なウィンドウの枠の幅を取得します。SM_CXFRAMEと同じです。 FAddIntValue(GetSystemMetrics(SM_CYSIZEFRAME)); //サイズ変更可能なウィンドウの枠の高さを取得します。SM_CYFRAMEと同じです。 FAddIntValue(GetSystemMetrics(SM_CXSMICON)); //小アイコンの推奨サイズの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYSMICON)); //小アイコンの推奨サイズの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXSMSIZE)); //タイトルバー内の小さいボタンのサイズの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYSMSIZE)); //タイトルバー内の小さいボタンのサイズの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXVIRTUALSCREEN)); //仮想画面の幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYVIRTUALSCREEN)); //仮想画面の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CXVSCROLL)); //垂直スクロールバーの幅を取得します。 FAddIntValue(GetSystemMetrics(SM_CYVSCROLL)); //垂直スクロールバーの矢印の高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CYCAPTION)); //通常のタイトルバーの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CYKANJIWINDOW)); //画面下の漢字ウィンドウの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CYMENU)); //1行分のメニューバーの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CYSMCAPTION)); //小さなタイトルバーの高さを取得します。 FAddIntValue(GetSystemMetrics(SM_CYVTHUMB)); //垂直スクロールバーのスクロールボックス(つまみ)の高さを取得します。 _AddBoolValue(GetSystemMetrics(SM_DBCSENABLED)); //ダブルバイト文字セット(DBCS)のUser.exeがインストールされていればTRUEが、されていなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_DEBUG)); //デバッグ版のUser.exeがインストールされていればTRUEが、されていなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_IMMENABLED)); //IME機能が有効になっていればTRUEが、なっていなければFALSEが帰ります。 _AddBoolValue(GetSystemMetrics(SM_IMMENABLED)); //システムがUnicodeベースのアプリケーションで、UnicodeベースのIMEを使う準備ができていればTRUEが、されていなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_MENUDROPALIGNMENT)); //メニューバーの項目に対してドロップダウンメニューを右寄せする場合はTRUEが、そうでなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_MIDEASTENABLED)); //ヘブライ語やアラビア語(右から左へ表示)が利用可能なシステムであればTRUEが、そうでなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_MOUSEPRESENT)); //マウスが接続されていればTRUEが、そうでなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_MOUSEWHEELPRESENT)); //ホイール付きマウスが接続されていればTRUEが、そうでなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_NETWORK)); //ネットワークが存在すれば最下位ビットが1の値が、存在しなければ最下位ビットが0の値が返ります。他のビットは将来の使用に備えて予約されています。 _AddBoolValue(GetSystemMetrics(SM_PENWINDOWS)); //Windows for Pen computing extensionsがインストールされていればTRUEが、そうでなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_REMOTESESSION)); //この値はTerminal Services環境で使うことを意図おり、呼び出し側プロセスがTerminal Servicesのクライアントセッションに関連付けられている場合はTRUEが、コンソールセッションに関連付けられている場合はFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_SECURE)); //セキュリティが存在していればTRUEが、そうでなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_SAMEDISPLAYFORMAT)); //複数のモニタが存在する場合、すべてのモニタが同じカラーフォーマットを使っていればTRUEが、そうでなければ0が返ります。 _AddBoolValue(GetSystemMetrics(SM_SHOWSOUNDS)); //ユーザー補助機能の[サウンド解説を使う]が有効になっていればTRUE、そうでなければFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_SLOWMACHINE)); //コンピュータのプロセッサが遅い場合はTRUEが、それ以外の場合はFALSEが返ります。 _AddBoolValue(GetSystemMetrics(SM_SWAPBUTTON)); //左右のマウスボタンの機能を交換していればTRUEが、交換していなければFALSEが返ります。 FAddIntValue(GetSystemMetrics(SM_XVIRTUALSCREEN)); //仮想画面の座標の左端の値を取得します。 FAddIntValue(GetSystemMetrics(SM_YVIRTUALSCREEN)); //仮想画面の座標の上端の値を取得します。 end; (* procedure T_MyAPIValue.FSystemParametersInfo; const lcs_DECLARATION = 'BOOL SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni );'; lcs_DESCRIPTION = 'システム全体に関するパラメータのいずれかを取得または設定しますが、このテストでは取得のみをテストします。。' + lcsTITLE_CRLF + 'uiAction 取得または設定するべきシステム全体のパラメータを指定します。後述する値のいずれかを指定します。 ' + lcsCRLF + 'uiParam uiActionパラメータで指定した問い合わせ対象に応じた値を指定します。特に指示がない場合0を指定してください。' + lcsCRLF + 'pvParam uiActionパラメータで指定した問い合わせ対象に応じた値を指定します。特に指示がない場合NULLを指定してください。' + lcsCRLF + 'fWinIni システムパラメータを設定する際に使われます。取得の場合は0を指定します。' + lcsCRLF + 'uiActionには以下の値のどれかを指定します。' + lcsCRLF + 'ユーザー補助のフラグ' + lcsCRLF + 'SPI_GETACCESSTIMEOUT ユーザー補助を無効にする時間を取得します。ACCESSTIMEOUT構造体のサイズを指定します。 pvParamパラメータに 構造体へのポインタを指定します。関数から制御が返るとこの構造体にユーザー補助のタイムアウト時間に関する情報が格納されます。ACCESSTIMEOUT 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(ACCESSTIMEOUT) を指定します。 SPI_GETFILTERKEYS ユーザー補助のフィルタキーに関する情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、フィルタキーに関する情報が格納されます。FILTERKEYS 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(FILTERKEYS) を指定します。 SPI_GETHIGHCONTRAST Windows 95/98 と Windows 2000:ユーザー補助のハイコントラスト機能に関する情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、ハイコントラスト機能に関する情報が格納されます。HIGHCONTRAST 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(HIGHCONTRAST) を指定します。 SPI_GETMOUSEKEYS ユーザー補助のマウスキーに関する情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、マウスキーに関する情報が格納されます。MOUSEKEYS 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(MOUSEKEYS) を指定します。 SPI_GETSCREENREADER Windows 95/98 と Windows 2000:スクリーンリーダー(スクリーンレビューアユーティリティとも呼びます)が動作しているかどうかを調べます。スクリーンリーダーは、文字情報をスピーチシンセサイザや点字ディスプレイなどのデバイスへ送信します。このフラグが指定されている場合、アプリケーションは、通常はグラフィックで表示される情報を、テキスト形式で提供するべきです。 pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。スクリーンリーダーが動作している場合はこの変数に 0 以外の値(TRUE)が、それ以外の場合は 0(FALSE)が格納されます。 SPI_GETSERIALKEYS Windows 95/98:ユーザー補助のシリアルキーデバイスに関する情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、シリアルキーデバイスに関する情報が格納されます。SERIALKEYS 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(SERIALKEYS) を指定します。 Windows NT/2000:サポートされていません。 SPI_GETSHOWSOUNDS ユーザー補助の「サウンド解説を使う」が有効になっているかどうかを調べます。この機能がオンになっている場合、通常は情報をサウンドでのみ提供する状況で、その情報を画面に表示するようユーザーが要求していることを意味します。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。この機能が有効になっている場合はこの変数に TRUE が、無効になっている場合は FALSE が格納されます。 この関数でこの値を指定すると、GetSystemMetrics (SM_SHOWSOUNDS) を呼び出した場合と同じ結果が得られます。後者の方法が推奨されています。 SPI_GETSOUNDSENTRY ユーザー補助のサウンド表示に関する情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、サウンド表示に関する情報が格納されます。SOUNDSENTRY 構造体の cbSize メンバと、この関数の uiParam パラメータで、sizeof(SOUNDSENTRY) を指定します。 SPI_GETSTICKYKEYS ユーザー補助の固定キーに関する情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、固定キーに関する情報が格納されます。STICKYKEYS 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(STICKYKEYS) を指定します。 SPI_GETTOGGLEKEYS ユーザー補助の切り替え(トグル)キーに関する情報を取得します。pvParam パラメータで、 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、切り替えキーに関する情報が格納されます。関数を呼び出す前に、TOGGLEKEYS 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(TOGGLEKEYS) を指定します。 SPI_SETACCESSTIMEOUT ユーザー補助機能に関連付けられているタイムアウト時間に関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(ACCESSTIMEOUT) を指定します。 SPI_SETFILTERKEYS ユーザー補助のフィルタキーに関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(FILTERKEYS) を指定します。 SPI_SETHIGHCONTRAST Windows 95/98 と Windows 2000:ユーザー補助のハイコントラスト機能に関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(HIGHCONTRAST) を指定します。 SPI_SETMOUSEKEYS ユーザー補助のマウスキーに関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(MOUSEKEYS) を指定します。 SPI_SETSCREENREADER Windows 95/98 と Windows 2000:スクリーンリーダー(スクリーンレビューアユーティリティとも呼びます)を動作させるかどうかを設定します。uiParam パラメータで、動作させる場合は 0 以外の値(TRUE)を、動作させない場合は 0(FALSE)を指定します。 SPI_SETSERIALKEYS Windows 95/98:ユーザー補助のシリアルキーデバイスに関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(SERIALKEYS) を指定します。 Windows NT/2000:サポートされていません。 SPI_SETSHOWSOUNDS ユーザー補助の「サウンド解説を使う」を有効または無効に設定します。uiParam パラメータで、この機能を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 SPI_SETSOUNDSENTRY ユーザー補助のサウンド表示に関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(SOUNDSENTRY) を指定します。 SPI_SETSTICKYKEYS ユーザー補助の固定キーに関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(STICKYKEYS) を指定します。 SPI_SETTOGGLEKEYS ユーザー補助のトグルキーに関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(TOGGLEKEYS) を指定します。 デスクトップのフラグは、次のとおりです。 デスクトップのフラグ 意味 SPI_GETDESKWALLPAPER Windows 2000:デスクトップの壁紙として表示されるビットマップのフルパス名を取得します。pvParam パラメータで、1 個のバッファへのポインタを指定します。関数から制御が返ると、このバッファに、フルパス名を表す、NULL で終わる文字列が格納されます。uiParam パラメータで、pvParam パラメータが指すバッファのサイズを文字数単位で指定します。取得される文字列は、MAX_PATH 文字以内です。デスクトップの壁紙が指定されていない場合、空文字列が取得されます。 SPI_GETFONTSMOOTHING フォントスムージング機能(スクリーンフォントの縁をなめらかにする機能)が有効になっているかどうかを調べます。この機能を有効にすると、フォントの境界を通常とは異なるグレースケールで表示することによってアンチエイリアシングを行い、フォントの曲線を滑らかに見せます。 pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。スムージング機能が有効になっている場合はこの変数に 0 以外の値(TRUE)が、それ以外の場合は 0(FALSE)が格納されます。 Windows 95:SPI_GETFONTSMOOTHING フラグは、Microsoft Plus!が既にインストールされている場合にのみ使えます。詳細については、この関数の最後の方にある「Windows 95/98 のフラグ」の表の SPI_GETWINDOWSEXTENSION を参照してください。 SPI_GETWORKAREA プライマリモニタの作業領域のサイズを取得します。作業領域とは、画面全体からシステムのタスクバーやアプリケーションのツールバーが占有する領域を除いた部分を意味します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、仮想画面の座標に基づく、作業領域の座標が格納されます。 プライマリモニタ以外のモニタの作業領域を取得するには、 関数を使います。 SPI_SETCURSORS システムカーソルを再ロードします。uiParam パラメータで 0 を、pvParam パラメータで NULL を指定してください。 SPI_SETDESKPATTERN Win.ini ファイルの Pattern= エントリを読み込むよう Windows に指示し、デスクトップのパターンを設定します。 SPI_SETDESKWALLPAPER デスクトップに表示される壁紙を設定します。pvParam パラメータの値に基づいて、新しい壁紙が決まります。壁紙のビットマップを指定するには、pvParam パラメータで、ビットマップファイルの名前を表す、NULL で終わる文字列へのポインタを指定します。pvParam パラメータで空の文字列("")を指定すると、壁紙は表示されなくなります。pvParam パラメータで SETWALLPAPER_DEFAULT または NULL を指定すると、既定の壁紙へ戻ります。 SPI_SETFONTSMOOTHING フォントスムージング機能(スクリーンフォントの縁をなめらかにする機能)を有効または無効にします。この機能を有効にすると、フォントの境界を通常とは異なるグレースケールで表示することによってアンチエイリアシングを行い、フォントの曲線を滑らかに見せます。 この機能を有効にする場合は uiParam パラメータで 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 Windows 95:SPI_SETFONTSMOOTHING フラグは、Microsoft Plus!が既にインストールされている場合にのみ使えます。詳細については、この関数の最後の方にある「Windows 95/98 のフラグ」の表の SPI_GETWINDOWSEXTENSION を参照してください。 SPI_SETWORKAREA 作業領域のサイズを設定します。作業領域とは、画面全体からシステムのタスクバーやアプリケーションのツールバーが占有する領域を除いた部分を意味します。pvParam パラメータで、仮想画面の座標に基づく、設定するべき作業領域の座標を保持している、1 個の 構造体へのポインタを指定します。マルチモニタのシステムでは、この関数は、指定された長方形を保持しているモニタの作業領域を設定します。 パラメータで NULL を指定すると、この関数はプライマリモニタの作業領域を画面全体に設定します。 アイコンのフラグは、次のとおりです。 アイコンのフラグ 意味 SPI_GETICONMETRICS アイコンに関連付けられているメトリックを取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、アイコンのメトリックに関する情報が格納されます。ICONMETRICS 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(ICONMETRICS) を指定します。 SPI_GETICONTITLELOGFONT アイコンのタイトルのフォントに関する論理フォント情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、論理フォントの情報が格納されます。uiParam パラメータで、sizeof(LOGFONT) を指定します。 SPI_GETICONTITLEWRAP アイコンタイトルの折り返しが有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。折り返しが有効になっている場合はこの変数に 0 以外の値(TRUE)が、それ以外の場合は 0(FALSE)が格納されます。 SPI_ICONHORIZONTALSPACING アイコンを整列するときに使われるグリッドの幅をピクセル単位で設定または取得します。アイコンの一覧を表示するときに、システムはこの幅を使います。 この値を設定する場合は、uiParam パラメータで新しい値を、pvParam パラメータで NULL を指定します。SM_CXICON 未満の値を指定することはできません。 この値を取得する場合は、pvParam パラメータで 1 個の整数型変数を指定します。関数から制御が返ると、この変数に、現在の値が格納されます。 SPI_ICONVERTICALSPACING アイコンを整列するときに使われるグリッドの高さを設定または取得します。 この値を設定する場合は、uiParam パラメータで新しい値を、pvParam パラメータで NULL を指定します。SM_CYICON 未満の値を指定することはできません。 この値を取得する場合は、pvParam パラメータで 1 個の整数型変数を指定します。関数から制御が返ると、この変数に、現在の値が格納されます。 SPI_SETICONMETRICS アイコンに関連付けられるメトリックを設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(ICONMETRICS) を指定します。 SPI_SETICONS システムアイコンを再ロードします。uiParam パラメータで 0、pvParam パラメータで NULL を指定してください。 SPI_SETICONTITLELOGFONT アイコンのタイトルを表示するために使われるフォントを設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。uiParam パラメータで、sizeof(LOGFONT) を指定します。 SPI_SETICONTITLEWRAP アイコンタイトルの折り返しを有効または無効にします。折り返しを有効にする場合は uiParam パラメータで 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 入力フラグは次のとおりです。キーボード、マウス、入力言語、警告のビープ音に関係するフラグが含まれています。 入力フラグ 意味 SPI_GETBEEP 警告のビープ音がオンになっているかどうかを調べます。 pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。ビープ音がオンになっている場合はこの変数に 0 以外の値(TRUE)が、オフになっている場合は 0(FALSE)が格納されます。 SPI_GETDEFAULTINPUTLANG システムの既定の入力言語を表す入力ロケール識別子(キーボードレイアウト)を取得します。pvParam パラメータで、1 個の HKL 型変数へのポインタを指定します。関数から制御が返ると、この変数に、入力ロケール識別子が格納されます。詳細については、MSDN ライブラリの「」を参照してください。 SPI_GETKEYBOARDCUES Windows 98 と Windows 2000:メニューアクセスキーに、必ず下線を付けるかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、メニューアクセスキーに必ず下線を付ける場合はこの変数に 0 以外の値(TRUE)が、キーボードからメニューを呼び出したときのみ下線を付ける場合は 0(FALSE)が格納されます。 SPI_GETKEYBOARDDELAY キーボードのプロパティの「表示までの待ち時間」を取得します。0(リピート入力を開始するまで約 250ms の待ち時間)〜3(約 1 秒の待ち時間)の範囲で値が規定されています。各値に対応する実際の待ち時間は、ハードウェアによって異なることがあります。pvParam パラメータで、1 個の整数型変数へのポインタを指定します。関数から制御が返ると、この変数に、待ち時間を示す値が格納されます。 SPI_GETKEYBOARDPREF Windows 95/98 と Windows 2000:ユーザー補助の「アプリケーションにキーボードのヘルプを追加する」(または「プログラムで追加のキーボードヘルプを表示する」)が有効になっているかどうかを調べます。これは、ユーザーがマウスではなく主にキーボードを使っていて、通常では表示されないキーボードインターフェイスを表示するようアプリケーションに要求していることを意味します。pvParam パラメータで、、1 個の BOOL 型変数へのポインタを指定します。この機能が有効になっている場合はこの変数に 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。 SPI_GETKEYBOARDSPEED キーボードのプロパティの「表示の間隔」を取得します。0(1 秒につき約 2.5 回のリピート入力)〜31(1 秒につき約 30 回のリピート入力)の範囲で値が規定されています。実際のリピート入力回数はハードウェアによって異なり、線形のスケールとは最大 20% の違いがあります。pvParam パラメータで、1 個の DWORD 型変数へのポインタを指定します。関数から制御が返ると、この変数に、リピート回数を示す値が格納されます。 SPI_GETMOUSE マウスカーソルの移動速度と、アクセラレーションに関する 2 つのしきい値を取得します。pvParam パラメータで、3 つの要素からなる 1 つの整数型配列へのポインタを指定します。関数から制御が返ると、この配列に、これらの情報が格納されます。詳細については、 の説明を参照してください。 SPI_GETMOUSEHOVERHEIGHT Windows 98 と Windows NT4.0 以降: 関数が メッセージを生成するためにマウスカーソルがとどまっていなければならない範囲の高さを取得します。pvParam パラメータで、1 個の UINT 型変数へのポインタを指定します。関数から制御が返ると、この変数に、高さが格納されます。 SPI_GETMOUSEHOVERTIME Windows 98 と Windows NT 4.0 以降:TrackMouseEvent 関数が WM_MOUSEHOVER メッセージを生成するために、マウスカーソルがとどまっていなければならない時間をミリ秒(ms)単位で取得します。pvParam パラメータで、1 個の UNIT 型変数へのポインタを指定します。関数から制御が返ると、この変数に、時間が格納されます。 SPI_GETMOUSEHOVERWIDTH Windows 98 と Windows NT 4.0 以降: 関数が WM_MOUSEHOVER メッセージを生成するために、マウスカーソルがとどまっていなければならない範囲の幅を取得します。pvParam パラメータで、1 個の UINT 型変数へのポインタを指定します。関数から制御が返ると、この変数に、幅が格納されます。 SPI_GETMOUSESPEED Windows 98 と Windows 2000:マウスの現在の速度を取得します。マウスの速度は、マウスの移動距離に応じて、ポインタを移動させるべき距離を決定します。pvParame パラメータで、1 個の INT 型変数へのポインタを指定します。関数から制御が返ると、この変数に、1(最も遅い)〜20(最も速い)の範囲の値が格納されます。既定の値は 10 です。エンドユーザーはコントロールパネルの「マウス」を使ってこの値を設定できますし、アプリケーションもこの関数で SPI_SETMOUSESPEED フラグを指定すると同様にこの値を設定できます。 SPI_GETMOUSETRAILS Windows 95/98:マウスポインタの軌跡を表示する機能が有効になっているかどうかを調べます。この機能が有効な場合、マウスの軌跡が短時間だけ表示され、すぐに消去されるので、マウスカーソルの移動状況を把握しやすくなります。 pvParam パラメータで、1 個の INT 型変数へのポインタを指定します。関数から制御が返ると、軌跡を表示しない場合はこの変数に 0 または 1 が、軌跡を表示する場合は 2 以上の値が格納されます。2 以上の値は、描画される軌跡の数を示します。uiParam パラメータは使いません。 Windows NT/2000:サポートされていません。 SPI_GETSNAPTODEFBUTTON Windows 98 と Windows NT 4.0 以降:マウスカーソルを既定のボタンへ自動的に移動させる機能が有効になっているかどうかを調べます。この機能が有効になっている場合、ダイアログボックス内の[OK]や[適用]のような既定のボタンへマウスカーソルが自動的に移動します。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。関数から制御が返ると、この機能が有効になっている場合はこの変数に 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。 SPI_GETWHEELSCROLLLINES Windows 98 と Windows NT 4.0 以降:マウスホイールを回転させたときにスクロールされる行数を取得します。pvParam パラメータで、1 個の UINT 型変数へのポインタを指定します。関数から制御が返ると、この変数に、行数が格納されます。既定の値は 3 です。 SPI_SETBEEP 警告のビープ音をオンまたはオフにします。uiParam パラメータで、ビープ音をオンにする場合は 0 以外の値(TRUE)を、オフにする場合は 0(FALSE)を指定します。 SPI_SETDEFAULTINPUTLANG システムのシェルとアプリケーションが利用する、既定の入力言語を設定します。現在のシステム文字セットを使って表示できる言語を指定しなければなりません。pvParam パラメータで、既定の言語の入力ロケール識別子(キーボードレイアウト)を保持している 1 個の HKL 型変数を指定します。詳細については、MSDN ライブラリの「」を参照してください。 SPI_SETDOUBLECLICKTIME マウスのダブルクリック時間を設定します。uiParam パラメータで、設定するべき時間をミリ秒(ms)単位で指定します。ダブルクリック時間とは、マウスを 1 回目にクリックしてから 2 回目にクリックするまでの時間の最大値を規定するもので、この時間以内にマウスを 2 回クリックすると、ダブルクリックが行われたものと見なします。 関数を使って、ダブルクリック時間を設定することもできます。現在のダブルクリック時間を取得するには、 関数を使います。 SPI_SETDOUBLECLKHEIGHT ダブルクリック操作を行う際に、最初のクリックが発生したときのカーソル(マウスカーソル)の位置を基準として、2 回目のクリック位置の許容範囲の高さを設定します。uiParam パラメータで、設定するべき高さを指定します。 1 回目のクリックの後、この許容範囲内でもう一度マウスをクリックすると、ダブルクリックが行われたものと見なされます。 ダブルクリック範囲を表す長方形の高さを取得するには、SM_CYDOUBLECLK フラグを指定して GetSystemMetrics 関数を呼び出します。 SPI_SETDOUBLECLKWIDTH ダブルクリック操作を行う際に、最初のクリックが発生したときのカーソル(マウスカーソル)の位置を基準として、2 回目のクリック位置の許容範囲の幅を設定します。uiParam パラメータで、設定するべき幅を指定します。 1 回目のクリックの後、この許容範囲内でもう一度マウスをクリックすると、ダブルクリックが行われたものと見なされます。 ダブルクリック範囲を表す長方形の幅を取得するには、SM_CXDOUBLECLK フラグを指定して GetSystemMetrics 関数を呼び出します。 SPI_SETKEYBOARDCUES Windows 98 と Windows 2000:メニューアクセスキーを表す文字に必ず下線を付けるかどうかを設定します。pvParam パラメータで、1 個の BOOL 型変数を指定します。メニューアクセスキーに必ず下線を付ける場合はこの変数で 0 以外の値(TRUE)を、キーボードからメニューを呼び出したときのみ下線を付ける場合は 0(FALSE)を指定します。 SPI_SETKEYBOARDDELAY キーボードのプロパティの「表示までの待ち時間」を設定します。uiParam パラメータで、0、1、2、3 のいずれかの値を指定します。0 は最短の待ち時間(リピート入力を開始するまで約 250ms の待ち時間)、3 は最長の待ち時間(約 1 秒の待ち時間)を設定します。各値に対応する実際の待ち時間は、ハードウェアによって異なることがあります。 SPI_SETKEYBOARDPREF Windows 95/98 と Windows 2000:ユーザー補助の「アプリケーションにキーボードのヘルプを追加する」(または「プログラムで追加のキーボードヘルプを表示する」)を設定します。ユーザーがマウスではなく主にキーボードを使っていて、通常は表示されていないキーボードのヘルプを追加するようアプリケーションに要求している場合は uiParam パラメータで 0 以外の値(TRUE)を、追加しない場合は 0 (FALSE)を指定します。 SPI_SETKEYBOARDSPEED キーボードのプロパティの「表示の間隔」を設定します。uiParam パラメータで、0(1 秒につき約 2.5 回のリピート入力)〜31(1 秒につき約 30 回のリピート入力)の範囲で値を指定します。実際のリピート入力回数はハードウェアによって異なり、線形のスケールとは最大 20% の違いがあります。uiParam パラメータで 31 より大きい値を指定すると、リピート入力回数は 31 に設定されます。 SPI_SETLANGTOGGLE キーボードのプロパティの「言語の切り替え」を設定します。uiParam パラメータと pvParam パラメータを使いません。このフラグを使って値を設定した場合、この関数はレジストリをもう一度読み取って、「キーボードのプロパティ」の「言語」タブの表示を自動的に変更します。この関数でこのフラグを指定する前に、レジストリの適切なレジストリエントリを作成しておかなければなりません。レジストリエントリは、\HKEY_CURRENT_USER\keyboard layout\toggle で指定します。有効な値は、左 ALT+SHIFT キーを意味する 1、CTRL+SHIFT キーを意味する 2、何も設定しないことを意味する 3 のいずれかです。 SPI_SETMOUSE マウスカーソルの移動速度と、アクセラレーションに関する 2 つのしきい値を設定します。pvParam パラメータで、3 つの要素からなる 1 つの整数型配列へのポインタを指定します。この配列で、これらの情報を指定しておきます。詳細については、 の説明を参照してください。 SPI_SETMOUSEBUTTONSWAP 左右のマウスボタンの機能を交換するかどうかを設定します。ボタンの機能を交換する場合は uiParam パラメータで 0 以外の値(TRUE)を、交換しない場合は 0(FALSE)を指定します。 SPI_SETMOUSEHOVERHEIGHT Windows 98 と Windows NT 4.0 以降: 関数が WM_MOUSEHOVER メッセージを生成するために、マウスカーソルがとどまっていなければならない範囲の高さをピクセル単位で設定します。uiParam パラメータで、設定するべき新しい高さを指定します。 SPI_SETMOUSEHOVERTIME Windows 98 と Windows NT 4.0 以降:TrackMouseEvent 関数が WM_MOUSEHOVER メッセージを生成するために、マウスカーソルがとどまっていなければならない時間をミリ秒(ms)単位で設定します。TrackMouseEvent 関数の dwHoverTime パラメータで HOVER_DEFAULT を指定した場合にのみ、このフラグが使われます。uiParam パラメータで、設定するべき新しい時間を指定します。 SPI_SETMOUSEHOVERWIDTH Windows 98 と Windows NT 4.0 以降:TrackMouseEvent 関数が WM_MOUSEHOVER メッセージを生成するために、マウスカーソルがとどまっていなければならない範囲の幅をピクセル単位で設定します。uiParam パラメータで、設定するべき新しい幅を指定します。 SPI_SETMOUSESPEED Windows 98 と Windows 2000:マウスの現在の速度を設定します。pvParame パラメータで、1(最も遅い)〜20(最も速い)の範囲の値を保持している、1 個の整数を指定します。既定の値は 10 です。このフラグは主に、コントロールパネルの「マウス」を使って速度を設定するために使われます。 SPI_SETMOUSETRAILS Windows 95/98:マウスポインタの軌跡の表示を有効または無効にします。この機能が有効な場合、マウスの軌跡が短時間だけ表示され、すぐに消去されるので、マウスカーソルの移動状況を把握しやすくなります。 軌跡を表示しない場合は uiParam パラメータで 0 または 1 を、軌跡を表示する場合は描画するべき軌跡の数を意味する 2 以上の整数を指定します。 Windows NT/2000:サポートされていません。 SPI_SETSNAPTODEFBUTTON Windows 98 と Windows NT 4.0 以降:マウスカーソルを既定のボタンへ自動的に移動させる機能を有効または無効にします。この機能が有効になっている場合、ダイアログボックス内の[OK]や[適用]のような既定のボタンへマウスカーソルが自動的に移動します。この機能を有効にする場合は uiParam パラメータで 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。アプリケーションはダイアログボックスを表示する際に、 関数を使うべきです。その結果、ダイアログマネージャはマウスカーソルを正しい場所に配置できます。 SPI_SETWHEELSCROLLLINES Windows 98 と Windows NT 4.0 以降:マウスホイールを回転させたときにスクロールされる行数を設定します。uiParam パラメータで、設定するべき行数を指定します。 この行数は、修飾キーを使わずにマウスホイールを回転させた場合にスクロールさせるべき行数の推奨値を意味します。0 を指定した場合、ホイールを回転させてもスクロールを行いません。表示可能な行数より大きい数値を指定した場合や、特に WHEEL_PAGESCSOLL(Winuser.h 内で UINT_MAX と等しい値として定義されていますが、Limits.h 内で UINT_MAX は 0xffffffff、つまり 18,446,744,073,709,551,615;1,844 京;1,844 兆の 1 万倍と定義されています)を指定した場合、スクロール操作は、スクロールバーのページアップ領域またはページダウン領域を 1 回クリックした場合と同じ動作になります。 メニューのフラグは、次のとおりです。 メニューのフラグ 意味 SPI_GETMENUDROPALIGNMENT メニューバーの項目に対して、ドップダウンメニューに左寄せと右寄せのどちらを適用するかを示す値を取得します。pvParam パラメータでは、1 個の BOOL 型変数へのポインタを指定します。関数から制御が返ると、この変数に、右寄せの場合は 0 以外の値(TRUE)が、左寄せの場合は 0(FALSE)が格納されます。 SPI_GETMENUFADE Windows 2000:メニューのフェードアニメーションが有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。関数から制御が返ると、この変数に、フェードアニメーションが有効になっている場合は 0 以外の値(TRUE)、無効になっている場合は 0(FALSE)が格納されます。フェードアニメーションが無効になっている場合、メニューはスライドアニメーション形式で表示されます。メニューのアニメーション表示が有効になっていない場合、このフラグは無視されます。メニューのアニメーション表示を設定するには、この関数の SPI_SETMENUANIMATION フラグを使います。詳細については、MSDN ライブラリの 関数の説明を参照してください。 SPI_GETMENUSHOWDELAY Windows 95/98 と Windows NT 4.0 以降:マウスカーソルをサブメニューの項目に合わせた後、何 ms 後にショートカットメニューを表示する設定になっているのか調べます。pvParam パラメータで、1 個の DWORD 型変数へのポインタを指定します。関数から制御が返ると、この変数に、待ち時間が格納されます。 SPI_SETMENUDROPALIGNMENT メニューバーの項目に対して、ドロップダウンメニューを右寄せするかどうかを設定します。右寄せを適用する場合は uiParam パラメータで TRUE を、左寄せを適用する場合は FALSE を指定します。 SPI_SETMENUFADE Windows 2000:メニューのフェードアニメーションを有効または無効にします。メニューのフェードアニメーションを有効にする場合は pvParam パラメータで 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。フェードアニメーションが無効になっている場合、メニューはスライドアニメーション形式で表示されます。メニューのフェードアニメーションが有効になるのは、色深度が 256 色(8 ビット)以上の場合だけです。共に SET_MENUANIMATION を指定してメニューのアニメーション表示を有効にしておかない限り、SPI_SETMENUFADE フラグは無視されます。詳細については、MSDN ライブラリの 関数の説明を参照してください。 SPI_SETMENUSHOWDELAY Windows 95/98 と Windows NT 4.0 以降:マウスカーソルをサブメニューの項目に合わせた後、何 ms 後にショートカットメニューを表示するかを設定します。pvParam パラメータで、新しい待ち時間をミリ秒(ms)単位で指定します。 電力管理のフラグは、次のとおりです。コントロールパネルでは[電源管理]と表記されています。 電力管理のフラグ 意味 SPI_GETLOWPOWERACTIVE スクリーンの低消費電力モードが有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。関数から制御が返ると、この変数に、低消費電力モードが有効な場合は 0 以外の値(TRUE)が、無効な場合は 0(FALSE)が格納されます。 Windows 98:16 ビットアプリケーションと 32 ビットアプリケーションの両方が、このフラグをサポートしています。 Windows 95:16 ビットアプリケーションだけが、このフラグをサポートしています。 Windows NT/2000:Windows 2000 以降では、32 ビットアプリケーションがこのフラグをサポートしています。16 ビットアプリケーションは、このフラグをサポートしていません。 SPI_GETLOWPOWERTIMEOUT スクリーンの低消費電力モードのタイムアウト値(何も操作が行われていない状況で、低消費電力モードを有効にするまでの待ち時間)を取得します。pvParam パラメータで、1 個の INT 型変数へのポインタを指定します。関数から制御が返ると、この変数に、タイムアウト値が秒単位で格納されます。 Windows 98:16 ビットアプリケーションと 32 ビットアプリケーションの両方が、このフラグをサポートしています。 Windows 95:16 ビットアプリケーションだけが、このフラグをサポートしています。 Windows NT/2000:Windows 2000 以降では、32 ビットアプリケーションがこのフラグをサポートしています。16 ビットアプリケーションは、このフラグをサポートしていません。 SPI_GETPOWEROFFACTIVE スクリーンの電力停止モードが有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。関数から制御が返ると、この変数に、電力停止モードが有効な場合は 0 以外の値(TRUE)が、無効な場合は 0(FALSE)が格納されます。 Windows 98:16 ビットアプリケーションと 32 ビットアプリケーションの両方が、このフラグをサポートしています。 Windows 95:16 ビットアプリケーションだけが、このフラグをサポートしています。 Windows NT/2000:Windows 2000 以降では、32 ビットアプリケーションがこのフラグをサポートしています。16 ビットアプリケーションは、このフラグをサポートしていません。 SPI_GETPOWEROFFTIMEOUT スクリーンの電力停止モードのタイムアウト値(何も操作が行われていない状況で、電力停止モードを有効にするまでの待ち時間)を取得します。pvParam パラメータで、1 個の INT 型変数へのポインタを指定します。関数から制御が返ると、この変数に、タイムアウト値が秒単位で格納されます。 Windows 98:16 ビットアプリケーションと 32 ビットアプリケーションの両方が、このフラグをサポートしています。 Windows 95:16 ビットアプリケーションだけが、このフラグをサポートしています。 Windows NT/2000:Windows 2000 以降では、32 ビットアプリケーションがこのフラグをサポートしています。16 ビットアプリケーションは、このフラグをサポートしていません。 SPI_SETLOWPOWERACTIVE スクリーンの低消費電力モードを有効または無効にします。uiParam パラメータで、低消費電力モードを有効にする場合は 1 を、無効にする場合は 0 を指定します。pvParam パラメータで、NULL を指定します。 Windows 98:16 ビットアプリケーションと 32 ビットアプリケーションの両方が、このフラグをサポートしています。 Windows 95:16 ビットアプリケーションだけが、このフラグをサポートしています。 Windows NT/2000:Windows 2000 以降では、32 ビットアプリケーションがこのフラグをサポートしています。16 ビットアプリケーションは、このフラグをサポートしていません。 SPI_SETLOWPOWERTIMEOUT スクリーンの低消費電力モードのタイムアウト値(何も操作が行われていない状況で、低消費電力モードを有効にするまでの待ち時間)を設定します。uiParam パラメータで、タイムアウト値を秒単位で指定します。pvParam パラメータで、NULL を指定します。 Windows 98:16 ビットアプリケーションと 32 ビットアプリケーションの両方が、このフラグをサポートしています。 Windows 95:16 ビットアプリケーションだけが、このフラグをサポートしています。 Windows NT/2000:Windows 2000 以降では、32 ビットアプリケーションがこのフラグをサポートしています。16 ビットアプリケーションは、このフラグをサポートしていません。 SPI_SETPOWEROFFACTIVE スクリーンの電力停止モードを有効または無効にします。uiParam パラメータで、電力停止モードを有効にする場合は 1 を、無効にする場合は 0 を指定します。pvParam パラメータで、NULL を指定します。 Windows 98:16 ビットアプリケーションと 32 ビットアプリケーションの両方が、このフラグをサポートしています。 Windows 95:16 ビットアプリケーションだけが、このフラグをサポートしています。 Windows NT/2000:Windows 2000 以降では、32 ビットアプリケーションがこのフラグをサポートしています。16 ビットアプリケーションは、このフラグをサポートしていません。 SPI_SETPOWEROFFTIMEOUT スクリーンの電力停止モードの新しいタイムアウト値(何も操作が行われていない状況で、電力停止モードを有効にするまでの待ち時間)を設定します。uiParam パラメータで、新しいタイムアウト値を秒単位で設定します。pvParam パラメータで、NULL を指定します。 Windows 98:16 ビットアプリケーションと 32 ビットアプリケーションの両方が、このフラグをサポートしています。 Windows 95:16 ビットアプリケーションだけが、このフラグをサポートしています。 Windows NT/2000:Windows 2000 以降では、32 ビットアプリケーションがこのフラグをサポートしています。16 ビットアプリケーションは、このフラグをサポートしていません。 スクリーンセーバーのフラグは、次のとおりです。 スクリーンセーバーのフラグ 意味 SPI_GETSCREENSAVEACTIVE スクリーンセーバーが有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。関数から制御が返ると、この変数に、スクリーンセーバーが有効になっている場合は 0 以外の値(TRUE)が、それ以外の場合は 0(FALSE)が格納されます。 SPI_GETSCREENSAVERRUNNING Windows 98 と Windows 2000:呼び出し側プロセスのウィンドウステーションで、スクリーンセーバーが現在動作しているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。関数から制御が返ると、この変数に、スクリーンセーバーが現在動作している場合は 0 以外の値(TRUE)、それ以外の場合は 0(FALSE)が格納されます。スクリーンセーバーを動作させることができるのが、対話型のウィンドウステーションである "Winsta0" のみであることに注意してください。 SPI_GETSCREENSAVETIMEOUT スクリーンセーバーのタイムアウト時間(何も操作が行われていない状況で、スクリーンセーバーを実行するまでの待ち時間)を取得します。pvParam パラメータで、1 個の整数型変数へのポインタを指定します。関数から制御が返ると、この変数に、待ち時間が秒単位で格納されます。 SPI_SETSCREENSAVEACTIVE スクリーンセーバーを有効または無効にします。uiParam パラメータで、スクリーンセーバー有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 SPI_SETSCREENSAVERRUNNING Windows 95/98:内部で使われます。アプリケーションは、このフラグを使うべきではありません。 SPI_SETSCREENSAVETIMEOUT スクリーンセーバーのタイムアウト時間(何も操作が行われていない状況で、スクリーンセーバーを実行するまでの待ち時間)を設定します。uiParam パラメータで、設定するべき新しい待ち時間を秒単位で指定します。 UI 効果のパラメータは、次のとおりです。SPI_SETUIEFFECTS フラグを使うと、UI 効果のすべてのフラグを一度に有効または無効にできます。この表は、UI 効果に関係するすべてのフラグを示しています。 UI 効果のフラグ 意味 SPI_GETCOMBOBOXANIMATION Windows 98 と Windows 2000:コンボボックスのスライドオープン効果(コンボボックスを開く際に、小さな点から徐々に拡大する代わりに、スライドを横へ移動する形式で表示する)が有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、この効果が有効になっている場合は TRUE が、無効になっている場合は FALSE が格納されます。 SPI_GETCURSORSHADOW Windows 2000:カーソルの周りに影を表示する設定になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、影付き効果が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。システムの色深度が 256 色(8 ビット)以上である場合にのみ、この効果が表示されます。 SPI_GETGRADIENTCAPTIONS Windows 98 と Windows 2000:ウィンドウのタイトルバーでグラデーション効果が有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、この効果が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。グラデーション効果の詳細については、GetSysColor 関数を参照してください。 SPI_GETHOTTRACKING Windows 98 と Windows 2000:メニュー名やメニューバーのようなユーザーインターフェイス要素のホットトラッキングが有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、この機能が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。 ホットトラッキングとは、カーソルを特定の項目に重ねたときに、その項目が強調表示されるだけで、選択されないことを意味します。アプリケーションのユーザーインターフェイスでホットトラッキングを使うかどうか判断する目的で、このフラグを問い合わせることができます。 SPI_GETLISTBOXSMOOTHSCROLLING Windows 98 と Windows 2000:リストボックスのスムーズスクロール効果が有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、この効果が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。 SPI_GETMENUANIMATION Windows 98 と Windows 2000:メニューのアニメーション機能が有効になっているかどうかを調べます。これはメニューのアニメーション効果に関するマスタフラグであり、他のアニメーション効果を有効にするには、このフラグを有効にしておかなければなりません。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、アニメーション機能が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。 Windows 2000:アニメーション機能が有効になっている場合、SPI_GETMENUFADE フラグは、メニューを表示する際にフェードアニメーションとスライドアニメーションのどちらが使われているかを表します。 SPI_GETMENUUNDERLINES Windows 98 と Windows 2000:SPI_GETKEYBOARDCUES と同じことを意味します SPI_GETSELECTIONFADE Windows 2000:選択項目のフェード効果が有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、この効果が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。 選択項目のフェード効果を有効にすると、ユーザーがメニュー項目を選択したときに、メニューが消えた後、ほんの短い間だけそのメニュー項目が画面に残り、フェードアウトしてゆきます。 SPI_GETTOOLTIPANIMATION Windows 2000:ツールチップ(チップヘルプ)アニメーションが有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、この効果が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。ツールチップアニメーションが有効になっている場合、SPI_GETTOOLTIPFADE フラグは、ツールチップを表示する際にフェードアニメーションとスライドアニメーションのどちらが使われているかを表します。 SPI_GETTOOLTIPFADE Windows 2000:SPI_SETTOOLTIPANIMATION フラグが有効になっている場合、SPI_GETTOOLTIPFADE フラグは、ツールチップアニメーションを表示する際にフェード効果とスライド効果のどちらが使われているかを表します。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、フェードアニメーションが有効になっている場合は 0 以外の値(TRUE)が、スライドアニメーションが有効になっている場合は 0(FALSE)が格納されます。詳細については、MSDN ライブラリの 関数の説明を参照してください。 SPI_GETUIEFFECTS Windows 2000:すべての UI 効果が有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、すべての UI 効果が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。この表には、UI 効果に関連するすべてのフラグが掲載されています。 SPI_SETCOMBOBOXANIMATION Windows 98 と Windows 2000:コンボボックスのスライドオープン効果(コンボボックスを開く際に、小さな点から徐々に拡大する代わりに、スライドを横へ移動する形式で表示する)を有効または無効にします。pvParam パラメータで、スライドオープン効果を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 SPI_SETCURSORSHADOW Windows 2000:カーソルの周りに影を表示する効果を有効または無効にします。pvParam パラメータで、影付き効果を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。システムの色深度が 256 色(8 ビット)以上である場合にのみ、この効果が表示されます。 SPI_SETGRADIENTCAPTIONS Windows 98 と Windows 2000:ウィンドウのタイトルバーでグラデーション効果を有効または無効にします。pvParam パラメータで、グラデーション効果を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。グラデーション効果を利用できるのは、システムの色深度が 256 色(8 ビット)以上である場合のみです。グラデーション効果の詳細については、GetSysColor 関数を参照してください。 SPI_SETHOTTRACKING Windows 98 と Windows 2000:メニュー名やメニューバーのようなユーザーインターフェイス要素のホットトラッキングを有効または無効にします。pvParam パラメータで、ホットトラッキングを有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 ホットトラッキングとは、カーソルを特定の項目に重ねたときに、その項目が強調表示されるだけで、選択されないことを意味します。 SPI_SETLISTBOXSMOOTHSCROLLING Windows 98 と Windows 2000:リストボックスのスムーズスクロール効果を有効または無効にします。pvParam パラメータで、スムーズスクロール効果を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 SPI_SETMENUANIMATION Windows 98 と Windows 2000:メニューのアニメーション機能を有効または無効にします。これはメニューのアニメーション効果に関するマスタフラグであり、他のアニメーション効果を有効にするには、このフラグを有効にしておかなければなりません。pvParam パラメータで、メニューのアニメーション効果を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 Windows 2000:アニメーション機能が有効になっている場合、SPI_GETMENUFADE フラグは、メニューを表示する際にフェードアニメーションとスライドアニメーションのどちらが使われているかを表します。 SPI_SETMENUUNDERLINES Windows 98 と Windows 2000:SPI_SETKEYBOARDCUES と同じことを意味します SPI_SETSELECTIONFADE Windows 2000:選択項目のフェード効果を有効または無効にします。pvParam パラメータで、フェード効果を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 選択項目のフェード効果を有効にすると、ユーザーがメニュー項目を選択したときに、メニューが消えた後、ほんの短い間だけそのメニュー項目が画面に残り、フェードアウトしてゆきます。選択項目のフェード効果を利用できるのは、システムの色深度が 256 色(8 ビット)以上である場合のみです。 SPI_SETTOOLTIPANIMATION Windows 2000:ツールチップ(チップヘルプ)アニメーションを有効または無効にします。pvParam パラメータで、ツールチップのアニメーションを有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。ツールチップアニメーションが有効になっている場合、SPI_SETTOOLTIPFADE フラグを使って、ツールチップを表示する際にフェードアニメーションとスライドアニメーションのどちらを使うのか設定できます。 SPI_SETTOOLTIPFADE Windows 2000:SPI_SETTOOLTIPANIMATION フラグが有効になっている場合、SPI_SETTOOLTIPFADE フラグは、ツールチップアニメーションを表示する際にフェード効果とスライド効果のどちらが使うのか設定します。pvParam パラメータで、フェードアニメーションを有効にする場合は 0 以外の値(TRUE)を、スライドアニメーションを有効にする場合は 0(FALSE)を指定します。ツールチップのフェード効果を利用できるのは、システムの色深度が 256 色(8 ビット)以上である場合のみです。詳細については、MSDN ライブラリの 関数の説明を参照してください。 SPI_SETUIEFFECTS Windows 2000:すべての UI 効果を有効または無効にします。pvParam パラメータで、すべての UI 効果を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。この表には、UI 効果に関連するすべてのフラグが掲載されています。 ウィンドウのフラグは、次のとおりです。 意味 SPI_GETACTIVEWINDOWTRACKING Windows 98 と Windows 2000:アクティブウィンドウトラッキング(マウスカーソルがウィンドウに重なったときに、そのウィンドウを有効にする)が有効になっているかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、この機能が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。 SPI_GETACTIVEWNDTRKZORDER Windows 98 と Windows 2000:アクティブウィンドウトラッキングによってウィンドウがアクティブになった時点で、そのウィンドウが最前面(奥行き方向の手前)に表示されるかどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、この機能が有効になっている場合は 0 以外の値(TRUE)が、無効になっている場合は 0(FALSE)が格納されます。 SPI_GETACTIVEWNDTRKTIMEOUT Windows 98 と Windows 2000:アクティブウィンドウトラッキングの待ち時間をミリ秒(ms)単位で取得します。pvParam パラメータで、1 個の DWORD 型変数を指定します。関数から制御が返ると、この変数に、待ち時間が格納されます。この時間にわたって、マウスポインタが特定のウィンドウに重なっている場合、そのウィンドウをアクティブにします。 SPI_GETANIMATION ユーザーの操作に関連付けられている(ウィンドウを最小化した場合など)アニメーション効果に関する情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、アニメーション効果に関する情報が格納されます。ANIMATIONINFO 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(ANIMATIONINFO) を指定します。 SPI_GETBORDER ウィンドウのサイズ変更枠の幅を決定する乗数を取得します。pvParam パラメータで、1 個の整数型変数へのポインタを指定します。関数から制御が返ると、この変数に、この乗数の値が格納されます。 SPI_GETCARETWIDTH Windows 2000:編集コントロール内のキャレット(テキスト用のカーソル)の幅を取得します。pvParam パラメータで、1 個の DWORD 型変数へのポインタを指定します。関数から制御が返ると、この変数に、キャレットの幅がピクセル単位で格納されます。 SPI_GETDRAGFULLWINDOWS フルドラッグ(ウィンドウの内容を表示したままのドラッグ)が有効かどうかを調べます。pvParam パラメータで、1 個の BOOL 型変数へのポインタを指定します。関数から制御が返ると、この変数に、フルドラッグが有効になっている場合は TRUE が、無効になっている場合は FALSE が格納されます。 Windows 95:SPI_GETDRAGFULLWINDOWS フラグは、Microsoft Plus!が既にインストールされている場合にのみ使えます。詳細については、この関数の最後の方にある「Windows 95/98 のフラグ」の表の SPI_GETWINDOWSEXTENSION を参照してください。 SPI_GETFOREGROUNDFLASHCOUNT Windows 98 と Windows 2000:特定のウィンドウをフォアグラウンドウィンドウにするよう要求が発行され、その要求が拒否された場合に、 関数がタスクバー内のボタンを点滅させる回数を取得します。pvParam パラメータで、1 個の DWORD 型変数へのポインタを指定します。関数から制御が返ると、この変数に、点滅回数が格納されます。 SPI_GETFOREGROUNDLOCKTIMEOUT Windows 98 と Windows 2000:ユーザーが何かを入力した後、システムは一定の時間にわたって、アプリケーションが自らをフォアグラウンドにすることを禁止します。この時間をミリ秒(ms)単位で取得します。pvParam パラメータで、1 個の DWORD 型変数へのポインタを指定します。関数から制御が返ると、この変数に、フォアグラウンド移行の禁止時間が格納されます。 SPI_GETMINIMIZEDMETRICS 最小化ウィンドウの配置方法に関する情報を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、配置方法に関する情報が格納されます。MINIMIZEDMETRICS 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(MINIMIZEDMETRICS) を指定します。 SPI_GETNONCLIENTMETRICS 非クライアント領域に関するメトリック値(メニューバーの高さなど)を取得します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、メトリック値が格納されます。NONCLIENTMETRICS 構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(NONCLIENTMETRICS) を指定します。 SPI_GETSHOWIMEUI Windows 98 と Windows 2000:IME ステータスウィンドウが可視状態になっているかどうかを調べます(ユーザーごとの設定)。pvParam パラメータで、1 個の BOOL 型変数を指定します。関数から制御が返ると、この変数に、ステータスウィンドウが可視状態になっている場合は 0 以外の値(TRUE)が、不可視状態になっている場合は 0(FALSE)が格納されます。 SPI_SETACTIVEWINDOWTRACKING Windows 98 と Windows 2000:アクティブウィンドウトラッキング(マウスカーソルがウィンドウに重なったときに、そのウィンドウを有効にする)を有効または無効にします。pvParam パラメータで、この機能を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 SPI_SETACTIVEWNDTRKZORDER Windows 98 と Windows 2000:アクティブウィンドウトラッキングによってウィンドウがアクティブになった時点で、そのウィンドウを最前面(奥行き方向の手前)に表示するかどうかを設定します。pvParam パラメータで、この機能を有効にする場合は 0 以外の値(TRUE)を、無効にする場合は 0(FALSE)を指定します。 SPI_SETACTIVEWNDTRKTIMEOUT Windows 98 と Windows 2000:アクティブウィンドウトラッキングの待ち時間をミリ秒(ms)単位で指定します。pvParam パラメータで、新しい遅延時間を指定します。この時間にわたって、マウスポインタが特定のウィンドウに重なっている場合、そのウィンドウをアクティブにします。 SPI_SETANIMATION ユーザーの操作に関連付けられている(ウィンドウを最小化した場合など)アニメーション効果に関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(ANIMATIONINFO) を指定します。 SPI_SETBORDER ウィンドウのサイズ変更枠の幅を決定する乗数を設定します。uiParam パラメータで、設定するべき新しい値を指定します。 SPI_SETCARETWIDTH Windows 2000:編集コントロール内のキャレット(テキスト用のカーソル)の幅を設定します。pvParam パラメータで、希望のキャレットの幅をピクセル単位で指定します。既定の幅は、最小の幅と同じ 1 です。 SPI_SETDRAGFULLWINDOWS フルドラッグ(ウィンドウの内容を表示したままのドラッグ)を有効または無効にします。uiParam パラメータで、フルドラッグを有効にする場合は TRUE を、無効にする場合は FALSE を指定します。 Windows 95:SPI_SETDRAGFULLWINDOWS フラグは、Microsoft Plus!が既にインストールされている場合にのみ使えます。詳細については、この関数の最後の方にある「Windows 95/98 のフラグ」の表の SPI_GETWINDOWSEXTENSION を参照してください。 SPI_SETDRAGHEIGHT ドラッグ操作の開始とは見なされない範囲が既定で設定されていますが、この範囲に相当する長方形の高さを設定します。マウスボタンを押した後、この高さを越えてマウスを動かすと、ドラッグ操作が開始されたものと見なされます。この結果、ユーザーは意図していない場所でドラッグ操作を開始することなく、簡単にマウスボタンをクリックし、その後放すことができます。uiParam パラメータで、設定するべき新しい高さを指定します。ドラッグ長方形の高さを取得するには、SM_CYDRAG を指定して GetSystemMetrics 関数を呼び出してください。 SPI_SETDRAGWIDTH ドラッグ操作の開始とは見なされない範囲が既定で設定されていますが、この範囲に相当する長方形の幅を設定します。マウスボタンを押した後、この幅を越えてマウスを動かすと、ドラッグ操作が開始されたものと見なされます。この結果、ユーザーは意図していない場所でドラッグ操作を開始することなく、簡単にマウスボタンをクリックし、その後放すことができます。uiParam パラメータで、設定するべき新しい幅を指定します。ドラッグ長方形の幅を取得するには、SM_CXDRAG を指定して GetSystemMetrics 関数を呼び出してください。 SPI_SETFOREGROUNDFLASHCOUNT Windows 98 と Windows 2000:特定のウィンドウをフォアグラウンドウィンドウにするよう要求が発行され、その要求が拒否された場合に、 関数がタスクバー内のボタンを点滅させる回数を設定します。pvParam パラメータで、設定するべき新しい点滅回数を指定します。 SPI_SETFOREGROUNDLOCKTIMEOUT Windows 98 と Windows 2000:ユーザーが何かを入力した後、システムは一定の時間にわたって、アプリケーションが自らをフォアグラウンドにすることを禁止します。この時間をミリ秒(ms)単位で設定します。pvParam パラメータで、設定するべき、フォアグラウンド移行の新しい禁止時間を指定します。 SPI_SETMINIMIZEDMETRICS 最小化ウィンドウの配置方法に関する情報を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(MINIMIZEDMETRICS) を指定します。 SPI_SETNONCLIENTMETRICS 非クライアント領域に関するメトリック値(メニューバーの高さなど)を設定します。pvParam パラメータで、1 個の 構造体へのポインタを指定します。この構造体で、新しいパラメータを指定しておきます。この構造体の cbSize メンバと、この関数の uiParam パラメータの両方で、sizeof(NONCLIENTMETRICS) を指定します。 SPI_SETSHOWIMEUI Windows 98 と Windows 2000:IME ステータスウィンドウを可視状態または不可視状態に設定します(ユーザーごとの設定)。uiParam パラメータで、可視状態にする場合は 0 以外の値(TRUE)を、不可視状態にする場合は 0(FALSE)を指定します。 次のフラグは、Windows 95 と Windows 98 に特有のものです。 Windows 95/98 のフラグ 意味 SPI_GETWINDOWSEXTENSION Windows 95:Windows のエクステンションである Microsoft Plus!が既にインストールされているかどうかを調べます。uiParam パラメータで 1 を指定してください。pvParam パラメータは使いません。この関数は、Plus!がインストールされている場合は 0 以外の値(TRUE)を、インストールされていない場合は 0(FALSE)を返します。 SPI_SETPENWINDOWS Windows 95/98:ペンウィンドウ(Windows for Pen computing extensions)をロードまたはアンロードします。uiParam パラメータで、ロードする場合は 0 以外の値(TRUE)を、アンロードする場合は 0(FALSE)を指定します。pvParam パラメータで、NULL を指定します。 ; *) // DwmGetWindowAttribute ------------------------------------------------------- //------------------------------------------------------------------------------ const DWMWA_NCRENDERING_ENABLED = 1; DWMWA_NCRENDERING_POLICY = 2; DWMWA_TRANSITIONS_FORCEDISABLED = 3; DWMWA_ALLOW_NCPAINT = 4; DWMWA_CAPTION_BUTTON_BOUNDS = 5; DWMWA_NONCLIENT_RTL_LAYOUT = 6; DWMWA_FORCE_ICONIC_REPRESENTATION = 7; DWMWA_FLIP3D_POLICY = 8; DWMWA_EXTENDED_FRAME_BOUNDS = 9; DWMWA_HAS_ICONIC_BITMAP = 10; DWMWA_DISALLOW_PEEK = 11; DWMWA_EXCLUDED_FROM_PEEK = 12; DWMWA_CLOAK = 13; DWMWA_CLOAKED = 14; DWMWA_FREEZE_REPRESENTATION = 15; DWMWA_LAST = 16; function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; {2013-11-17: } begin Result := E_NOTIMPL; if (@F_DwmGetWindowAttribute <> nil) then begin Result := F_DwmGetWindowAttribute( hwnd, dwAttribute, pvAttribute, cbAttribute ); end; end; procedure T_MyAPIValue.FDwmGetWindowAttribute; const lcs_DECLARATION = 'HRESULT DwmGetWindowAttribute(HWND hwnd, DWORD dwAttribute, pvAttribute, DWORD cbAttribute);'; lcs_DESCRIPTION = '指定されたウィンドウのデスクトップウィンドウマネージャーの属性を調べます。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのトップレベルウィンドウのハンドルを指定' + lcsCRLF + 'dwAttribute 調べる属性を指定' + lcsCRLF + 'pvAttribute dwAttributeで指定した属性の値を受け取る変数のポインタを指定' + lcsCRLF + 'cbAttribute pvAttributeで指定した変数のサイズを指定' + lcsCRLF + '戻り値 関数が成功したらS_OKが、失敗したらエラーのHRESULT値が返ります。' + lcsCRLF + lcsCRLF + 'dwAttributeで指定する値によりpvAttributeに指定する変数の型が変わります。' + lcsCRLF + 'hwndに子ウィンドウを指定するとこの関数は失敗します。' ; function _GetHResult(iRet: HResult): WideString; begin if (Succeeded(iRet)) then begin Result := 'S_OK'; end else begin case iRet of E_UNEXPECTED : Result := 'E_UNEXPECTED'; //Catastrophic failure E_NOTIMPL : Result := 'E_NOTIMPL'; //Not implemented E_OUTOFMEMORY : Result := 'E_OUTOFMEMORY'; //Ran out of memory E_INVALIDARG : Result := 'E_INVALIDARG'; //One or more arguments are invalid E_NOINTERFACE : Result := 'E_NOINTERFACE'; //No such interface supported E_POINTER : Result := 'E_POINTER'; //Invalid pointer E_HANDLE : Result := 'E_HANDLE'; //Invalid handle E_ABORT : Result := 'E_ABORT'; //Operation aborted E_FAIL : Result := 'E_FAIL'; //Unspecified error E_ACCESSDENIED : Result := 'E_ACCESSDENIED'; //General access denied error E_PENDING : Result := 'E_PENDING'; //The data necessary to complete this operation is not yet available. else Result := 'その他のエラー'; end; end; end; function _GetBoolValue(iRet: HResult; bValue: BOOL): WideString; begin Result := WideFormat('%s %s', [_GetHResult(iRet), FGetBoolValue(bValue)]); end; function _GetRectValue(iRet: HResult; ARect: TRect): WideString; begin Result := WideFormat('%s %s', [_GetHResult(iRet), FGetRectValue(ARect)]); end; function _GetCloakedValue(iRet: HResult; iCloaked: DWORD): WideString; const DWM_CLOAKED_APP = $1; //The window was cloaked by its owner application. DWM_CLOAKED_SHELL = $2; //The window was cloaked by the Shell. DWM_CLOAKED_INHERITED = $4; //The cloak value was inherited from its owner window. begin Result := WideFormat('%s 0x%1:.8x %1:u', [_GetHResult(iRet), iCloaked]); end; var li_Ret : HResult; lb_Bool : BOOL; l_Rect : TRect; li_Cloaked : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのトップレベルウィンドウのハンドルを指定します。' + CRLF + '子ウィンドウを指定するとこの関数は失敗します。'); FAddElement('dwAttribute: DWMWA_NCRENDERING_ENABLED', 'dwAttributeにDWMWA_NCRENDERING_ENABLEDを指定した時の戻り値と取得した値。' + CRLF + '非クライアントのレンダリングが有効になっているかを調べます。' + lcsCRLF + '取得する値はBOOL型で、非クライアントのレンダリングが有効な場合はTrue、そうでなければFalseになります。'); FAddElement('dwAttribute: DWMWA_CAPTION_BUTTON_BOUNDS', 'dwAttributeにDWMWA_CAPTION_BUTTON_BOUNDSを指定した時の戻り値と取得した値。' + lcsCRLF + 'タイトルバーのボタン部分の矩形領域(RECT)を調べます。' + lcsCRLF + '取得する値はRECT型で、タイトルバーの左上隅からの相対座標の値になります。'); FAddElement('dwAttribute: DWMWA_EXTENDED_FRAME_BOUNDS', 'dwAttributeにDWMWA_EXTENDED_FRAME_BOUNDSを指定した時の戻り値と取得した値。' + lcsCRLF + 'ウィンドウのフレームの拡張部分も含めた矩形領域(RECT)を調べます。' + lcsCRLF + '取得する値はRECT型で、スクリーン座標での値になります。'); FAddElement('dwAttribute: DWMWA_CLOAK', 'dwAttributeにDWMWA_CLOAKを指定した時の戻り値と取得した値。' + CRLF + 'Cloaks the window such that it is not visible to the user. The window is still composed by DWM.'); FAddElement('dwAttribute: DWMWA_CLOAKED', 'dwAttributeにDWMWA_CLOAKEDを指定した時の戻り値と取得した値。' + CRLF + 'If the window is cloaked, provides one of the following values explaining why:'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin //非クライアントのレンダリングが有効かどうか lb_Bool := False; li_Ret := DwmGetWindowAttribute(FhWndHandle, DWMWA_NCRENDERING_ENABLED, @lb_Bool, SizeOf(lb_Bool)); FAddStrValue(_GetBoolValue(li_Ret, lb_Bool)); //タイトルバーのボタン部分のRect l_Rect := Rect(0, 0, 0, 0); li_Ret := DwmGetWindowAttribute(FhWndHandle, DWMWA_CAPTION_BUTTON_BOUNDS, @l_Rect, SizeOf(l_Rect)); FAddStrValue(_GetRectValue(li_Ret, l_Rect)); //拡張フレームのRect l_Rect := Rect(0, 0, 0, 0); li_Ret := DwmGetWindowAttribute(FhWndHandle, DWMWA_EXTENDED_FRAME_BOUNDS, @l_Rect, SizeOf(l_Rect)); FAddStrValue(_GetRectValue(li_Ret, l_Rect)); //DWMWA_CLOAK lb_Bool := False; li_Ret := DwmGetWindowAttribute(FhWndHandle, DWMWA_CLOAK, @lb_Bool, SizeOf(lb_Bool)); FAddStrValue(_GetBoolValue(li_Ret, lb_Bool)); //DWMWA_CLOAKED li_Cloaked := 0; li_Ret := DwmGetWindowAttribute(FhWndHandle, DWMWA_CLOAKED, @li_Cloaked, SizeOf(li_Cloaked)); FAddStrValue(_GetCloakedValue(li_Ret, li_Cloaked)); end; end; // EnumChildWindows ------------------------------------------------------------ procedure T_MyAPIValue.FEnumChildWindows; function _ChildWindowProc(hChild: HWND; pList: Pointer): BOOL; stdcall; begin TStrings(pList).Add(F_GetWindowValue(hChild)); Result := True; end; const lcs_DECLARATION = 'BOOL EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc, LPARAM lParam);'; lcs_DESCRIPTION = '指定されたウィンドウの子ウィンドウを列挙します。' + lcsTITLE_CRLF + 'hWndParent 調べたいウィンドウのハンドルを指定します。' + lcsCRLF + 'lpEnumFunc コールバック関数へのポインタを指定します。' + lcsCRLF + 'lParam アプリケーションで自由に使える値。' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; var i : Integer; lb_Ret : BOOL; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hWndParent', '調べたいウィンドウのハンドルを指定します。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FWindowList.Clear; if (FhWndHandle = GetDesktopWindow) then begin lb_Ret := EnumChildWindows(0, @_ChildWindowProc, LPARAM(FWindowList)); end else begin lb_Ret := EnumChildWindows(FhWndHandle, @_ChildWindowProc, LPARAM(FWindowList)); end; FAddBoolValue(lb_Ret); if (FWindowList.Count > 0) then begin for i := 0 to FWindowList.Count -1 do begin FAddStrValue(FWindowList[i]); end; end; end; end; // EnumThreadWindows ------------------------------------------------------------ procedure T_MyAPIValue.FEnumThreadWindows; function _EnumThreadWndProc(hWindow: HWND; pList: Pointer): BOOL; stdcall; begin TStrings(pList).Add(F_GetWindowValue(hWindow)); Result := True; end; const lcs_DECLARATION = 'BOOL EnumThreadWindows(DWORD dwThreadId, WNDENUMPROC lpfn, LPARAM lParam);'; lcs_DESCRIPTION = '指定されたスレッドに関連付けられている、子ウィンドウでないすべてのウィンドウを列挙します。' + lcsTITLE_CRLF + 'dwThreadId スレッドIDを指定します。' + lcsCRLF + 'lpfn コールバック関数へのポインタを指定します。' + lcsCRLF + 'lParam アプリケーションで自由に使える値。' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; var i : Integer; lb_Ret : BOOL; li_Thread : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', '対象ウィンドウ'); FAddElement('dwThreadId', 'スレッドIDを指定します。このスレッドが持つウィンドウが列挙されます。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin // li_Thread := gfniThreadIDGet(FhWndHandle); li_Thread := GetWindowThreadProcessId(FhWndHandle); FAddHexValue(li_Thread); FWindowList.Clear; lb_Ret := EnumThreadWindows(li_Thread, @_EnumThreadWndProc, LPARAM(FWindowList)); FAddBoolValue(lb_Ret); if (FWindowList.Count > 0) then begin for i := 0 to FWindowList.Count -1 do begin FAddStrValue(FWindowList[i]); end; end; end; end; // GetAncestor ----------------------------------------------------------------- procedure T_MyAPIValue.FGetAncestor; const lcs_DECLARATION = 'HWND GetAncestor(HWND hwnd, UINT gaFlags);'; lcs_DESCRIPTION = '指定されたウィンドウの祖先のハンドルを返します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'gaFlags 取得する祖先を指定する以下の値を指定' + lcsCRLF + ' GA_PARENT 親ウィンドウを取得' + lcsCRLF + ' GA_ROOT 親ウィンドウのチェーンをたどってルートウィンドウを取得' + lcsCRLF + ' GA_ROOTOWNER 親ウィンドウのチェーンをたどって所有されているルートウィンドウを取得' + lcsCRLF + '戻り値 指定の祖先のウィンドウのハンドルが返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '祖先を取得するウィンドウのハンドルを指定します。' + lcsCRLF + 'デスクトップウィンドウのハンドルを指定するとNULLが返ります。'); FAddElement('gaFlags: GA_PARENT', 'gaFlagsにGA_PARENTを指定した時の戻り値。' + lcsCRLF + '親ウィンドウを取得します。GetParent関数と違いオーナーウィンドウは取得しません。'); FAddElement('gaFlags: GA_ROOT', 'gaFlagsにGA_ROOTを指定した時の戻り値。' + lcsCRLF + '親ウィンドウのチェーンをたどってルートウィンドウを取得します。'); FAddElement('gaFlags: GA_ROOTOWNER', 'gaFlagsにGA_ROOTOWNERを指定した時の戻り値。' + lcsCRLF + 'GetParent関数が返す親ウィンドウのチェーンをたどって所有されているルートウィンドウを取得します。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddWindowValue(GetAncestor(FhWndHandle, GA_PARENT)); FAddWindowValue(GetAncestor(FhWndHandle, GA_ROOT)); FAddWindowValue(GetAncestor(FhWndHandle, GA_ROOTOWNER)); end; end; // GetClassInfoEx -------------------------------------------------------------- procedure T_MyAPIValue.FGetClassInfoEx; const lcsSTRUCT_WNDCLASSEX = lcsSTRUCT_CRLF + 'typedef struct tagWNDCLASSEX {' + lcsCRLF + ' UINT cbSize; //構造体のサイズ(必ずセットすること)' + lcsCRLF + ' UINT style; //クラスのスタイル' + lcsCRLF + ' WNDPROC lpfnWndProc; //ウインドウプロシージャ' + lcsCRLF + ' int cbClsExtra; //拡張クラスデータのサイズ' + lcsCRLF + ' int cbWndExtra; //拡張ウインドウデータのサイズ' + lcsCRLF + ' HINSTANCE hInstance; //インスタンスのハンドル' + lcsCRLF + ' HICON hIcon; //アイコンのハンドル' + lcsCRLF + ' HCURSOR hCursor; //カーソルのハンドル' + lcsCRLF + ' HBRUSH hbrBackground; //背景ブラシのハンドル' + lcsCRLF + ' LPCTSTR lpszMenuName; //メニューバーの識別文字列' + lcsCRLF + ' LPCTSTR lpszClassName; //ウインドウのクラス文字列' + lcsCRLF + ' HICON hIconSm; //小さいアイコンのハンドル' + lcsCRLF + '} WNDCLASSEX, *LPWNDCLASSEX;' ; const lcs_DECLARATION = 'BOOL GetClassInfoEx(HINSTANCE hinst, LPCTSTR lpszClass, LPWNDCLASSEX lpwcx);'; lcs_DESCRIPTION = 'ウィンドウクラスの情報を取得します。ウィンドウクラスに関連付けられている小さいアイコンのハンドルも取得できます。' + lcsTITLE_CRLF + 'hinst アプリケーションインスタンスのハンドルを指定' + lcsCRLF + 'lpszClass クラス名を指定' + lcsCRLF + 'lpwcx クラスの情報を受け取るWNDCLASSEX構造体の変数のポインタを指定' + lcsCRLF + '戻り値 指定したクラスが見つかり情報の取得に成功したら0以外の値(True)が返ります。指定したクラスが見つからず情報の取得に失敗したら0(False)が返ります' + lcsCRLF + lcsSTRUCT_WNDCLASSEX ; var lb_Ret : BOOL; lh_Instance : HINST; ls_ClassName : WideString; l_Info : TWndClassExW; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', '調べたいウィンドウ'); FAddElement('hinst', 'クラスを作成したアプリケーションのインスタンスハンドルを指定します。'); FAddElement('lpszClass', '調べたいクラス名を指定します。'); FAddElement('lpwcx.cbSize', '構造体のサイズ(必ずセットすること)'); FAddElement('lpwcx.style', 'クラスのスタイル'); FAddElement('lpwcx.lpfnWndProc', 'ウインドウプロシージャ'); FAddElement('lpwcx.cbClsExtra', '拡張クラスデータのサイズ'); FAddElement('lpwcx.cbWndExtra', '拡張ウインドウデータのサイズ'); FAddElement('lpwcx.hInstance', 'インスタンスのハンドル'); FAddElement('lpwcx.hIcon', 'アイコンのハンドル'); FAddElement('lpwcx.hCursor', 'カーソルのハンドル'); FAddElement('lpwcx.hbrBackground', '背景ブラシのハンドル'); FAddElement('lpwcx.lpszMenuName', 'メニューバーの識別文字列'); FAddElement('lpwcx.lpszClassName', 'ウインドウのクラス文字列'); FAddElement('lpwcx.hIconSm', '小さいアイコンのハンドル'); FAddElement('戻り値', '指定したクラスが見つかり情報の取得に成功したら0以外の値(True)が返ります。指定したクラスが見つからず情報の取得に失敗したら0(False)が返ります'); FAddElement('lpwcxダンプ'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lh_Instance := HINST(GetWindowLong(FhWndHandle, GWL_HINSTANCE)); ls_ClassName := gfnsClassNameGet(FhWndHandle); FillChar(l_Info, 0, SizeOf(l_Info)); l_Info.cbSize := SizeOf(l_Info); lb_Ret := GetClassInfoExW(lh_Instance, PWideChar(ls_ClassName), l_Info); FAddHexValue(lh_Instance); FAddStrValue(ls_ClassName); if (lb_Ret) then begin FAddIntValue(l_Info.cbSize); FAddHexValue(l_Info.style); FAddHexValue(Integer(l_Info.lpfnWndProc)); FAddHexValue(l_Info.cbClsExtra); FAddHexValue(l_Info.cbWndExtra); FAddHexValue(l_Info.hInstance); FAddHexValue(l_Info.hIcon); FAddHexValue(l_Info.hCursor); FAddHexValue(l_Info.hbrBackground); FAddStrValue(WideString(l_Info.lpszMenuName)); FAddStrValue(WideString(l_Info.lpszClassName)); FAddHexValue(l_Info.hIconSm); end else begin FAddIntValue(l_Info.cbSize); FAddHexValue(l_Info.style); FAddHexValue(Integer(l_Info.lpfnWndProc)); FAddHexValue(l_Info.cbClsExtra); FAddHexValue(l_Info.cbWndExtra); FAddHexValue(l_Info.hInstance); FAddHexValue(l_Info.hIcon); FAddHexValue(l_Info.hCursor); FAddHexValue(l_Info.hbrBackground); FAddHexValue(Integer(l_Info.lpszMenuName)); FAddHexValue(Integer(l_Info.lpszClassName)); // FAddStrValue(WideString(l_Info.lpszMenuName)); // FAddStrValue(WideString(l_Info.lpszClassName)); FAddHexValue(l_Info.hIconSm); end; FAddBoolValue(lb_Ret); FAddDumpValue(@l_Info, l_Info.cbSize); end; end; // GetClassLong ---------------------------------------------------------------- procedure T_MyAPIValue.FGetClassLong; const lcs_DECLARATION = 'DWORD GetClassLong(HWND hWnd, int nIndex);'; lcs_DESCRIPTION = '指定されたウィンドウに関係付けられている構造体から指定された32ビットのデータを取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'nIndex 取得するデータのインデックスを指定' + lcsCRLF + ' GCW_ATOM ウィンドウクラスを一意的に識別するアトム値を取得' + lcsCRLF + ' GCL_CBCLSEXTRA 指定したクラスに関連付けられている拡張クラスメモリのサイズをバイト単位で取得' + lcsCRLF + ' GCL_CBWNDEXTRA ウィンドウに関連付けられている拡張ウィンドウメモリのサイズをバイト単位で取得' + lcsCRLF + ' GCL_HBRBACKGROUND クラスに関連付けられている背景ブラシのハンドルを取得' + lcsCRLF + ' GCL_HCURSOR クラスに関連付けられているマウスカーソルのハンドルを取得' + lcsCRLF + ' GCL_HICON クラスに関連付けられているアイコンのハンドルを取得' + lcsCRLF + ' GCL_HICONSM クラスに関連付けられている小さいアイコンのハンドルを取得' + lcsCRLF + ' GCL_HMODULE クラスを登録したモジュールのハンドルを取得' + lcsCRLF + ' GCL_MENUNAME メニュー名が入った文字列へのポインタ(またはメニューのID)を取得' + lcsCRLF + ' GCL_STYLE ウィンドウクラスのスタイルビットを取得' + lcsCRLF + ' GCL_WNDPROC ウィンドウプロシージャのアドレスまたはウィンドウプロシージャのアドレスを示すハンドルを取得' + lcsCRLF + '戻り値 関数が成功すると要求した32ビットのデータが返ります。関数が失敗すると0が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('nIndex: GCW_ATOM', 'nIndexにGCW_ATOMを指定した時の戻り値。' + lcsCRLF + 'ウィンドウクラスを一意的に識別するアトム値を取得します。'); FAddElement('nIndex: GCL_CBCLSEXTRA', 'nIndexにGCL_CBCLSEXTRAを指定した時の戻り値。' + lcsCRLF + '指定したクラスに関連付けられている拡張クラスメモリのサイズをバイト単位で取得します。'); FAddElement('nIndex: GCL_CBWNDEXTRA', 'nIndexにGCL_CBWNDEXTRAを指定した時の戻り値。' + lcsCRLF + 'ウィンドウに関連付けられている拡張ウィンドウメモリのサイズをバイト単位で取得します。'); FAddElement('nIndex: GCL_HBRBACKGROUND', 'nIndexにGCL_HBRBACKGROUNDを指定した時の戻り値。' + lcsCRLF + 'クラスに関連付けられている背景ブラシのハンドルを取得します。'); FAddElement('nIndex: GCL_HCURSOR', 'nIndexにGCL_HCURSORを指定した時の戻り値。' + lcsCRLF + 'クラスに関連付けられているマウスカーソルのハンドルを取得します。'); FAddElement('nIndex: GCL_HICON', 'nIndexにGCL_HICONを指定した時の戻り値。' + lcsCRLF + 'クラスに関連付けられているアイコンのハンドルを取得します。'); FAddElement('nIndex: GCL_HICONSM', 'nIndexにGCL_HICONSMを指定した時の戻り値。' + lcsCRLF + 'クラスに関連付けられている小さいアイコンのハンドルを取得します。'); FAddElement('nIndex: GCL_HMODULE', 'nIndexにGCL_HMODULEを指定した時の戻り値。' + lcsCRLF + 'クラスを登録したモジュールのハンドルを取得します。'); FAddElement('nIndex: GCL_MENUNAME', 'nIndexにGCL_MENUNAMEを指定した時の戻り値。' + lcsCRLF + 'メニュー名が入った文字列へのポインタ(またはメニューのID)を取得します。'); FAddElement('nIndex: GCL_STYLE', 'nIndexにGCL_STYLEを指定した時の戻り値。' + lcsCRLF + 'ウィンドウクラスのスタイルビットを取得します。'); FAddElement('nIndex: GCL_WNDPROC', 'nIndexにGCL_WNDPROCを指定した時の戻り値。' + lcsCRLF + 'ウィンドウプロシージャのアドレスまたはウィンドウプロシージャのアドレスを示すハンドルを取得します。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddHexValue(GetClassLong(FhWndHandle, GCW_ATOM)); FAddHexValue(GetClassLong(FhWndHandle, GCL_CBCLSEXTRA)); FAddHexValue(GetClassLong(FhWndHandle, GCL_CBWNDEXTRA)); FAddHexValue(GetClassLong(FhWndHandle, GCL_HBRBACKGROUND)); FAddHexValue(GetClassLong(FhWndHandle, GCL_HCURSOR)); FAddHexValue(GetClassLong(FhWndHandle, GCL_HICON)); FAddHexValue(GetClassLong(FhWndHandle, GCL_HICONSM)); FAddHexValue(GetClassLong(FhWndHandle, GCL_HMODULE)); FAddHexValue(GetClassLong(FhWndHandle, GCL_MENUNAME)); FAddHexValue(GetClassLong(FhWndHandle, GCL_STYLE)); FAddHexValue(GetClassLong(FhWndHandle, GCL_WNDPROC)); end; end; // GetClassName ---------------------------------------------------------------- procedure T_MyAPIValue.FGetClassName; const lcs_DECLARATION = 'int GetClassName(HWND hWnd, LPTSTR lpClassName, int nMaxCount);'; lcs_DESCRIPTION = '指定されたウィンドウのクラス名を取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'lpClassName クラス名を受け取る変数のポインタを指定' + lcsCRLF + 'nMaxCount lpClassNameが受け取るデータの最大長を指定(このテストでは255を指定)' + lcsCRLF + '戻り値 関数が成功するとlpClassNameが受け取ったデータの長さが返ります。関数が失敗すると0が返ります。' ; const lci_LEN = 255; var li_Ret : Integer; lp_Buff : PChar; ls_Class : String; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('lpClassName', 'クラス名を受け取る変数のポインタを指定します。'); FAddElement('戻り値', '関数が成功するとlpClassNameが受け取ったデータの長さが返ります。関数が失敗すると0が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lp_Buff:= AllocMem((lci_LEN +1) * SizeOf(Char)); try li_Ret := GetClassName(FhWndHandle, lp_Buff, lci_LEN); ls_Class := String(lp_Buff); finally FreeMem(lp_Buff); end; FAddStrValue(ls_Class); FAddIntValue(li_Ret); end; end; // GetClientRect --------------------------------------------------------------- procedure T_MyAPIValue.FGetClientRect; const lcs_DECLARATION = 'BOOL GetClientRect(HWND hWnd, LPRECT lpRect);'; lcs_DESCRIPTION = '指定されたウィンドウのクライアント領域の値をクライアント座標で取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'lpRect 値を受け取るRECT構造体の変数のポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' + lcsCRLF + lcsSTRUCT_RECT ; var lb_Ret : BOOL; l_Rect : TRect; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('lpRect', '値を受け取るRECT構造体の変数のポインタを指定します。' + lcsCRLF + 'この構造体にクライアント領域の座標がクライアント座標で格納されます。クライアント座標なのでleftメンバとtopメンバは常に0になります。rightメンバとbottomメンバはクライアント領域の幅と高さになります。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lb_Ret := Windows.GetClientRect(FhWndHandle, l_Rect); FAddRectValue(l_Rect); FAddBoolValue(lb_Ret); end; end; // GetComboboxInfo ------------------------------------------------------------- procedure T_MyAPIValue.FGetComboboxInfo; const lcs_STRUCT_COMBOBOXINFO = lcsSTRUCT_CRLF + 'typedef struct tagCOMBOBOXINFO {' + lcsCRLF + ' DWORD cbSize; //構造体のサイズ(必ずセットすること)' + lcsCRLF + ' RECT rcItem; //エディットボックスの矩形領域(RECT)' + lcsCRLF + ' RECT rcButton; //ボタン部分も含めたコンボボックスの矩形領域(RECT)' + lcsCRLF + ' DWORD stateButton; //コンボボックスのボタンの状態' + lcsCRLF + ' HWND hwndCombo; //コンボボックスのハンドル' + lcsCRLF + ' HWND hwndItem; //エディットボックスのハンドル' + lcsCRLF + ' HWND hwndList; //ドロップダウンリストのハンドル' + lcsCRLF + '} COMBOBOXINFO, *PCOMBOBOXINFO, *LPCOMBOBOXINFO;' ; const lcs_DECLARATION = 'BOOL GetComboBoxInfo(HWND hwndCombo, PCOMBOBOXINFO pcbi);'; lcs_DESCRIPTION = '指定されたコンボボックスに関する情報を取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'pcbi 情報を受け取るCOMBOBOXINFO構造体へのポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が返ります。関数が失敗すると0(False)が返ります。' + lcsCRLF + lcs_STRUCT_COMBOBOXINFO + lcsCRLF + 'pcbi.stateButtonの内容' + lcsCRLF + '0 (0x00000000)ボタンは存在し押されていない。' + lcsCRLF + 'STATE_SYSTEM_INVISIBLE (0x00008000)ボタンは存在しない。' + lcsCRLF + 'STATE_SYSTEM_PRESSED (0x00000008)ボタンは存在し押されている。' ; function _GetStatusValue(iValue: DWORD): WideString; var ls_Status : WideString; begin case iValue of 0 : ls_Status := '0 ボタンは存在し押されていない。'; STATE_SYSTEM_PRESSED : ls_Status := 'STATE_SYSTEM_PRESSED ボタンは存在しない。'; STATE_SYSTEM_INVISIBLE: ls_Status := 'STATE_SYSTEM_INVISIBLE ボタンは存在し押されている。'; else ls_Status := ''; end; Result := WideFormat('0x%0:.8x %s', [iValue, ls_Status]); end; var lb_Ret : BOOL; l_Info : TComboBoxInfo; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいコンボボックスのハンドルを指定します。'); FAddElement('pcbi.cbSize', '構造体のサイズをセットします。'); FAddElement('pcbi.rcItem', 'エディットボックスの矩形領域(RECT)'); FAddElement('pcbi.rcButton', 'ボタン部分も含めたコンボボックスの矩形領域(RECT)'); FAddElement('pcbi.stateButton', 'コンボボックスのボタンの状態'); FAddElement('pcbi.hwndCombo', 'コンボボックスのハンドル'); FAddElement('pcbi.hwndItem', 'エディットボックスのハンドル'); FAddElement('pcbi.hwndList', 'ドロップダウンリストのハンドル'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FillChar(l_Info, 0, SizeOf(l_Info)); l_Info.cbSize := SizeOf(l_Info); lb_Ret := GetComboboxInfo(FhWndHandle, l_Info); FAddIntValue(l_Info.cbSize); if (lb_Ret) then begin FAddRectValue(l_Info.rcItem); FAddRectValue(l_Info.rcButton); FAddStrValue(_GetStatusValue(l_Info.stateButton)); FAddWindowValue(l_Info.hwndCombo); FAddWindowValue(l_Info.hwndItem); FAddWindowValue(l_Info.hwndList); end else begin FAddBlank(6); end; FAddBoolValue(lb_Ret); end; end; // GetBinaryType --------------------------------------------------------------- procedure T_MyAPIValue.FGetBinaryType; const lcs_DECLARATION = 'BOOL GetBinaryType (LPCTSTR lpApplicationName, LPDWORD lpBinaryType);'; lcs_DESCRIPTION = '指定されたファイルが実行可能であるかどうかを調べます。実行可能な場合そのタイプも調べます。' + lcsTITLE_CRLF + 'lpApplicationName 調べたいファイル名を指定します。' + lcsCRLF + 'lpBinaryType 関数から制御が返るとこの変数にファイルのタイプ情報が格納されます。' + lcsCRLF + '戻り値 指定したファイルが実行可能ファイルの場合0以外の値(True)が返り、lpBinaryTypeに以下のファイルのタイプが格納されます。指定したファイルが実行可能ではない場合、または関数が失敗すると0(False)が返ります。' + lcsCRLF + ' SCS_32BIT_BINARY 0 Win32ベースのアプリケーション。' + lcsCRLF + ' SCS_64BIT_BINARY 6 Win64ベースのアプリケーション。' + lcsCRLF + ' SCS_DOS_BINARY 1 MS-DOSベースのアプリケーション。' + lcsCRLF + ' SCS_OS216_BINARY 5 16ビット版OS/2ベースのアプリケーション。' + lcsCRLF + ' SCS_PIF_BINARY 3 MS-DOSベースのアプリケーションを実行するPIFファイル。' + lcsCRLF + ' SCS_POSIX_BINARY 4 POSIXベースのアプリケーション。' + lcsCRLF + ' SCS_WOW_BINARY 2 16ビット版Windowsベースのアプリケーション。' ; function _GetBinaryType(iValue: DWORD): WideString; const SCS_64BIT_BINARY = 6; begin case iValue of SCS_32BIT_BINARY: Result := 'SCS_32BIT_BINARY 0 Win32ベースのアプリケーション。'; SCS_64BIT_BINARY: Result := 'SCS_64BIT_BINARY 6 Win64ベースのアプリケーション。'; SCS_DOS_BINARY: Result := 'SCS_DOS_BINARY 1 MS-DOSベースのアプリケーション。'; SCS_OS216_BINARY: Result := 'SCS_OS216_BINARY 5 16ビット版OS/2ベースのアプリケーション。'; SCS_PIF_BINARY: Result := 'SCS_PIF_BINARY 3 MS-DOSベースのアプリケーションを実行するPIFファイル。'; SCS_POSIX_BINARY: Result := 'SCS_POSIX_BINARY 4 POSIXベースのアプリケーション。'; SCS_WOW_BINARY: Result := 'SCS_WOW_BINARY 2 16ビット版Windowsベースのアプリケーション。'; else Result := WideFormat('%d 不明', [iValue]); end; end; var ls_File : WideString; lb_Ret : Boolean; li_Type : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', 'このウィンドウを起動した実行ファイルが対象になります。'); FAddElement('lpFileName', '調べたいファイル名を指定します。'); FAddElement('戻り値', '関数が成功すると指定したファイルまたはディレクトリの属性が返ります。関数が失敗すると-1が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin ls_File := gfnsExeNameGet(FhWndHandle); if (ls_File = '') then begin FAddStrValue('実行ファイル名を取得できません'); end else begin FAddStrValue(ls_File); end; lb_Ret := GetBinaryTypeW(PWideChar(ls_File), li_Type); FAddBoolValue(lb_Ret); FAddStrValue(_GetBinaryType(li_Type)); end; end; // GetFileAttributes ----------------------------------------------------------- procedure T_MyAPIValue.FGetFileAttributes; const lcs_DECLARATION = 'DWORD GetFileAttributes(LPCTSTR lpFileName);'; lcs_DESCRIPTION = '指定されたファイルまたはディレクトリの属性を取得します。' + lcsTITLE_CRLF + 'lpFileName 調べたいファイル名、またはディレクトリ名を指定します。' + lcsCRLF + '戻り値 関数が成功すると指定したファイルまたはディレクトリの属性が返ります。関数が失敗すると-1が返ります。' + lcsCRLF + ' 属性は次の値のいずれかまたは任意の組み合わせになります。' + lcsCRLF + ' FILE_ATTRIBUTE_ARCHIVE 0x20 アーカイブ属性。アプリケーションはこの属性をファイルのバックアップや削除のためのマークとして使います。' + lcsCRLF + ' FILE_ATTRIBUTE_COMPRESSED 0x800 圧縮属性。' + lcsCRLF + //' FILE_ATTRIBUTE_DEVICE 0x40 予約済み。使用禁止。' + lcsCRLF + ' FILE_ATTRIBUTE_DIRECTORY 0x10 ディレクトリ属性。指定のファイル名はディレクトリです。' + lcsCRLF + ' FILE_ATTRIBUTE_ENCRYPTED 0x4000 暗号化属性。' + lcsCRLF + ' FILE_ATTRIBUTE_HIDDEN 0x2 隠しファイル属性。' + lcsCRLF + ' FILE_ATTRIBUTE_NORMAL 0x80 指定されたファイルまたはディレクトリには特に属性はありません。単独で返った場合にのみこの属性は有効です。' + lcsCRLF + ' FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x2000 インデックスサービスの対象外。' + lcsCRLF + ' FILE_ATTRIBUTE_OFFLINE 0x1000 オフライン属性。このファイルのデータはすぐには利用できません。この属性はファイルのデータがオフラインの記憶装置へ物理的に移動されたことを示します。' + lcsCRLF + ' FILE_ATTRIBUTE_READONLY 0x1 読み取り専用属性。' + lcsCRLF + ' FILE_ATTRIBUTE_REPARSE_POINT 0x400 再解析ポイントが関連付けられています。' + lcsCRLF + ' FILE_ATTRIBUTE_SPARSE_FILE 0x200 スパースファイル(疎なファイル、未使用の領域が多い、または同じ値が長く続くファイル)です。' + lcsCRLF + ' FILE_ATTRIBUTE_SYSTEM 0x4 システム属性。OSの一部またはOS専用です。' + lcsCRLF + ' FILE_ATTRIBUTE_TEMPORARY 0x100 テンポラリ属性。一時ファイルとして使われています。アプリケーションは必要がなくなった段階で一時ファイルをすぐに削除するべきです。' ; procedure _AddAttributes(iValue: DWORD); const FILE_ATTRIBUTE_ENCRYPTED = $4000; FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = $2000; FILE_ATTRIBUTE_REPARSE_POINT = $400; FILE_ATTRIBUTE_SPARSE_FILE = $200; begin if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_ARCHIVE)) then begin FAddStrValue('FILE_ATTRIBUTE_ARCHIVE 0x20 アーカイブ属性。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_COMPRESSED)) then begin FAddStrValue('FILE_ATTRIBUTE_COMPRESSED 0x800 圧縮属性。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_DIRECTORY)) then begin FAddStrValue('FILE_ATTRIBUTE_DIRECTORY 0x10 ディレクトリ属性。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_ENCRYPTED)) then begin FAddStrValue('FILE_ATTRIBUTE_ENCRYPTED 0x4000 暗号化属性。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_HIDDEN)) then begin FAddStrValue('FILE_ATTRIBUTE_HIDDEN 0x2 隠しファイル属性。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_NORMAL)) then begin FAddStrValue('FILE_ATTRIBUTE_NORMAL 0x80 属性なし。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)) then begin FAddStrValue('FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x2000 インデックスサービスの対象外。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_OFFLINE)) then begin FAddStrValue('FILE_ATTRIBUTE_OFFLINE 0x1000 オフライン属性。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_READONLY)) then begin FAddStrValue('FILE_ATTRIBUTE_READONLY 0x1 読み取り専用属性。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_REPARSE_POINT)) then begin FAddStrValue('FILE_ATTRIBUTE_REPARSE_POINT 0x400 再解析ポイントが関連付けられています。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_SPARSE_FILE)) then begin FAddStrValue('FILE_ATTRIBUTE_SPARSE_FILE 0x200 スパースファイル(疎なファイル、未使用の領域が多い、または同じ値が長く続くファイル)です。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_SYSTEM)) then begin FAddStrValue('FILE_ATTRIBUTE_SYSTEM 0x4 システム属性。'); end; if (gfnbFlagCheck(iValue, FILE_ATTRIBUTE_TEMPORARY)) then begin FAddStrValue('FILE_ATTRIBUTE_TEMPORARY 0x100 テンポラリ属性。'); end; end; var ls_File : WideString; li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', 'このウィンドウを起動した実行ファイルが対象になります。'); FAddElement('lpFileName', '調べたいファイル名を指定します。'); FAddElement('戻り値', '関数が成功すると指定したファイルまたはディレクトリの属性が返ります。関数が失敗すると-1が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin ls_File := gfnsExeNameGet(FhWndHandle); if (ls_File = '') then begin FAddStrValue('実行ファイル名を取得できません'); end else begin FAddStrValue(ls_File); end; li_Ret := GetFileAttributesW(PWideChar(ls_File)); FAddIntValue(li_Ret); _AddAttributes(li_Ret); end; end; // GetFileVersionInfo ---------------------------------------------------------- procedure T_MyAPIValue.FGetFileVersionInfo; const lcs_DECLARATION = 'BOOL GetFileVersionInfo(LPTSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData);'; lcs_DESCRIPTION = '指定されたファイルのバージョン情報リソースを取得します。' + lcsTITLE_CRLF + 'lptstrFilename 調べたいファイル名を指定' + lcsCRLF + 'dwHandle 無視されます' + lcsCRLF + 'dwLen バッファのサイズを指定(GetFileVersionInfoSizeで取得した値をセット)' + lcsCRLF + 'lpData ファイルのバージョン情報が格納されるバッファへのポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; var ls_File : WideString; li_Size : DWORD; li_Reserved : DWORD; lp_Buff : Pointer; lb_Ret : Boolean; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', 'このウィンドウを起動した実行ファイルが対象になります。'); FAddElement('lptstrFilename', '調べたいファイル名を指定します。'); FAddElement('dwLen', 'GetFileVersionInfoSizeの戻り値をセット。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); FAddElement('lpData', 'lpDataのダンプリスト'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin ls_File := gfnsExeNameGet(FhWndHandle); if (ls_File = '') then begin FAddStrValue('実行ファイル名を取得できません'); end else begin FAddStrValue(ls_File); end; li_Size := GetFileVersionInfoSizeW(PWideChar(ls_File), li_Reserved); FAddIntValue(li_Size); lp_Buff := AllocMem((li_Size) * SizeOf(WideChar)); try lb_Ret := GetFileVersionInfoW(PWideChar(ls_File), li_Reserved, li_Size, lp_Buff); FAddBoolValue(lb_Ret); if (lb_Ret) then begin FAddDumpValue(lp_Buff, li_Size, True); end; finally FreeMem(lp_Buff); end; end; end; // GetFileVersionInfoSize ------------------------------------------------------ procedure T_MyAPIValue.FGetFileVersionInfoSize; const lcs_DECLARATION = 'DWORD GetFileVersionInfoSize(LPTSTR lptstrFilename, LPDWORD lpdwHandle);'; lcs_DESCRIPTION = '指定されたファイルからバージョン情報を取得できるかどうかを調べます。取得可能な場合そのバージョン情報を取得するために必要なサイズがバイト単位で返ります。' + lcsTITLE_CRLF + 'lptstrFilename 調べたいファイル名を指定' + lcsCRLF + 'lpdwHandle DWORDを受け取る変数のポインタを指定しますが、現状は必ず0に設定されるため意味はありません。' + lcsCRLF + '戻り値 関数が成功するとファイルのバージョン情報取得のために必要なサイズがバイト単位で返ります。失敗すると0が返ります。' ; var ls_File : WideString; li_Reserved : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', 'このウィンドウを起動した実行ファイルが対象になります。'); FAddElement('lptstrFilename', '調べたいファイル名を指定します。'); // FAddElement('lpdwHandle', 'DWORDを受け取る変数のポインタを指定。'); FAddElement('戻り値', '関数が成功するとファイルのバージョン情報取得のために必要なサイズがバイト単位で返ります。失敗すると0が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin ls_File := gfnsExeNameGet(FhWndHandle); if (ls_File = '') then begin FAddStrValue('実行ファイル名を取得できません'); end else begin FAddStrValue(ls_File); end; FAddIntValue(GetFileVersionInfoSizeW(PWideChar(ls_File), li_Reserved)); end; end; // VerQueryValue --------------------------------------------------------------- procedure T_MyAPIValue.FVerQueryValue; const lcsSTRUCT_VS_FIXEDFILEINFO = lcsSTRUCT_CRLF + 'typedef struct tagVS_FIXEDFILEINFO {' + lcsCRLF + ' DWORD dwSignature; //シグネチャー(0xFEEF04BD)' + lcsCRLF + ' DWORD dwStrucVersion; //この構造体のバージョン。上位WORDがメジャー、下位WORDがマイナーバージョン。' + lcsCRLF + ' DWORD dwFileVersionMS; //ファイルバージョン中のメジャーバージョン(上位WORD)とマイナーバージョン(下位WORD)' + lcsCRLF + ' DWORD dwFileVersionLS; //ファイルバージョン中のリリース番号(上位WORD)とビルド番号(下位WORD)' + lcsCRLF + ' DWORD dwProductVersionMS; //製品バージョン中のメジャーバージョン(上位WORD)とマイナーバージョン(下位WORD)' + lcsCRLF + ' DWORD dwProductVersionLS; //製品バージョン中のリリース番号(上位WORD)とビルド番号(下位WORD)' + lcsCRLF + ' DWORD dwFileFlagsMask;' + lcsCRLF + ' DWORD dwFileFlags;' + lcsCRLF + ' DWORD dwFileOS;' + lcsCRLF + ' DWORD dwFileType;' + lcsCRLF + ' DWORD dwFileSubtype;' + lcsCRLF + ' DWORD dwFileDateMS;' + lcsCRLF + ' DWORD dwFileDateLS;' + lcsCRLF + '} VS_FIXEDFILEINFO;' ; const lcs_DECLARATION = 'BOOL VerQueryValue(const LPVOID pBlock, LPTSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen);'; lcs_DESCRIPTION = 'GetFileVersionInfo関数で取得したバージョン情報リソースからバージョン情報を取得します。' + lcsTITLE_CRLF + 'pBlock GetFileVersionInfo関数で取得したバージョン情報リソースを指定します。' + lcsCRLF + 'lpSubBlock 取得対象のバージョン情報のタイプを示す以下のいずれかの形式を指定します。' + lcsCRLF + ' \' + lcsCRLF + ' ルートブロックの指定。バージョン情報リソース用のVS_FIXEDFILEINFO構造体を取得します。' + lcsCRLF + ' \VarFileInfo\Translation' + lcsCRLF + ' 言語識別子とコードページ識別子との複数のペアからなる配列を取得します。' + lcsCRLF + ' \StringFileInfo\\' + lcsCRLF + ' に以下の文字列を指定することで対応するバージョン情報を取得します。' + lcsCRLF + ' Comments コメント' + lcsCRLF + ' CompanyName 会社名' + lcsCRLF + ' FileDescription 説明' + lcsCRLF + ' FileVersion ファイルバージョン' + lcsCRLF + ' InternalName 内部名' + lcsCRLF + ' LegalCopyright 著作権' + lcsCRLF + ' LegalTrademarks 商標' + lcsCRLF + ' OriginalFilename 元のファイル名' + lcsCRLF + ' PrivateBuild プライベートビルド' + lcsCRLF + ' ProductName 製品名' + lcsCRLF + ' ProductVersion 製品バージョン' + lcsCRLF + ' SpecialBuild スペシャルビルド' + lcsCRLF + 'lplpBuffer lpSubBlockで指定したタイプに応じた情報が格納されます。' + lcsCRLF + 'puLen バージョン情報の値の長さが文字単位で格納されます。' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; procedure _AddHiLoWord(iValue: DWORD); begin FAddStrValue(Format('0x%0:.8x %d %d', [iValue, iValue shr 16, iValue and $FFFF])); //(iValue shl 16) shr 16])); end; procedure _VerQueryValue_Root(pBuff: Pointer); procedure _AddModuleType(iValue: DWORD); var ls_Value: WideString; begin ls_Value := ''; if (iValue and VS_FF_DEBUG = VS_FF_DEBUG) then begin ls_Value := 'VS_FF_DEBUG '; end; if (iValue and VS_FF_INFOINFERRED = VS_FF_INFOINFERRED) then begin ls_Value := ls_Value + 'VS_FF_INFOINFERRED '; end; if (iValue and VS_FF_PATCHED = VS_FF_PATCHED) then begin ls_Value := ls_Value + 'VS_FF_PATCHED '; end; if (iValue and VS_FF_PRERELEASE = VS_FF_PRERELEASE) then begin ls_Value := ls_Value + 'VS_FF_PRERELEASE '; end; if (iValue and VS_FF_PRIVATEBUILD = VS_FF_PRIVATEBUILD) then begin ls_Value := ls_Value + 'VS_FF_PRIVATEBUILD '; end; if (iValue and VS_FF_SPECIALBUILD = VS_FF_SPECIALBUILD) then begin ls_Value := ls_Value + 'VS_FF_SPECIALBUILD '; end; FAddStrValue(Format('0x%.8x %s', [iValue, ls_Value])); end; procedure _AddOSType(iValue: DWORD); var ls_Value: WideString; begin if (iValue = 0) then begin ls_Value := '不明'; end else begin ls_Value := ''; if (iValue and VOS_DOS = VOS_DOS) then begin ls_Value := ls_Value + 'MS-DOS用 '; end; if (iValue and VOS_NT = VOS_NT) then begin ls_Value := ls_Value + 'NT用 '; end; if (iValue and VOS__WINDOWS16 = VOS__WINDOWS16) then begin ls_Value := ls_Value + '16bit Windows用 '; end; if (iValue and VOS__WINDOWS32 = VOS__WINDOWS32) then begin ls_Value := ls_Value + '32bit Windows用 '; end; if (iValue and VOS_OS216 = VOS_OS216) then begin ls_Value := ls_Value + '16bit OS/2用 '; end; if (iValue and VOS_OS232 = VOS_OS232) then begin ls_Value := ls_Value + '32bit OS/2用 '; end; if (iValue and VOS__PM16 = VOS__PM16) then begin ls_Value := ls_Value + '16bit プレゼンテーションマネージャ用 '; end; if (iValue and VOS__PM32 = VOS__PM32) then begin ls_Value := ls_Value + '32bit プレゼンテーションマネージャ用 '; end; end; FAddStrValue(Format('0x%.8x %s', [iValue, ls_Value])); end; procedure _AddFileType(iValue: DWORD); var ls_Value: WideString; begin ls_Value := ''; if (iValue and VOS_DOS_WINDOWS16 = VOS_DOS_WINDOWS16) then begin ls_Value := ls_Value + '16bit Windows用 '; end; if (iValue and VOS_DOS_WINDOWS32 = VOS_DOS_WINDOWS32) then begin ls_Value := ls_Value + '32bit Windows用 '; end; if (iValue and VOS_NT_WINDOWS32 = VOS_NT_WINDOWS32) then begin ls_Value := ls_Value + 'NT用 '; end; if (iValue and VOS_OS216_PM16 = VOS_OS216_PM16) then begin ls_Value := ls_Value + '16bit OS/2上のプレゼンテーションマネージャ用 '; end; if (iValue and VOS_OS232_PM32 = VOS_OS232_PM32) then begin ls_Value := ls_Value + '32bit OS/2上のプレゼンテーションマネージャ用 '; end; FAddStrValue(Format('0x%.8x %s', [iValue, ls_Value])); end; var lb_Ret : Boolean; lp_Data : Pointer; li_Len : UINT; begin //\ FAddBlank; lb_Ret := VerQueryValueW(pBuff, '\', lp_Data, li_Len); FAddBoolValue(lb_Ret); if (lb_Ret) then begin FAddIntValue (li_Len); FAddHexValue (TVSFixedFileInfo(lp_Data^).dwSignature); _AddHiLoWord (TVSFixedFileInfo(lp_Data^).dwStrucVersion); _AddHiLoWord (TVSFixedFileInfo(lp_Data^).dwFileVersionMS); _AddHiLoWord (TVSFixedFileInfo(lp_Data^).dwFileVersionLS); _AddHiLoWord (TVSFixedFileInfo(lp_Data^).dwProductVersionMS); _AddHiLoWord (TVSFixedFileInfo(lp_Data^).dwProductVersionLS); FAddHexValue (TVSFixedFileInfo(lp_Data^).dwFileFlagsMask); _AddModuleType(TVSFixedFileInfo(lp_Data^).dwFileFlags); _AddOSType (TVSFixedFileInfo(lp_Data^).dwFileOS); _AddFileType (TVSFixedFileInfo(lp_Data^).dwFileType); FAddHexValue (TVSFixedFileInfo(lp_Data^).dwFileSubtype); _AddHiLoWord (TVSFixedFileInfo(lp_Data^).dwFileDateMS); _AddHiLoWord (TVSFixedFileInfo(lp_Data^).dwFileDateLS); end else begin FAddBlank(14); end; end; procedure _VerQueryValue_Transrate(pBuff: Pointer); type T_LangAndCodePage = record case Integer of 1:(iValue: DWORD); 2:(iLanguage, iCodePage: WORD); end; P_LangAndCodePage = ^T_LangAndCodePage; procedure _PutFileVer(pData: Pointer; sLang_CodePage, sString_Name, sHint: WideString); var lp_Dat : Pointer; li_Len : UINT; begin if (VerQueryValueW(pData, PWideChar(sLang_CodePage + sString_Name), lp_Dat, li_Len)) then begin FAddElement(' ' + sString_Name, sHint); FAddStrValue (WideString(PWideChar(lp_Dat))); //FAddElement(' puLen'); FAddIntValue (li_Len); end; end; var lb_Ret : Boolean; li_Len : UINT; i: Integer; lp_LangCodePage : P_LangAndCodePage; ls_LangCodePage : WideString; lp_Dat : Pointer; begin //\VarFileInfo\Translation FAddBlank; // lb_Ret := VerQueryValueW(pBuff, '\VarFileInfo\Translation', Pointer(lp_LangCodePage), li_Len); lb_Ret := VerQueryValueW(pBuff, '\VarFileInfo\Translation', lp_Dat, li_Len); FAddBoolValue(lb_Ret); if (lb_Ret) then begin FAddIntValue(li_Len); for i := 0 to (li_Len div SizeOf(T_LangAndCodePage)) -1 do begin lp_LangCodePage := P_LangAndCodePage(@PAnsiChar(lp_Dat)[i * 2]); FAddElement ('言語/コードページ', '言語とコードページ'); FAddStrValue(WideFormat('0x%0:.8x 言語:0x%1:.4x %1:d %s/コードページ:0x%3:.4x %3:d %s', [ lp_LangCodePage.iValue, lp_LangCodePage.iLanguage, gfnsLanguageGet(lp_LangCodePage.iLanguage), lp_LangCodePage.iCodePage, gfnsCodePageGet(lp_LangCodePage.iLanguage, lp_LangCodePage.iCodePage) ])); //\StringFileInfo\\ ls_LangCodePage := WideFormat('\StringFileInfo\%.4x%.4x\', [ lp_LangCodePage.iLanguage, lp_LangCodePage.iCodePage ]); FAddElement(' lpSubBlock:' + ls_LangCodePage); FAddBlank; _PutFileVer(pBuff, ls_LangCodePage, 'Comments', 'コメント'); _PutFileVer(pBuff, ls_LangCodePage, 'CompanyName', '会社名'); _PutFileVer(pBuff, ls_LangCodePage, 'FileDescription', '説明'); _PutFileVer(pBuff, ls_LangCodePage, 'FileVersion', 'ファイルバージョン'); _PutFileVer(pBuff, ls_LangCodePage, 'InternalName', '内部名'); _PutFileVer(pBuff, ls_LangCodePage, 'LegalCopyright', '著作権'); _PutFileVer(pBuff, ls_LangCodePage, 'LegalTrademarks', '商標'); _PutFileVer(pBuff, ls_LangCodePage, 'OriginalFilename', '正式ファイル名'); _PutFileVer(pBuff, ls_LangCodePage, 'PrivateBuild', 'プライベートビルド情報'); _PutFileVer(pBuff, ls_LangCodePage, 'ProductName', '製品名'); _PutFileVer(pBuff, ls_LangCodePage, 'ProductVersion', '製品バージョン'); _PutFileVer(pBuff, ls_LangCodePage, 'SpecialBuild', 'スペシャルビルド情報'); end; end else begin FAddBlank(1); end; end; var ls_File : WideString; li_Reserved : DWORD; li_Size : DWORD; lp_Buff : Pointer; begin //このAPIには可変部分があるので他のAPIのように表示の効率化は行わない。 // if not(IsNowAPI(lcs_DECLARATION)) then begin FbRefresh := True; //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('対象ウィンドウ', 'このウィンドウを起動した実行ファイルが対象になります。'); if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddElement('lptstrFilename', '調べたいファイル名を指定します。'); ls_File := gfnsExeNameGet(FhWndHandle); if (ls_File = '') then begin FAddStrValue('実行ファイル名を取得できません'); Exit; end else begin FAddStrValue(ls_File); end; li_Size := GetFileVersionInfoSizeW(PWideChar(ls_File), li_Reserved); if (li_Size = 0) then begin Exit; end else begin lp_Buff := AllocMem((li_Size) * SizeOf(WideChar)); try if (GetFileVersionInfoW(PWideChar(ls_File), li_Reserved, li_Size, lp_Buff)) then begin FAddElement('lpSubBlock:\', 'バージョン情報リソースを収めるVS_FIXEDFILEINFO構造体を取得。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); FAddElement('puLen'); FAddElement(' VS_FIXEDFILEINFO.dwSignature'); FAddElement(' VS_FIXEDFILEINFO.dwStrucVersion'); FAddElement(' VS_FIXEDFILEINFO.dwFileVersionMS'); FAddElement(' VS_FIXEDFILEINFO.dwFileVersionLS'); FAddElement(' VS_FIXEDFILEINFO.dwProductVersionMS'); FAddElement(' VS_FIXEDFILEINFO.dwProductVersionLS'); FAddElement(' VS_FIXEDFILEINFO.dwFileFlagsMask'); FAddElement(' VS_FIXEDFILEINFO.dwFileFlags'); FAddElement(' VS_FIXEDFILEINFO.dwFileOS'); FAddElement(' VS_FIXEDFILEINFO.dwFileType'); FAddElement(' VS_FIXEDFILEINFO.dwFileSubtype'); FAddElement(' VS_FIXEDFILEINFO.dwFileDateMS'); FAddElement(' VS_FIXEDFILEINFO.dwFileDateLS'); _VerQueryValue_Root(lp_Buff); FAddElement('lpSubBlock:\VarFileInfo\Translation'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); FAddElement('puLen'); _VerQueryValue_Transrate(lp_Buff); end; finally FreeMem(lp_Buff); end; end; end; end; // GetLayeredWindowAttributes -------------------------------------------------- function gfnbGetLayeredWindowAttributes(hHandle: HWND; var crKey: COLORREF; var bAlpha: BYTE; var dwFlags: DWORD): Boolean; {2015-03-10: } begin Result := False; if (@F_GetLayeredWindowAttributes <> nil) then begin Result := F_GetLayeredWindowAttributes( hHandle, crKey, bAlpha, dwFlags ); end; end; procedure T_MyAPIValue.FGetLayeredWindowAttributes; const lcs_DECLARATION = 'BOOL WINAPI GetLayeredWindowAttributes(HWND hwnd, COLORREF *pcrKey, BYTE *pbAlpha, DWORD *pdwFlags);'; lcs_DESCRIPTION = 'レイヤードウィンドウの透明度および透明にするカラーキーを取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウが属すトップレベルウィンドウのハンドルを指定' + lcsCRLF + 'pcrKey 透明にするカラーキーを受け取る変数のポインタを指定' + lcsCRLF + 'pbAlpha ウィンドウの透明度(アルファブレンド値)を受け取る変数のポインタを指定' + lcsCRLF + 'pdwFlags レイヤードウィンドウのフラグ(透明度を使うのか透明にするカラーキーを使うのか)を受け取る変数のポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' + lcsCRLF + 'この関数はhwndに子ウィンドウを指定すると失敗します。' ; function _GetLayeredFlag(iFlag: DWORD): WideString; const LWA_ALPHA = $2; LWA_COLORKEY = $1; begin case iFlag of LWA_ALPHA: Result := 'LWA_ALPHA'; LWA_COLORKEY: Result := 'LWA_COLORKEY'; else Result := 'エラー'; end; Result := Format('%s 0x%1:.8x %1:u', [Result, iFlag]); end; var li_Key : COLORREF; li_Alpha : BYTE; li_Flags : DWORD; lb_Ret : Boolean; ls_Err : String; li_ExStyle : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウが属すトップレベルウィンドウのハンドルを指定します。' + lcsCRLF + '子ウィンドウのハンドルを指定した場合はエラーが返ります。'); FAddElement('pcrKey', '透明にするカラーキーを受け取る変数のポインタを指定します。' + lcsCRLF + 'pdwFlagsにLWA_COLORKEY(0x00000001)が指定されていないと"指定なし"になります。'); FAddElement('pbAlpha', 'ウィンドウの透明度(アルファブレンド値)を受け取る変数のポインタを指定します。' + lcsCRLF + 'pdwFlagsにLWA_ALPHA(0x00000002)が指定されていないと"指定なし"になります。'); FAddElement('pdwFlags', 'レイヤードウィンドウのフラグを受け取る変数のポインタを指定します。' + lcsCRLF + '透明にするカラーキー(pcrKey)を使う場合はLWA_COLORKEY(0x00000001)が、透明度(pbAlpha)を使う場合はLWA_ALPHA(0x00000002)が返ります。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' + lcsCRLF + 'hwndに子ウィンドウを指定するとこの関数は失敗します。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lb_Ret := gfnbGetLayeredWindowAttributes(FhWndHandle, li_Key, li_Alpha, li_Flags); if (lb_Ret) then begin if (gfnbFlagCheck(li_Flags, LWA_COLORKEY)) then begin //カラーキー指定あり FAddColorName(li_Key); end else begin FAddStrValue('指定無し'); end; if (gfnbFlagCheck(li_Flags, LWA_ALPHA)) then begin //アルファ値指定あり FAddIntValue(li_Alpha); end else begin FAddStrValue('指定無し'); end; // FAddHexValue(li_Flags); FAddStrValue(_GetLayeredFlag(li_Flags)); end else begin li_ExStyle := GetWindowLong(FhWndHandle, GWL_EXSTYLE); if (gfnbFlagCheck(li_ExStyle, WS_EX_LAYERED)) and (gfnbFlagCheck(li_ExStyle, WS_EX_TRANSPARENT)) then begin //レイヤードウィンドウだった ls_Err := 'エラー'; end else begin ls_Err := 'レイヤードウィンドウではありません'; end; FAddStrValue(ls_Err); FAddStrValue(ls_Err); FAddStrValue(ls_Err); end; FAddBoolValue(lb_Ret); end; end; // GetListBoxInfo -------------------------------------------------------------- procedure T_MyAPIValue.FGetListBoxInfo; const lcs_DECLARATION = 'DWORD GetListBoxInfo(HWND hwnd);'; lcs_DESCRIPTION = '指定されたリストボックスに関する情報を取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいリストボックスのハンドルを指定' + lcsCRLF + '戻り値 リストボックス内の項目数が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいリストボックスのハンドルを指定します。'); FAddElement('戻り値', 'リストボックス内の項目数が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddIntValue(GetListBoxInfo(FhWndHandle)); end; end; // GetNextWindow --------------------------------------------------------------- procedure T_MyAPIValue.FGetNextWindow; const lcs_DECLARATION = 'HWND GetNextWindow(HWND hWnd, UINT wCmd);'; lcs_DESCRIPTION = '指定されたウィンドウの次または一つ前の兄弟ウィンドウのハンドルを返します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'wCmd 次か前、どちらのウィンドウを取得するかを指定' + lcsCRLF + ' GW_HWNDNEXT 指定したウィンドウの次(下)にある兄弟ウィンドウを取得' + lcsCRLF + ' GW_HWNDPREV 指定したウィンドウの一つ前(上)にある兄弟ウィンドウを取得' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。' + lcsCRLF + 'wCmd パラメータの指定によりこのウィンドウの次または一つ前のウィンドウが検索されます。'); FAddElement('wCmd: GW_HWNDNEXT', 'wCmdにGW_HWNDNEXTを指定した時の戻り値。' + lcsCRLF + '指定ウィンドウの次(下)にある兄弟ウィンドウのハンドルが返ります。'); FAddElement('wCmd: GW_HWNDPREV', 'wCmdにGW_HWNDPREVを指定した時の戻り値。' + lcsCRLF + '指定したウィンドウの一つ前(上)にある兄弟ウィンドウのハンドルが返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddWindowValue(GetNextWindow(FhWndHandle, GW_HWNDNEXT)); FAddWindowValue(GetNextWindow(FhWndHandle, GW_HWNDPREV)); end; end; // GetParent ------------------------------------------------------------------- procedure T_MyAPIValue.FGetParent; const lcs_DECLARATION = 'HWND GetParent(HWND hWnd);'; lcs_DESCRIPTION = '指定されたウィンドウの親ウィンドウまたはオーナーウィンドウのハンドルを返します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + '戻り値 指定したウィンドウの親ウィンドウまたはオーナーウィンドウのハンドルが返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '子ウィンドウまたはトップレベルウィンドウのハンドルを指定します。'); FAddElement('戻り値', '指定したウィンドウが子ウィンドウの場合は親ウィンドウのハンドルが返ります。' + lcsCRLF + '指定したウィンドウがトップレベルウィンドウの場合はオーナーウィンドウのハンドルが返ります。' + lcsCRLF + '指定したウィンドウがオーナーを持たないトップレベルウィンドウだった場合および関数が失敗した場合は0(NULL)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddWindowValue(GetParent(FhWndHandle)); end; end; // GetScrollBarInfo ------------------------------------------------------------ procedure T_MyAPIValue.FGetScrollBarInfo; const lcsSTRUCT_SCROLLBARINFO = lcsSTRUCT_CRLF + 'typedef struct tagSCROLLBARINFO {' + lcsCRLF + ' DWORD cbSize; //この構造体のサイズ(必ずセットすること)' + lcsCRLF + ' RECT rcScrollBar; //スクロールバーの矩形領域(RECT)' + lcsCRLF + ' int dxyLineButton; //つまみの高さまたは幅' + lcsCRLF + ' int xyThumbTop; //つまみのTopまたはLeftの値' + lcsCRLF + ' int xyThumbBottom; //つまみのBottomまたはRightの値' + lcsCRLF + ' int reserved; //予約' + lcsCRLF + ' DWORD rgstate[CCHILDREN_SCROLLBAR+1]; //スクロールバーの各要素の状態' + lcsCRLF + '} SCROLLBARINFO, *PSCROLLBARINFO, *LPSCROLLBARINFO;' ; const lcs_DECLARATION = 'BOOL GetScrollBarInfo(HWND hwnd, LONG idObject, PSCROLLBARINFO psbi);'; lcs_DESCRIPTION = '指定されたスクロールバーの情報を取得します。' + lcsCRLF + 'hwnd 調べたいスクロールバーに関連付けられたウィンドウのハンドルを指定' + lcsCRLF + 'idObject スクロールバーの種類を指定' + lcsCRLF + ' OBJID_CLIENT hwndはスクロールバーコントロールのハンドル' + lcsCRLF + ' OBJID_HSCROLL hwndで指定したウィンドウの水平スクロールバー' + lcsCRLF + ' OBJID_VSCROLL hwndで指定したウィンドウの垂直スクロールバー' + lcsCRLF + 'psbi 情報を受け取るSCROLLBARINFO構造体の変数のポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が返り、失敗すると0(False)が返ります。' + lcsCRLF + lcsSTRUCT_SCROLLBARINFO + lcsCRLF + lcsCRLF + 'rgstate配列の内容' + lcsCRLF + '0 スクロールバーの状態' + lcsCRLF + '1 ↑または→ボタンの状態' + lcsCRLF + '2 ページアップエリアの状態' + lcsCRLF + '3 つまみの状態' + lcsCRLF + '4 ページダウンエリアの状態' + lcsCRLF + '5 ↓または←ボタンの状態' + lcsCRLF +// lcsCRLF + '状態の内容' + lcsCRLF + 'STATE_SYSTEM_INVISIBLE = 0x00008000 非表示' + lcsCRLF + 'STATE_SYSTEM_OFFSCREEN = 0x00010000 非可視状態' + lcsCRLF + 'STATE_SYSTEM_PRESSED = 0x00000008 押下状態' + lcsCRLF + 'STATE_SYSTEM_UNAVAILABLE = 0x00000001 無効' ; function _GetStateValue(sStr: WideString; iState: DWORD): WideString; var ls_State : WideString; begin ls_State := ''; if (gfnbFlagCheck(iState, STATE_SYSTEM_INVISIBLE)) then ls_State := ls_State + ' 非表示'; if (gfnbFlagCheck(iState, STATE_SYSTEM_OFFSCREEN)) then ls_State := ls_State + ' 非可視状態'; if (gfnbFlagCheck(iState, STATE_SYSTEM_PRESSED)) then ls_State := ls_State + ' 押下状態'; if (gfnbFlagCheck(iState, STATE_SYSTEM_UNAVAILABLE)) then ls_State := ls_State + ' 無効'; Result := WideFormat('0x%.8x (%s)%s', [iState, sStr, ls_State]); end; var l_Psbi : TScrollBarInfo; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '情報を取得するスクロールバーのハンドルを指定します。'); FAddElement('idObject: OBJID_CLIENT', 'hwndはスクロールバー自身'); FAddElement(' psbi.rcScrollBar', 'スクロールバーのRECT。'); FAddElement(' psbi.dxyLineButton', 'つまみの高さまたは幅。'); FAddElement(' psbi.xyThumbTop', 'つまみのTopまたはLeftの値。'); FAddElement(' psbi.xyThumbBottom', 'つまみのBottomまたはRightの値。'); FAddElement(' psbi.rgstate[0]', 'スクロールバーの状態。'); FAddElement(' psbi.rgstate[1]', '↑または→ボタンの状態。'); FAddElement(' psbi.rgstate[2]', 'ページアップエリアの状態。'); FAddElement(' psbi.rgstate[3]', 'つまみの状態。'); FAddElement(' psbi.rgstate[4]', 'ページダウンエリアの状態。'); FAddElement(' psbi.rgstate[5]', '↓または←ボタンの状態。'); FAddElement('idObject: OBJID_HSCROLL', 'hwndで指定したウィンドウの水平スクロールバー'); FAddElement(' psbi.rcScrollBar', 'スクロールバーのRECT。'); FAddElement(' psbi.dxyLineButton', 'つまみの高さ。'); FAddElement(' psbi.xyThumbTop', 'つまみのLeftの値。'); FAddElement(' psbi.xyThumbBottom', 'つまみのRightの値。'); FAddElement(' psbi.rgstate[0]', 'スクロールバーの状態。'); FAddElement(' psbi.rgstate[1]', '↑または→ボタンの状態。'); FAddElement(' psbi.rgstate[2]', 'ページアップエリアの状態。'); FAddElement(' psbi.rgstate[3]', 'つまみの状態。'); FAddElement(' psbi.rgstate[4]', 'ページダウンエリアの状態。'); FAddElement(' psbi.rgstate[5]', '↓または←ボタンの状態。'); FAddElement('idObject: OBJID_VSCROLL', 'hwndで指定したウィンドウの垂直スクロールバー'); FAddElement(' psbi.rcScrollBar', 'スクロールバーのRECT。'); FAddElement(' psbi.dxyLineButton', 'つまみの幅。'); FAddElement(' psbi.xyThumbTop', 'つまみのTopの値。'); FAddElement(' psbi.xyThumbBottom', 'つまみのBottomの値。'); FAddElement(' psbi.rgstate[0]', 'スクロールバーの状態。'); FAddElement(' psbi.rgstate[1]', '↑または→ボタンの状態。'); FAddElement(' psbi.rgstate[2]', 'ページアップエリアの状態。'); FAddElement(' psbi.rgstate[3]', 'つまみの状態。'); FAddElement(' psbi.rgstate[4]', 'ページダウンエリアの状態。'); FAddElement(' psbi.rgstate[5]', '↓または←ボタンの状態。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が返り、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FillChar(l_Psbi, 0, SizeOf(l_Psbi)); l_Psbi.cbSize := SizeOf(l_Psbi); FAddBoolValue(GetScrollBarInfo(FhWndHandle, Longint(OBJID_CLIENT), l_Psbi)); FAddRectValue(l_Psbi.rcScrollBar); FAddIntValue (l_Psbi.dxyLineButton); FAddIntValue (l_Psbi.xyThumbTop); FAddIntValue (l_Psbi.xyThumbBottom); FAddStrValue (_GetStateValue ('スクロールバー', l_Psbi.rgstate[0])); FAddStrValue (_GetStateValue ('↑または→ボタン', l_Psbi.rgstate[1])); FAddStrValue (_GetStateValue ('ページアップエリア', l_Psbi.rgstate[2])); FAddStrValue (_GetStateValue ('つまみ', l_Psbi.rgstate[3])); FAddStrValue (_GetStateValue ('ページダウンエリア', l_Psbi.rgstate[4])); FAddStrValue (_GetStateValue ('↓または←ボタン', l_Psbi.rgstate[5])); //横スクロール FillChar(l_Psbi, 0, SizeOf(l_Psbi)); l_Psbi.cbSize := SizeOf(l_Psbi); FAddBoolValue(GetScrollBarInfo(FhWndHandle, Longint(OBJID_HSCROLL), l_Psbi)); FAddRectValue(l_Psbi.rcScrollBar); FAddIntValue (l_Psbi.dxyLineButton); FAddIntValue (l_Psbi.xyThumbTop); FAddIntValue (l_Psbi.xyThumbBottom); FAddStrValue (_GetStateValue ('スクロールバー', l_Psbi.rgstate[0])); FAddStrValue (_GetStateValue ('↑または→ボタン', l_Psbi.rgstate[1])); FAddStrValue (_GetStateValue ('ページアップエリア', l_Psbi.rgstate[2])); FAddStrValue (_GetStateValue ('つまみ', l_Psbi.rgstate[3])); FAddStrValue (_GetStateValue ('ページダウンエリア', l_Psbi.rgstate[4])); FAddStrValue (_GetStateValue ('↓または←ボタン', l_Psbi.rgstate[5])); //縦スクロール FillChar(l_Psbi, 0, SizeOf(l_Psbi)); l_Psbi.cbSize := SizeOf(l_Psbi); FAddBoolValue(GetScrollBarInfo(FhWndHandle, Longint(OBJID_VSCROLL), l_Psbi)); FAddRectValue(l_Psbi.rcScrollBar); FAddIntValue (l_Psbi.dxyLineButton); FAddIntValue (l_Psbi.xyThumbTop); FAddIntValue (l_Psbi.xyThumbBottom); FAddStrValue (_GetStateValue ('スクロールバー', l_Psbi.rgstate[0])); FAddStrValue (_GetStateValue ('↑または→ボタン', l_Psbi.rgstate[1])); FAddStrValue (_GetStateValue ('ページアップエリア', l_Psbi.rgstate[2])); FAddStrValue (_GetStateValue ('つまみ', l_Psbi.rgstate[3])); FAddStrValue (_GetStateValue ('ページダウンエリア', l_Psbi.rgstate[4])); FAddStrValue (_GetStateValue ('↓または←ボタン', l_Psbi.rgstate[5])); end; end; // GetScrollInfo --------------------------------------------------------------- procedure T_MyAPIValue.FGetScrollInfo; const lcsSTRUCT_SCROLLINFO = lcsSTRUCT_CRLF + 'typedef struct tagSCROLLINFO {' + lcsCRLF + ' UINT cbSize; //構造体のサイズ' + lcsCRLF + ' UINT fMask; //設定・変更用フラグ' + lcsCRLF + ' int nMin; //スクロールする最小値' + lcsCRLF + ' int nMax; //スクロールする最大値' + lcsCRLF + ' UINT nPage; //ページサイズ' + lcsCRLF + ' int nPos; //スクロールバーのつまみの現在の位置' + lcsCRLF + ' int nTrackPos; //現在のトラッキング位置' + lcsCRLF + '} SCROLLINFO;' ; const //function GetScrollInfo(hWnd: HWND; BarFlag: Integer; var ScrollInfo: TScrollInfo): BOOL; stdcall; lcs_DECLARATION = 'BOOL GetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi);'; lcs_DESCRIPTION = '指定されたスクロールバーのさまざまなパラメータを取得します。' + lcsCRLF + 'hwnd 調べたいスクロールバーに関連付けられたウィンドウのハンドルを指定' + lcsCRLF + 'fnBar スクロールバーの種類を指定' + lcsCRLF + ' SB_CTL hwndはスクロールバーコントロールのハンドル' + lcsCRLF + ' SB_HORZ hwndで指定したウィンドウの水平スクロールバー' + lcsCRLF + ' SB_VERT hwndで指定したウィンドウの垂直スクロールバー' + lcsCRLF + 'lpsi 情報を受け取るSCROLLINFO構造体の変数のポインタを指定' + lcsCRLF + '戻り値 なんらかの情報を取得した場合0以外の値が、何も情報も取得しなかった場合0が返ります。' + lcsCRLF + lcsSTRUCT_SCROLLINFO ; var l_ScrollInfo : TScrollInfo; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '情報を取得するスクロールバーのハンドルを指定します。'); FAddElement('fnBar: SB_CTL', 'hwndはスクロールバー自身のハンドルでその各種パラメータを取得します。'); FAddElement(' lpsi.nMin', 'スクロールする最小値。'); FAddElement(' lpsi.nMax', 'スクロールする最大値。'); FAddElement(' lpsi.nPage', 'ページサイズ。'); FAddElement(' lpsi.nPos', 'スクロールバーのつまみの現在の位置。'); FAddElement(' lpsi.nTrackPos', '現在のトラッキング位置。'); FAddElement('fnBar: SB_HORZ', 'hwndで指定したウィンドウの水平スクロールバーの各種パラメータを取得します。'); FAddElement(' lpsi.nMin', 'スクロールする最小値。'); FAddElement(' lpsi.nMax', 'スクロールする最大値。'); FAddElement(' lpsi.nPage', 'ページサイズ。'); FAddElement(' lpsi.nPos', 'スクロールバーのつまみの現在の位置。'); FAddElement(' lpsi.nTrackPos', '現在のトラッキング位置。'); FAddElement('fnBar: SB_VERT', 'hwndで指定したウィンドウの垂直スクロールバーの各種パラメータを取得します。'); FAddElement(' lpsi.nMin', 'スクロールする最小値。'); FAddElement(' lpsi.nMax', 'スクロールする最大値。'); FAddElement(' lpsi.nPage', 'ページサイズ。'); FAddElement(' lpsi.nPos', 'スクロールバーのつまみの現在の位置。'); FAddElement(' lpsi.nTrackPos', '現在のトラッキング位置。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FillChar(l_ScrollInfo, 0, SizeOf(l_ScrollInfo)); l_ScrollInfo.cbSize := SizeOf(l_ScrollInfo); l_ScrollInfo.fMask := SIF_ALL; FAddBoolValue(GetScrollInfo(FhWndHandle, SB_CTL, l_ScrollInfo)); FAddIntValue (l_ScrollInfo.nMin); FAddIntValue (l_ScrollInfo.nMax); FAddIntValue (l_ScrollInfo.nPage); FAddIntValue (l_ScrollInfo.nPos); FAddIntValue (l_ScrollInfo.nTrackPos); FillChar(l_ScrollInfo, 0, SizeOf(l_ScrollInfo)); l_ScrollInfo.cbSize := SizeOf(l_ScrollInfo); l_ScrollInfo.fMask := SIF_ALL; FAddBoolValue(GetScrollInfo(FhWndHandle, SB_HORZ, l_ScrollInfo)); FAddIntValue (l_ScrollInfo.nMin); FAddIntValue (l_ScrollInfo.nMax); FAddIntValue (l_ScrollInfo.nPage); FAddIntValue (l_ScrollInfo.nPos); FAddIntValue (l_ScrollInfo.nTrackPos); FillChar(l_ScrollInfo, 0, SizeOf(l_ScrollInfo)); l_ScrollInfo.cbSize := SizeOf(l_ScrollInfo); l_ScrollInfo.fMask := SIF_ALL; FAddBoolValue(GetScrollInfo(FhWndHandle, SB_VERT, l_ScrollInfo)); FAddIntValue (l_ScrollInfo.nMin); FAddIntValue (l_ScrollInfo.nMax); FAddIntValue (l_ScrollInfo.nPage); FAddIntValue (l_ScrollInfo.nPos); FAddIntValue (l_ScrollInfo.nTrackPos); end; end; // GetScrollPos ---------------------------------------------------------------- procedure T_MyAPIValue.FGetScrollPos; const lcs_DECLARATION = 'int GetScrollPos(HWND hWnd, int nBar);'; lcs_DESCRIPTION = '指定されたスクロールバーのつまみの位置を取得します。' + lcsCRLF + 'hWnd 調べたいスクロールバーに関連付けられたウィンドウのハンドルを指定' + lcsCRLF + 'nBar スクロールバーの種類を指定' + lcsCRLF + ' SB_CTL hWndはスクロールバーコントロールのハンドル' + lcsCRLF + ' SB_HORZ hWndで指定したウィンドウの水平スクロールバー' + lcsCRLF + ' SB_VERT hWndで指定したウィンドウの垂直スクロールバー' + lcsCRLF + '戻り値 関数が成功するとスクロールバーのつまみの位置が返り、失敗すると0(False)が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hWnd', '情報を取得するスクロールバーのハンドルを指定します。'); FAddElement('nBar: SB_CTL', 'hWndはスクロールバー自身のハンドルでそのつまみの位置を返します。'); FAddElement('nBar: SB_HORZ', 'hWndで指定したウィンドウの水平スクロールバーのつまみの位置を返します。'); FAddElement('nBar: SB_VERT', 'hWndで指定したウィンドウの垂直スクロールバーのつまみの位置を返します。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddIntValue(GetScrollPos(FhWndHandle, SB_CTL)); FAddIntValue(GetScrollPos(FhWndHandle, SB_HORZ)); FAddIntValue(GetScrollPos(FhWndHandle, SB_VERT)); end; end; // GetScrollRange -------------------------------------------------------------- procedure T_MyAPIValue.FGetScrollRange; const //function GetScrollRange(hWnd: HWND; nBar: Integer; var lpMinPos, lpMaxPos: Integer): BOOL; stdcall; lcs_DECLARATION = 'BOOL GetScrollRange(HWND hWnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos);'; lcs_DESCRIPTION = '指定されたスクロールバーのつまみの最大位置と最小位置を取得します。' + lcsCRLF + 'hWnd 調べたいスクロールバーに関連付けられたウィンドウのハンドルを指定' + lcsCRLF + 'nBar スクロールバーの種類を指定' + lcsCRLF + ' SB_CTL hWndはスクロールバーコントロールのハンドル' + lcsCRLF + ' SB_HORZ hWndで指定したウィンドウの水平スクロールバー' + lcsCRLF + ' SB_VERT hWndで指定したウィンドウの垂直スクロールバー' + lcsCRLF + 'lpMinPos つまみの最小位置が格納される変数へのポインタを指定' + lcsCRLF + 'lpMaxPos つまみの最大位置が格納される変数へのポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が返り、失敗すると0(False)が返ります。' ; var li_MinPos : Integer; li_MaxPos : Integer; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hWnd', '情報を取得するスクロールバーのハンドルを指定します。'); FAddElement('nBar: SB_CTL', 'hWndはスクロールバー自身のハンドルでそのつまみの最小位置と最大位置を取得します。'); FAddElement(' lpMinPos', 'つまみの最小位置が格納されます。'); FAddElement(' lpMaxPos', 'つまみの最大位置が格納されます。'); FAddElement('nBar: SB_HORZ', 'hWndで指定したウィンドウの水平スクロールバーのつまみの最小位置と最大位置を取得します。'); FAddElement(' lpMinPos', 'つまみの最小位置が格納されます。'); FAddElement(' lpMaxPos', 'つまみの最大位置が格納されます。'); FAddElement('nBar: SB_VERT', 'hWndで指定したウィンドウの垂直スクロールバーのつまみの最小位置と最大位置を取得します。'); FAddElement(' lpMinPos', 'つまみの最小位置が格納されます。'); FAddElement(' lpMaxPos', 'つまみの最大位置が格納されます。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin li_MinPos := 0; li_MaxPos := 0; FAddBoolValue(GetScrollRange(FhWndHandle, SB_CTL, li_MinPos, li_MaxPos)); FAddIntValue (li_MinPos); FAddIntValue (li_MaxPos); FAddBoolValue(GetScrollRange(FhWndHandle, SB_HORZ, li_MinPos, li_MaxPos)); FAddIntValue (li_MinPos); FAddIntValue (li_MaxPos); FAddBoolValue(GetScrollRange(FhWndHandle, SB_VERT, li_MinPos, li_MaxPos)); FAddIntValue (li_MinPos); FAddIntValue (li_MaxPos); end; end; // GetTitleBarInfo ------------------------------------------------------------- //D6のGetTitleBarInfoの宣言が間違っているためここで再宣言する。 function GetTitleBarInfo(hwnd: HWND; var pti: TTitleBarInfo): BOOL; stdcall; external user32 name 'GetTitleBarInfo'; procedure T_MyAPIValue.FGetTitleBarInfo; const lcsSTRUCT_TITLEBARINFO = lcsSTRUCT_CRLF + 'typedef struct tagTITLEBARINFO {' + lcsCRLF + ' DWORD cbSize; //構造体のサイズ(必ずセットすること)' + lcsCRLF + ' RECT rcTitleBar; //タイトルバーの矩形領域(RECT)' + lcsCRLF + ' DWORD rgstate[CCHILDREN_TITLEBAR + 1]; //登録ステータス' + lcsCRLF + '} TITLEBARINFO, *LPTITLEBARINFO;' ; const lcs_DECLARATION = 'BOOL GetTitleBarInfo(HWND hwnd, PTITLEBARINFO pti);'; lcs_DESCRIPTION = '指定されたウィンドウのタイトルバーの情報を取得します。' + lcsCRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'pti 情報を受け取るTITLEBARINFO構造体の変数のポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が返り、失敗すると0(False)が返ります。' + lcsCRLF + lcsSTRUCT_TITLEBARINFO + lcsCRLF + lcsCRLF + 'rgstate配列の内容' + lcsCRLF + '0 タイトルバーの状態' + lcsCRLF + '1 予約' + lcsCRLF + '2 最小化ボタンの状態' + lcsCRLF + '3 最大化ボタンの状態' + lcsCRLF + '4 閉じるボタンの状態' + lcsCRLF + '5 ヘルプボタンの状態' + lcsCRLF +// lcsCRLF + '状態の内容' + lcsCRLF + 'STATE_SYSTEM_FOCUSABLE = 0x00100000 フォーカス可能' + lcsCRLF + 'STATE_SYSTEM_INVISIBLE = 0x00008000 非表示' + lcsCRLF + 'STATE_SYSTEM_OFFSCREEN = 0x00010000 非可視状態' + lcsCRLF + 'STATE_SYSTEM_UNAVAILABLE = 0x00000001 無効' + lcsCRLF + 'STATE_SYSTEM_PRESSED = 0x00000008 押下状態' ; function _GetStateValue(sStr: WideString; iState: DWORD): WideString; var ls_State : WideString; begin ls_State := ''; if (gfnbFlagCheck(iState, STATE_SYSTEM_FOCUSABLE)) then ls_State := ls_State + ' フォーカス可能'; if (gfnbFlagCheck(iState, STATE_SYSTEM_INVISIBLE)) then ls_State := ls_State + ' 非表示'; if (gfnbFlagCheck(iState, STATE_SYSTEM_OFFSCREEN)) then ls_State := ls_State + ' 非可視状態'; if (gfnbFlagCheck(iState, STATE_SYSTEM_UNAVAILABLE)) then ls_State := ls_State + ' 無効'; if (gfnbFlagCheck(iState, STATE_SYSTEM_PRESSED)) then ls_State := ls_State + ' 押下状態'; Result := WideFormat('0x%.8x (%s)%s', [iState, sStr, ls_State]); end; var lb_Ret : BOOL; l_Pti : TTitleBarInfo; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '情報を取得するタイトルバーのハンドルを指定します。'); FAddElement('pti.cbSize', '構造体のサイズをセットします。'#13#10'例) pti.cbSize := SizeOf(pti);'); FAddElement('pti.rcTitleBar', 'タイトルバーのRECT。ただしシステムメニューの部分は含まない。'); FAddElement('pti.rgstate[0]', 'タイトルバーの状態。'); FAddElement('pti.rgstate[1]', '予備'); FAddElement('pti.rgstate[2]', '最小化ボタンの状態。'); FAddElement('pti.rgstate[3]', '最大化ボタンの状態。'); FAddElement('pti.rgstate[4]', 'ヘルプボタンの状態。'); FAddElement('pti.rgstate[5]', '閉じるボタンの状態。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が返り、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FillChar(l_Pti, 0, SizeOf(l_Pti)); l_Pti.cbSize := SizeOf(l_Pti); lb_Ret := GetTitleBarInfo(FhWndHandle, l_Pti); FAddIntValue (l_Pti.cbSize); FAddRectValue(l_Pti.rcTitleBar); FAddStrValue (_GetStateValue ('タイトルバー', l_Pti.rgstate[0])); FAddStrValue (_GetStateValue ('予備', l_Pti.rgstate[1])); FAddStrValue (_GetStateValue ('最小化ボタン', l_Pti.rgstate[2])); FAddStrValue (_GetStateValue ('最大化ボタン', l_Pti.rgstate[3])); FAddStrValue (_GetStateValue ('ヘルプボタン', l_Pti.rgstate[4])); FAddStrValue (_GetStateValue ('閉じるボタン', l_Pti.rgstate[5])); FAddBoolValue(lb_Ret); end; end; // GetTopWindow ---------------------------------------------------------------- procedure T_MyAPIValue.FGetTopWindow; const lcs_DECLARATION = 'HWND GetTopWindow(HWND hWnd);'; lcs_DESCRIPTION = '指定されたウィンドウが持つ子ウィンドウのうちのZオーダーが一番上のウィンドウのハンドルを返します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + '戻り値 Zオーダーが一番上(一番手前)の子ウィンドウのハンドルが返ります。指定したウィンドウが子ウィンドウを持たない場合は0(NULL)が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。0(NULL)を指定するとZオーダーが一番上のウィンドウのハンドルが返ります。 '); FAddElement('戻り値', '関数が成功するとZオーダーが一番上の子ウィンドウのハンドルが返ります。' + lcsCRLF + '指定したウィンドウが子ウィンドウを持たない場合は0(NULL)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddWindowValue(GetTopWindow(FhWndHandle)); end; end; // GetWindow ------------------------------------------------------------------- procedure T_MyAPIValue.FGetWindow; const lcs_DECLARATION = 'HWND GetWindow(HWND hWnd, UINT uCmd);'; lcs_DESCRIPTION = '指定されたウィンドウと指定された関係にあるウィンドウのハンドルを返します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'uCmd ウィンドウとの関係を示す以下の値を指定' + lcsCRLF + ' GW_CHILD Zオーダーが一番上の子ウィンドウ' + lcsCRLF + ' GW_ENABLEDPOPUP 有効なポップアップウィンドウ' + lcsCRLF + ' GW_HWNDFIRST 同じ種類で最も高いZオーダーを持つウィンドウ' + lcsCRLF + ' GW_HWNDLAST 同じ種類で最も低いZオーダーを持つウィンドウ' + lcsCRLF + ' GW_HWNDNEXT Zオーダーが一つ下のウィンドウ' + lcsCRLF + ' GW_HWNDPREV Zオーダーが一つ上のウィンドウ' + lcsCRLF + ' GW_OWNER オーナーウィンドウ' ; const GW_ENABLEDPOPUP = 6; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。このウィンドウを元にuCmdパラメータの値に基づいてウィンドウが検索されます。'); FAddElement('uCmd: GW_CHILD', 'uCmdにGW_CHILDを指定した時の戻り値。' + lcsCRLF + '指定したウィンドウが親ウィンドウの場合は、Zオーダーが一番上の子ウィンドウのハンドルを取得します。それ以外の場合は、NULL が返ります。この関数は、指定されたウィンドウの子ウィンドウだけを調べます。それより下位の子孫は調べません。'); FAddElement('uCmd: GW_ENABLEDPOPUP', 'uCmdにGW_ENABLEDPOPUPを指定した時の戻り値。' + lcsCRLF + '指定したウィンドウをオーナーとする有効なポップアップウィンドウのハンドルを取得します(この検索では、GW_HWNDNEXTで見つかる最初のウィンドウを使います)。有効なポップアップウィンドウがない場合は、指定したウィンドウのハンドルが返ります。'); FAddElement('uCmd: GW_HWNDFIRST', 'uCmdにGW_HWNDFIRSTを指定した時の戻り値。' + lcsCRLF + '指定したウィンドウと同じ種類で最も高いZオーダーを持つウィンドウのハンドルを取得します。指定したウィンドウが最前面ウィンドウの場合は、最も高いZオーダーを持つ最前面ウィンドウのハンドルが返ります。' + '指定したウィンドウがトップレベルウィンドウの場合は、最も高いZオーダーを持つトップレベルウィンドウのハンドルが返ります。' + '指定したウィンドウが子ウィンドウの場合は、最も高いZオーダーを持つ兄弟ウィンドウのハンドルが返ります。'); FAddElement('uCmd: GW_HWNDLAST', 'uCmdにGWGW_HWNDLAST_CHILDを指定した時の戻り値。' + lcsCRLF + '指定したウィンドウと同じ種類で最も低いZオーダーを持つウィンドウのハンドルを取得します。指定したウィンドウが最前面ウィンドウの場合は、最も低いZオーダーを持つ最前面ウィンドウのハンドルが返ります。' + '指定したウィンドウがトップレベルウィンドウの場合は、最も低いZオーダーを持つトップレベルウィンドウのハンドルが返ります。' + '指定したウィンドウが子ウィンドウの場合は、最も低いZオーダーを持つ兄弟ウィンドウのハンドルが返ります。'); FAddElement('uCmd: GW_HWNDNEXT', 'uCmdにGW_HWNDNEXTを指定した時の戻り値。' + lcsCRLF + '指定したウィンドウよりZオーダーが一つ下のウィンドウのハンドルを取得します。指定したウィンドウが最前面ウィンドウの場合は、一つ下の最前面ウィンドウのハンドルが返ります。' + '指定したウィンドウがトップレベルウィンドウの場合は、一つ下のトップレベルウィンドウのハンドルが返ります。指定したウィンドウが子ウィンドウの場合は、一つ下の兄弟ウィンドウのハンドルが返ります。'); FAddElement('uCmd: GW_HWNDPREV', 'uCmdにGW_HWNDPREVを指定した時の戻り値。' + lcsCRLF + '指定したウィンドウよりZオーダーが一つ上のウィンドウのハンドルを取得します。指定したウィンドウが最前面ウィンドウの場合は、一つ上の最前面ウィンドウのハンドルが返ります。' + '指定したウィンドウがトップレベルウィンドウの場合は、一つ上のトップレベルウィンドウのハンドルが返ります。指定したウィンドウが子ウィンドウの場合は、一つ上の兄弟ウィンドウのハンドルが返ります。'); FAddElement('uCmd: GW_OWNER', 'uCmdにGW_OWNERを指定した時の戻り値。' + lcsCRLF + '指定したウィンドウのオーナーウィンドウのハンドルを取得します。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddWindowValue(GetWindow(FhWndHandle, GW_CHILD)); FAddWindowValue(GetWindow(FhWndHandle, GW_ENABLEDPOPUP)); FAddWindowValue(GetWindow(FhWndHandle, GW_HWNDFIRST)); FAddWindowValue(GetWindow(FhWndHandle, GW_HWNDLAST)); FAddWindowValue(GetWindow(FhWndHandle, GW_HWNDNEXT)); FAddWindowValue(GetWindow(FhWndHandle, GW_HWNDPREV)); FAddWindowValue(GetWindow(FhWndHandle, GW_OWNER)); end; end; // GetWindowInfo --------------------------------------------------------------- procedure T_MyAPIValue.FGetWindowInfo; const lcsSTRUCT_WINDOWINFO = lcsSTRUCT_CRLF + 'typedef struct tagWINDOWINFO {' + lcsCRLF + ' DWORD cbSize; //構造体のサイズ(必ずセットすること)' + lcsCRLF + ' RECT rcWindow; //ウィンドウ全体の矩形領域(RECT)' + lcsCRLF + ' RECT rcClient; //クライアント領域のスクリーン座標での矩形領域(RECT)' + lcsCRLF + ' DWORD dwStyle; //ウィンドウスタイル' + lcsCRLF + ' DWORD dwExStyle; //拡張ウィンドウスタイル' + lcsCRLF + ' DWORD dwWindowStatus; //ウィンドウの状態' + lcsCRLF + ' UINT cxWindowBorders; //フレームの境界線の幅' + lcsCRLF + ' UINT cyWindowBorders; //フレームの境界線の高さ' + lcsCRLF + ' ATOM atomWindowType; //ウィンドウクラスのアトム' + lcsCRLF + ' WORD wCreatorVersion; //Windowsのバージョン番号' + lcsCRLF + '} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;' ; const lcs_DECLARATION = 'BOOL GetWindowInfo(HWND hwnd, PWINDOWINFO pwi);'; lcs_DESCRIPTION = '指定されたウィンドウの情報を取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'pwi 情報を受け取るWINDOWINFO構造体の変数のポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' + lcsCRLF + lcsSTRUCT_WINDOWINFO ; var lb_Ret : Bool; l_Pwi : TWindowInfo; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('pwi.cbSize', 'この構造体のサイズを指定します。'); FAddElement('pwi.rcWindow', 'ウィンドウ全体の矩形領域(RECT)がスクリーン座標でセットされます。GetWindowRectで取得される値と同じです。'); FAddElement('pwi.rcClient', 'ウィンドウのクライアントの矩形領域(RECT)がスクリーン座標でセットされます。GetClientRectで取得される値とは違います。'); FAddElement('pwi.dwStyle', 'ウィンドウのスタイル。'); FAddElement('pwi.dwExStyle', 'ウィンドウの拡張スタイル。'); FAddElement('pwi.dwWindowStatus', 'ウインドウの状態。アクティブの時はWS_ACTIVECAPTION、それ以外の時は0がセットされます。'); FAddElement('pwi.cxWindowBorders', '境界線の幅(ピクセル)'); FAddElement('pwi.cyWindowBorders', '境界線の高さ(ピクセル)'); FAddElement('pwi.atomWindowType', 'ウインドウクラスのアトム'); FAddElement('pwi.wCreatorVersion', 'ウインドウを作成した時のWindowsのバージョン番号'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が返ります。関数が失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; FillChar(l_Pwi, 0, SizeOf(l_Pwi)); l_Pwi.cbSize := SizeOf(l_Pwi); lb_Ret := GetWindowInfo(FhWndHandle, l_Pwi); if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddIntValue (l_Pwi.cbSize); FAddRectValue(l_Pwi.rcWindow); FAddRectValue(l_Pwi.rcClient); FAddHexValue (l_Pwi.dwStyle); FAddHexValue (l_Pwi.dwExStyle); FAddHexValue (l_Pwi.dwOtherStuff); FAddIntValue (l_Pwi.cxWindowBorders); FAddIntValue (l_Pwi.cyWindowBorders); FAddHexValue (l_Pwi.atomWindowType, 4); FAddIntValue (l_Pwi.wCreatorVersion); FAddBoolValue(lb_Ret); end; end; // GetWindowLong --------------------------------------------------------------- procedure T_MyAPIValue.FGetWindowLong; const lcs_DECLARATION = 'LONG GetWindowLong(HWND hWnd, int nIndex);'; lcs_DESCRIPTION = '指定されたウィンドウに関する情報を取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'nIndex 取得するデータのインデックスを指定' + lcsCRLF + ' GWL_EXSTYLE 拡張ウィンドウスタイルを取得' + lcsCRLF + ' GWL_STYLE ウィンドウスタイルを取得' + lcsCRLF + ' GWL_WNDPROC ウィンドウプロシージャのアドレスまたはウィンドウプロシージャのアドレスを示すハンドルを取得' + lcsCRLF + ' GWL_HINSTANCE アプリケーションのインスタンスハンドルを取得' + lcsCRLF + ' GWL_HWNDPARENT 親ウィンドウがあればそのハンドルを取得' + lcsCRLF + ' GWL_ID ウィンドウのIDを取得' + lcsCRLF + ' GWL_USERDATA ウィンドウに関連付けられている32ビット値を取得' + lcsCRLF + '戻り値 関数が成功すると要求した32ビットのデータが返ります。関数が失敗すると0が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('nIndex: GWL_EXSTYLE', 'nIndexにGWL_EXSTYLEを指定した時の戻り値。' + lcsCRLF + '拡張ウィンドウスタイルを取得します。'); FAddElement('nIndex: GWL_STYLE', 'nIndexにGWL_STYLEを指定した時の戻り値。' + lcsCRLF + 'ウィンドウスタイルを取得します。'); FAddElement('nIndex: GWL_WNDPROC', 'nIndexにGWL_WNDPROCを指定した時の戻り値。' + lcsCRLF + 'ウィンドウプロシージャのアドレスまたはウィンドウプロシージャのアドレスを示すハンドルを取得します。'); FAddElement('nIndex: GWL_HINSTANCE', 'nIndexにGWL_HINSTANCEを指定した時の戻り値。' + lcsCRLF + 'アプリケーションのインスタンスハンドルを取得します。'); FAddElement('nIndex: GWL_HWNDPARENT', 'nIndexにGWL_HWNDPARENTを指定した時の戻り値。' + lcsCRLF + '親ウィンドウがあればそのハンドルを取得します。'); FAddElement('nIndex: GWL_ID', 'nIndexにGWL_IDを指定した時の戻り値。' + lcsCRLF + 'ウィンドウのIDを取得します。'); FAddElement('nIndex: GWL_USERDATA', 'nIndexにGWL_USERDATAを指定した時の戻り値。' + lcsCRLF + 'ウィンドウに関連付けられている32ビット値を取得します。' + lcsCRLF + '各ウィンドウはそれに対応する32ビットの値を持っています。この値はウィンドウを作成したアプリケーションが自由に使用できるもので、0で初期化されています。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddHexValue(GetWindowLong(FhWndHandle, GWL_EXSTYLE)); FAddHexValue(GetWindowLong(FhWndHandle, GWL_STYLE)); FAddHexValue(GetWindowLong(FhWndHandle, GWL_WNDPROC)); FAddHexValue(GetWindowLong(FhWndHandle, GWL_HINSTANCE)); // FAddHexValue(GetWindowLong(FhWndHandle, GWL_HWNDPARENT)); FAddWindowValue(GetWindowLong(FhWndHandle, GWL_HWNDPARENT)); FAddHexValue(GetWindowLong(FhWndHandle, GWL_ID)); FAddHexValue(GetWindowLong(FhWndHandle, GWL_USERDATA)); end; end; // GetWindowModuleFileName ----------------------------------------------------- procedure T_MyAPIValue.FGetWindowModuleFileName; type TGetWindowModuleFileNameW = function(hwnd: HWND; pszFileName: PWideChar; cchFileNameMax: UINT): UINT; stdcall; function _GetWindowModuleFileNameW(hwnd: HWND; pszFileName: PWideChar; cchFileNameMax: UINT): UINT; begin Result := 0; if (FpFuncAddr <> nil) then begin Result := TGetWindowModuleFileNameW(FpFuncAddr)( hwnd, pszFileName, cchFileNameMax ); end; end; const lcs_DECLARATION = 'UINT WINAPI GetWindowModuleFileName(HWND hwnd, LPTSTR lpszFileName, UINT cchFileNameMax);'; lcs_DESCRIPTION = '指定されたウィンドウハンドルに関連付けられたモジュールの完全パスとファイル名を取得します。'; const lci_MAX = 256; var li_Ret : UINT; lp_Buff : PWideChar; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; FLoadModule('user32.dll', 'GetWindowModuleFileNameW'); Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', 'モジュールのファイル名を取得するウィンドウのハンドルを指定します。'); FAddElement('lpszFileName', 'パスとファイル名を受け取るバッファへのポインタを指定します。'); FAddElement('cchFileNameMax', 'lpszFileName が指すバッファにコピーできる最大文字数を指定します。'); FAddElement('戻り値', 'バッファにコピーされた文字の総数が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lp_Buff := AllocMem((lci_MAX + 1) * SizeOf(WideChar)); try li_Ret := _GetWindowModuleFileNameW(FhWndHandle, lp_Buff, lci_MAX); FAddStrValue (WideString(lp_Buff)); FAddIntValue (lci_MAX); FAddIntValue (li_Ret); finally FreeMem(lp_Buff); end; end; end; // GetWindowPlacement ---------------------------------------------------------- procedure T_MyAPIValue.FGetWindowPlacement; const lcsSTRUCT_WINDOWPLACEMENT = lcsSTRUCT_CRLF + 'typedef struct tagWINDOWPLACEMENT {' + lcsCRLF + ' UINT length; //構造体のサイズ(必ずセットすること)' + lcsCRLF + ' UINT flags; //最小化されたウインドウの位置および復帰方法を指定する定数を指定' + lcsCRLF + ' UINT showCmd; //表示状態を指定する定数を指定' + lcsCRLF + ' POINT ptMinPosition; //最小化時の表示位置' + lcsCRLF + ' POINT ptMaxPosition; //最大化時の表示位置' + lcsCRLF + ' RECT rcNormalPosition; //通常時の表示領域(RECT)' + lcsCRLF + '} WINDOWPLACEMENT;' ; const lcs_DECLARATION = 'BOOL GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl);'; lcs_DESCRIPTION = '指定されたウィンドウの表示状態、および通常表示のとき、最小化されたとき、最大化されたときの位置をセットします。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'lpwndpl 値を受け取るWINDOWPLACEMENT構造体の変数のポインタを指定' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' + lcsCRLF + lcsSTRUCT_WINDOWPLACEMENT ; var lb_Ret : Bool; l_Info : TWindowPlacement; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べるウィンドウのハンドルを指定します。'); FAddElement('length', '構造体のサイズ'); // FAddElement('flags', '最小化されたウインドウの位置および復帰方法を指定する定数を指定'); // FAddElement('showCmd', '表示状態を指定する定数を指定'); FAddElement('ptMinPosition', '最小化時の表示位置'); FAddElement('ptMaxPosition', '最大化時の表示位置'); FAddElement('rcNormalPosition', '通常時の表示領域(RECT)'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が返ります。関数が失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; FillChar(l_Info, 0, SizeOf(l_Info)); l_Info.length := SizeOf(l_Info); lb_Ret := GetWindowPlacement(FhWndHandle, @l_Info); if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddIntValue (l_Info.length); FAddPointValue (l_Info.ptMinPosition); //最小化時の表示位置 FAddPointValue (l_Info.ptMaxPosition); //最大化時の表示位置 FAddRectValue (l_Info.rcNormalPosition); //通常時の表示位置 FAddBoolValue (lb_Ret); end; end; // GetWindowRect --------------------------------------------------------------- procedure T_MyAPIValue.FGetWindowRect; const lcs_DECLARATION = 'BOOL GetWindowRect(HWND hWnd, LPRECT lpRect);'; lcs_DESCRIPTION = '指定されたウィンドウの左上端と右下端の座標をスクリーン座標で取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定します。' + lcsCRLF + 'lpRect 値を受け取るRECT構造体の変数のポインタを指定します。' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' + lcsCRLF + lcsSTRUCT_RECT ; const lci_OUTPUTNUM = 2; var lb_Ret : Bool; l_Rect : TRect; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べるウィンドウのハンドルを指定します。'); FAddElement('lpRect', '値を受け取るRECT構造体の変数のポインタを指定します。' + lcsCRLF + 'この構造体のleftメンバとtopメンバにスクリーン座標でのウィンドウの左上端の座標が入ります。rightメンバとbottomメンバにはウィンドウの右下端の座標が入ります。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が返ります。関数が失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lb_Ret := GetWindowRect(FhWndHandle, l_Rect); FAddRectValue(l_Rect); FAddBoolValue(lb_Ret); end; end; const lciMAXTEXTLEN = 255; // GetWindowText --------------------------------------------------------------- procedure T_MyAPIValue.FGetWindowText; const lcs_DECLARATION = 'int GetWindowText(HWND hWnd, LPTSTR lpString, int nMaxCount);'; lcs_DESCRIPTION = '指定されたウィンドウのテキストをバッファへコピーします。' + '他のアプリケーションのエディットコントロールのテキストやリストボックス及びコンボボックスのテキストをこの関数で取得することはできません。' + lcsCRLF + 'ANSI版とUnicode版の関数があります。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウまたはコントロールのハンドルを指定' + lcsCRLF + 'lpString テキストを受け取るバッファのアドレスを指定' + lcsCRLF + 'nMaxCount バッファのサイズを指定' + lcsCRLF + '戻り値 関数が成功するとコピーされたテキストの長さが返ります。' + lcsTITLE_CRLF + 'ANSI版 (GetWindowTextA)のnMaxCountと戻り値はバイト数になります。' + lcsCRLF + 'Unicode版(GetWindowTextW)のnMaxCountと戻り値は文字数になります。' + lcsCRLF + 'lpStringのサイズはANSI版もUnicode版も終端のNULL文字分も含めたバイト数で確保しなければなりません。' ; var li_Ret : Integer; li_Len : DWORD; lp_ABuff : PAnsiChar; lp_WBuff : PWideChar; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('ANSI版', 'ANSI版のGetWindowText関数、GetWindowTextA'); FAddElement('lpString', 'バッファへのポインタを指定します。このバッファにテキストが格納されます。'); FAddElement('nMaxCount', 'バッファにコピーする文字のサイズを文字数ではなくバイト数で指定します。テキストのこのサイズを超える部分は切り捨てられます。NULL文字も数に含められます。(このテストではGetWindowTextLengthAの戻り値+1を指定)'); FAddElement('戻り値', '関数が成功するとコピーされた文字列のサイズがバイト数で返ります(終端のNULL文字分は含められません)。'); FAddElement('Unicode版', 'Unicode版のGetWindowText関数、GetWindowTextW'); FAddElement('lpString', 'バッファへのポインタを指定します。このバッファにテキストが格納されます。バッファのサイズは文字数ではなく、文字列を格納するのに必要なバイト数で確保します。'); FAddElement('nMaxCount', 'バッファにコピーする文字の最大数を指定します。テキストのこのサイズを超える部分は切り捨てられます。NULL文字も数に含められます。(このテストではGetWindowTextLengthWの戻り値+1を指定)'); FAddElement('戻り値', '関数が成功するとコピーされた文字列の文字数が返ります(終端のNULL文字分は含められません)。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin //ANSI版 FAddBlank; li_Len := GetWindowTextLengthA(FhWndHandle); lp_ABuff := AllocMem((li_Len +1) * SizeOf(AnsiChar)); //終端のNULL文字分も含めるので+1 try li_Ret := GetWindowTextA(FhWndHandle, lp_ABuff, li_Len +1); FAddStrValue(WideString(AnsiString(lp_ABuff))); finally FreeMem(lp_ABuff); end; FAddIntValue(li_Len); FAddIntValue(li_Ret); //Unicode版 FAddBlank; li_Len := GetWindowTextLengthW(FhWndHandle); lp_WBuff := AllocMem((li_Len +1) * SizeOf(WideChar)); //終端のNULL文字分も含めるので+1 try li_Ret := GetWindowTextW(FhWndHandle, lp_WBuff, li_Len +1); FAddStrValue(WideString(lp_WBuff)); finally FreeMem(lp_WBuff); end; FAddIntValue(li_Len); FAddIntValue(li_Ret); end; end; // GetWindowTextLength --------------------------------------------------------- procedure T_MyAPIValue.FGetWindowTextLength; const lcs_DECLARATION = 'int GetWindowTextLength(HWND hWnd);'; lcs_DESCRIPTION = '指定されたウィンドウのテキストの長さを返します。' + '他のアプリケーションのエディットコントロールのテキストやリストボックス及びコンボボックスのテキストの長さをこの関数で取得することはできません。' + lcsCRLF + 'ANSI版とUnicode版の関数があります。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定します。' + lcsCRLF + '戻り値 関数が成功するとテキストの長さが返ります。' + lcsTITLE_CRLF + 'ANSI版 (GetWindowTextLengthA)の戻り値はテキストのサイズ(バイト数)になります。' + lcsCRLF + 'Unicode版(GetWindowTextLengthW)の戻り値はテキストの文字数になります。' ; var li_Ret : Integer; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウまたはコントロールのハンドルを指定します。'); FAddElement('ANSI版', 'ANSI版のGetWindowTextLength関数、GetWindowTextA'); FAddElement('戻り値', '関数が成功するとテキストのサイズがバイト数で返ります。特定の条件の下では、実際のテキスト長よりも大きくなります。ウィンドウがテキストを持たない場合は、0 が返ります。'); FAddElement('Unicode版', 'Unicode版のGetWindowText関数、GetWindowTextW'); FAddElement('戻り値', '関数が成功するとテキストの文字数が返ります。特定の条件の下では、実際のテキスト長よりも大きくなります。ウィンドウがテキストを持たない場合は、0 が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin //ANSI版 FAddBlank; li_Ret := GetWindowTextLengthA(FhWndHandle); FAddIntValue(li_Ret); //Unicode版 FAddBlank; li_Ret := GetWindowTextLengthW(FhWndHandle); FAddIntValue(li_Ret); end; end; // GetWindowThreadProcessId ---------------------------------------------------- procedure T_MyAPIValue.FGetWindowThreadProcessId; const lcs_DECLARATION = 'DWORD GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId);'; lcs_DESCRIPTION = '指定されたウィンドウを作成したスレッドIDとプロセスIDを取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'lpdwProcessId プロセスIDを受け取る変数のポインタを指定' + lcsCRLF + '戻り値 ウィンドウを作成したスレッドのIDが返ります。' ; var li_ThreadID : DWORD; li_PID : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('lpdwProcessId', 'プロセスIDを受け取る変数のポインタを指定します。' + lcsCRLF + 'NULLを指定した場合はプロセスIDの取得は行われません。'); FAddElement('戻り値', 'ウィンドウを作成したスレッドのIDが返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin li_ThreadID := GetWindowThreadProcessId(FhWndHandle, li_PID); FAddHexValue(li_PID); FAddHexValue(li_ThreadID); end; end; // IsWindowEnabled ------------------------------------------------------------- procedure T_MyAPIValue.FIsWindowEnabled; const lcs_DECLARATION = 'BOOL IsWindowEnabled(HWND hWnd);'; lcs_DESCRIPTION = '指定されたウィンドウが有効か無効か(マウスやキーボードの入力を受け付けるかどうか)を調べます。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + '戻り値 ウィンドウが有効なときは0以外の値(Ture)が、無効なときは0(False)が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('戻り値', 'ウィンドウが有効なときは0以外の値(Ture)が、無効なときは0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddBoolValue(IsWindowEnabled(FhWndHandle)); end; end; // IsWindowUnicode ------------------------------------------------------------- procedure T_MyAPIValue.FIsWindowUnicode; const lcs_DECLARATION = 'BOOL IsWindowUnicode(HWND hWnd);'; lcs_DESCRIPTION = '指定されたウィンドウがUnicode対応かを調べます。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + '戻り値 ウィンドウがUnicode対応なら0以外の値(Ture)が、非対応なら0(False)が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('戻り値', 'ウィンドウがUnicode対応なら0以外の値(Ture)が、非対応なら0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddBoolValue(IsWindowUnicode(FhWndHandle)); end; end; // IsZoomed -------------------------------------------------------------------- procedure T_MyAPIValue.FIsZoomed; const lcs_DECLARATION = 'BOOL IsZoomed(HWND hWnd);'; lcs_DESCRIPTION = '指定されたウィンドウが最大化されているかどうかを調べます。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定します。' + lcsCRLF + '戻り値 ウィンドウが最大化されている場合は0以外の値(Ture)が、そうでなければ0(False)が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('戻り値', 'ウィンドウが最大化されている場合は0以外の値(Ture)が、そうでなければ0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddBoolValue(IsZoomed(FhWndHandle)); end; end; {$IFNDEF BUGSEYE} procedure T_MyAPIValue.FIsIconic; const lcs_DECLARATION = 'BOOL IsIconic(HWND hWnd);'; lcs_DESCRIPTION = '指定されたウィンドウが最少化(アイコン化)されているかどうかを調べます。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定します。' + lcsCRLF + '戻り値 ウィンドウが最少化されている場合は0以外の値(Ture)が、そうでなければ0(False)が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('戻り値', 'ウィンドウが最少化されている場合は0以外の値(Ture)が、そうでなければ0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddBoolValue(IsIconic(FhWndHandle)); end; end; procedure T_MyAPIValue.FIsWindowVisible; const lcs_DECLARATION = 'BOOL IsWindowVisible(HWND hWnd);'; lcs_DESCRIPTION = '指定されたウィンドウの表示状態を調べます。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + '戻り値 ウィンドウがその親も含めてWS_VISIBLEスタイルを持つなら0以外の値(Ture)が、そうでなければ0(False)が返ります。'+ lcsCRLF + lcsCRLF + '戻り値がTrueであってもウィンドウが他のウィンドウの下に隠れていたりクリッピングされている場合、必ずしも画面上に表示されているとは限りません。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('戻り値', 'ウィンドウがその親も含めてWS_VISIBLEスタイルを持つなら0以外の値(Ture)が、そうでなければ0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FAddBoolValue(IsWindowVisible(FhWndHandle)); end; end; {$ENDIF} // RealGetWindowClass ---------------------------------------------------------- procedure T_MyAPIValue.FRealGetWindowClass; const lcs_DECLARATION = 'UINT RealGetWindowClass(HWND hwnd, LPTSTR pszType, UINT cchType);'; lcs_DESCRIPTION = '指定されたウィンドウの種類を表す文字列を取得します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定' + lcsCRLF + 'pszType 文字列を受け取るバッファ' + lcsCRLF + 'cchType pszTypeが指すバッファの大きさ(このテストでは255を指定)' + lcsCRLF + '戻り値 関数が成功するとバッファにコピーされた文字列のサイズが返ります。関数が失敗すると0が返ります。' ; const lci_LENGTH = 255; var li_Ret : UINT; lp_Buff : PWideChar; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('pszType', '文字列を受け取るバッファ。'); FAddElement('戻り値', '関数が成功するとバッファにコピーされた文字列のサイズが返ります。関数が失敗すると0が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin lp_Buff := AllocMem((lci_LENGTH + 1) * SizeOf(WideChar)); try li_Ret := RealGetWindowClassW(FhWndHandle, lp_Buff, lci_LENGTH); FAddStrValue(WideString(lp_Buff)); finally FreeMem(lp_Buff); end; FAddIntValue(li_Ret); end; end; // プロセスハンドル系 ---------------------------------------------------------- procedure T_MyAPIValue.FOpenProcess; const lcs_DECLARATION = 'HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);'; lcs_DESCRIPTION = 'プロセスのプロセスハンドルを開きます。' + lcsTITLE_CRLF + 'dwDesiredAccess プロセスで許可されるアクセス方法の組み合わせを指定' + lcsCRLF + 'bInheritHandle 新しいプロセスを作成する際に開いたプロセスハンドルを継承できるかを指定' + lcsCRLF + 'dwProcessId 調べたいプロセスのプロセスIDを指定' + lcsCRLF + '戻り値 関数が成功するとプロセスハンドルが返ります。失敗すると0が返ります' ; var li_ProcessID : DWORD; lh_ProcessHandle : THandle; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('ウィンドウ', '調べるウィンドウの簡易情報。'); // FAddElement('dwDesiredAccess', 'プロセスで許可されるアクセス方法の組み合わせを指定します。'); // FAddElement('bInheritHandle', '新しいプロセスを作成する際に開いたプロセスハンドルを継承できるかを指定します。'); FAddElement('dwProcessId', '調べたいプロセスのプロセスIDを指定します。'); FAddElement('戻り値', '関数が成功するとプロセスハンドルが返ります。失敗すると0が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin GetWindowThreadProcessId(FhWndHandle, @li_ProcessID); lh_ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, li_ProcessID); try FAddIntValue(li_ProcessID); FAddIntValue(lh_ProcessHandle); finally CloseHandle(lh_ProcessHandle); end; end; end; procedure T_MyAPIValue.FGetPriorityClass; function _ReturnValue(iValue: DWORD): WideString; const ABOVE_NORMAL_PRIORITY_CLASS = $00008000; BELOW_NORMAL_PRIORITY_CLASS = $00004000; begin case iValue of 0: Result := '0 関数失敗'; REALTIME_PRIORITY_CLASS: Result := '(0x00000100) REALTIME_PRIORITY_CLASS リアルタイム'; HIGH_PRIORITY_CLASS: Result := '(0x00000080) HIGH_PRIORITY_CLASS 高'; ABOVE_NORMAL_PRIORITY_CLASS: Result := '(0x00008000) ABOVE_NORMAL_PRIORITY_CLASS 通常以上'; NORMAL_PRIORITY_CLASS: Result := '(0x00000020) NORMAL_PRIORITY_CLASS 通常'; BELOW_NORMAL_PRIORITY_CLASS: Result := '(0x00004000) BELOW_NORMAL_PRIORITY_CLASS 通常以下'; IDLE_PRIORITY_CLASS: Result := '(0x00000040) IDLE_PRIORITY_CLASS 底'; else Result := WideFormat('(0x%.8x) 不明', [iValue]); end; end; const lcs_DECLARATION = 'DWORD GetPriorityClass(HANDLE hProcess);'; lcs_DESCRIPTION = '指定されたプロセスの優先順位を返します。' + lcsTITLE_CRLF + 'hProcess 調べたいプロセスのハンドルを指定' + lcsCRLF + '戻り値 関数が成功すると指定したプロセスの優先順位が返ります。' + lcsCRLF + lcsCRLF + '優先順位の値は以下のいずれかになります。' + lcsCRLF + ' (0x00000100) REALTIME_PRIORITY_CLASS リアルタイム :最も高い優先順位。' + lcsCRLF + ' (0x00000080) HIGH_PRIORITY_CLASS 高 :高い優先順位。タイムクリティカルにタスクが実行される。' + lcsCRLF + ' (0x00008000) ABOVE_NORMAL_PRIORITY_CLASS 通常以上 :「通常」よりは高く「高」より低い優先順位。' + lcsCRLF + ' (0x00000020) NORMAL_PRIORITY_CLASS 通常 :通常の優先順位。最も一般的なプロセス。' + lcsCRLF + ' (0x00004000) BELOW_NORMAL_PRIORITY_CLASS 通常以下 :「底」よりは高く「通常」より低い優先順位。' + lcsCRLF + ' (0x00000040) IDLE_PRIORITY_CLASS 底 :最も低い優先順位。システムがアイドル状態のときにのみ実行される。' ; var li_ProcessID : DWORD; lh_ProcessHandle : THandle; li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('ウィンドウ', '調べるウィンドウの簡易情報。'); FAddElement('hProcess', '調べたいプロセスのプロセスIDを指定します。'); FAddElement('戻り値', '関数が成功すると指定したプロセスの優先順位が返ります。失敗すると0が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin GetWindowThreadProcessId(FhWndHandle, @li_ProcessID); lh_ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, li_ProcessID); try FAddIntValue(lh_ProcessHandle); li_Ret := GetPriorityClass(lh_ProcessHandle); FAddStrValue(_ReturnValue(li_Ret)); finally CloseHandle(lh_ProcessHandle); end; end; end; // 座標を引数に取るAPI ========================================================= function F_GetWindow(ptPos: TPoint): HWND; type T_TopWindow = record hTop : HWND; pPoint : TPoint; end; P_TopWindow = ^T_TopWindow; function _EnumChildProc(hHandle: HWND; pTopWindow: Pointer): BOOL; stdcall; var lh_Parent: HWND; begin Result := True; if (IsWindowVisible(hHandle)) and (PtInRect(gfnrcWindowRectGet(hHandle), T_TopWindow(pTopWindow^).pPoint)) then begin lh_Parent := GetAncestor(hHandle, GA_PARENT); if (lh_Parent = T_TopWindow(pTopWindow^).hTop) then begin //直前に列挙された対象ウィンドウの子ウィンドウだった //hTopを書き換える //子ウィンドウがあるかもしれないので処理を続ける T_TopWindow(pTopWindow^).hTop := hHandle; end else begin //親ウィンドウが同じなら兄弟ウィンドウ。 //しかし列挙されるのは手前のウィンドウからなのでその場合はhTopは書き換ず処理を抜ける。 //親ウィンドウが直前のウィンドウでもない //おじさんおばさんウィンドウ、あるいはさらに遡ってのウィンドウであるのでこれまたhTopを書き換えず処理を抜ける Result := False; end; end; end; function _EnumWindowsProc(hHandle: HWND; pTopWindow: Pointer):BOOL; stdcall; //トップレベルウィンドウを列挙する function _GetClientRect(hHandle: HWND): TRect; begin if not(GetClientRect(hHandle, Result)) then FillChar(Result, SizeOf(Result), 0) end; var l_Region: HRGN; l_Pos: TPoint; l_Rect, l_Client: TRect; begin l_Rect := gfnrcWindowRectGet(hHandle); if (IsWindowVisible(hHandle)) //可視ウィンドウのみ and (PtInRect(l_Rect, T_TopWindow(pTopWindow^).pPoint)) //ウィンドウのRect内にマウスカーソルがある then begin Result := False; l_Region := CreateRectRgn(0, 0, 0, 0); try if (GetWindowRgn(hHandle, l_Region) <> ERROR) then begin l_Pos.X := T_TopWindow(pTopWindow^).pPoint.X - l_Rect.Left; l_Pos.Y := T_TopWindow(pTopWindow^).pPoint.Y - l_Rect.Top; if (PtInRegion(l_Region, l_Pos.X, l_Pos.Y)) then begin //リージョン内だったので処理を抜ける end else begin //リージョン外だったので処理を続ける Result := True; end; end; finally DeleteObject(l_Region); end; if (Result = False) then begin T_TopWindow(pTopWindow^).hTop := hHandle; l_Client := _GetClientRect(hHandle); if (l_Client.Right > 0) or (l_Client.Bottom > 0) then begin EnumChildWindows(hHandle, @_EnumChildProc, LPARAM(pTopWindow)); end; end; end else begin Result := True; end; end; var lr_TopWindow : T_TopWindow; lh_Toplevel : HWND; li_ExStyle : DWORD; li_ColorKey : COLORREF; li_Alpha : BYTE; li_Flag : DWORD; begin Result := WindowFromPoint(ptPos); { if (Result = ChildWindowFromPoint(Result, gfnptScreenToClient(Result, ptPos))) then begin Exit; end; } FillChar(lr_TopWindow, SizeOf(lr_TopWindow), 0); lr_TopWindow.pPoint := ptPos; EnumWindows(@_EnumWindowsProc, LPARAM(@lr_TopWindow)); // lh_Handle2 := lr_TopWindow.hTop; //WindowFromPoint APIで取得したハンドルとEnumWindows APIで取得したハンドルを比較する。 if (Result <> lr_TopWindow.hTop) then begin //違っていたらEnumWindows APIで取得したウィンドウのスタイルを調べる。 //WS_EX_TRANSPARENTとWS_EX_LAYEREDが同時にセットされていたら見えていても //WindowFromPoint APIでは取得できないウィンドウなのでこちらを返す。 lh_Toplevel := GetAncestor(lr_TopWindow.hTop, GA_ROOT); li_ExStyle := GetWindowLong(lh_Toplevel, GWL_EXSTYLE); if ((li_ExStyle and WS_EX_LAYERED) = WS_EX_LAYERED) and ((li_ExStyle and WS_EX_TRANSPARENT) = WS_EX_TRANSPARENT) then begin if (gfnbGetLayeredWindowAttributes(lh_Toplevel, li_ColorKey, li_Alpha, li_Flag)) then begin if ((li_Flag and LWA_ALPHA) = LWA_ALPHA) and (li_Alpha = 0) then begin Exit; end; end; end; //2015-09-29:この上のend;の上に置いていた為EnabledがFalseのウィンドウを補足しなくなっていたミスを修正。 Result := lr_TopWindow.hTop; end; end; {$IFDEF BUGSEYE} // ChildWindowFromPoint -------------------------------------------------------- procedure T_MyAPIValue.FChildWindowFromPoint; const lcs_DECLARATION = 'HWND ChildWindowFromPoint(HWND hWndParent, POINT Point);'; lcs_DESCRIPTION = '指定されたウィンドウの指定座標上にある子ウィンドウのハンドルを返します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定。' + lcsCRLF + 'Point 指定座標を、調べたいウィンドウのクライアント座標で指定。' + lcsCRLF + '戻り値 調べたいウィンドウの、指定座標上にある子ウィンドウのハンドルが返ります。' + lcsCRLF + lcsSTRUCT_POINT ; var lpt_Client: TPoint; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('Point', '指定座標を、調べたいウィンドウのクライアント座標で指定します。'); FAddElement('戻り値', '調べたいウィンドウの指定座標上にある子ウィンドウのハンドルが返ります。' + lcsCRLF + '子ウィンドウが非表示の場合や無効化されている場合でもその子ウィンドウのハンドルが返ります。' + lcsCRLF + '指定した座標がウィンドウの外側にある場合は0が返ります。' + lcsCRLF + '指定した座標はウィンドウ内にあるがその座標上に子ウィンドウがない場合はそのウィンドウのハンドルが返ります。'); FAddElement('参考値', '指定された座標上にある、一番手間にある見えているウィンドウの値。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin //ptPosはスクリーン座標なのでクライアント座標に変換する lpt_Client := gfnptScreenToClient(FhWndHandle, FptPos); FAddPointValue(lpt_Client); FAddWindowValue(ChildWindowFromPoint(FhWndHandle, lpt_Client)); FAddWindowValue(F_GetWindow(FptPos)); end; end; // ChildWindowFromPointEx ------------------------------------------------------ procedure T_MyAPIValue.FChildWindowFromPointEx; const lcs_DECLARATION = 'HWND ChildWindowFromPointEx(HWND hwndParent, POINT pt, UINT uFlags);'; lcs_DESCRIPTION = '指定されたウィンドウの指定座標上にある子ウィンドウのハンドルを返します。' + lcsCRLF + 'オプションの指定で非表示ウィンドウ、無効化されたウィンドウ、透明なウィンドウを無視することができます。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定します。' + lcsCRLF + 'pt 指定座標を、調べたいウィンドウのクライアント座標で指定します。' + lcsCRLF + 'uFlags 無視するウィンドウの種類を指定します。' + lcsCRLF + '戻り値 調べたいウィンドウの、指定座標上にある子ウィンドウのハンドルが返ります。' + lcsCRLF + lcsSTRUCT_POINT ; var lpt_Client: TPoint; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('Point', '指定座標を、調べたいウィンドウのクライアント座標で指定します。'); FAddElement('uFlags: CWP_ALL', 'uFlagsにCWP_ALLを指定したときの戻り値。' + lcsCRLF + 'どの子ウィンドウも無視しません。'); FAddElement('uFlags: CWP_SKIPINVISIBLE', 'uFlagsにCWP_SKIPINVISIBLEを指定したときの戻り値。' + lcsCRLF + '非表示の子ウィンドウを無視します。'); FAddElement('uFlags: CWP_SKIPDISABLED', 'uFlagsにCWP_SKIPDISABLEDを指定したときの戻り値。' + lcsCRLF + '無効化されている子ウィンドウを無視します。'); FAddElement('uFlags: CWP_SKIPTRANSPARENT', 'uFlagsにCWP_SKIPTRANSPARENTを指定したときの戻り値。' + lcsCRLF + '透明な子ウィンドウを無視します。'); FAddElement('参考値', '指定された座標上にある、一番手間にある見えているウィンドウの値。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin //ptPosはスクリーン座標なのでクライアント座標に変換する lpt_Client := gfnptScreenToClient(FhWndHandle, FptPos); FAddPointValue(lpt_Client); FAddWindowValue(ChildWindowFromPointEx(FhWndHandle, lpt_Client, CWP_ALL)); FAddWindowValue(ChildWindowFromPointEx(FhWndHandle, lpt_Client, CWP_SKIPINVISIBLE)); FAddWindowValue(ChildWindowFromPointEx(FhWndHandle, lpt_Client, CWP_SKIPDISABLED)); FAddWindowValue(ChildWindowFromPointEx(FhWndHandle, lpt_Client, CWP_SKIPTRANSPARENT)); FAddWindowValue(F_GetWindow(FptPos)); end; end; // RealChildWindowFromPoint ---------------------------------------------------- procedure T_MyAPIValue.FRealChildWindowFromPoint; const lcs_DECLARATION = 'HWND RealChildWindowFromPoint(HWND hwndParent, POINT ptParentClientCoords);'; lcs_DESCRIPTION = '指定されたウィンドウの指定座標上にある子ウィンドウのハンドルを返します。' + lcsTITLE_CRLF + 'hwnd 調べたいウィンドウのハンドルを指定します。' + lcsCRLF + 'Point 指定座標を、調べたいウィンドウのクライアント座標で指定します。' + lcsCRLF + '戻り値 調べたいウィンドウの、指定座標上にある子ウィンドウのハンドルが返ります。' + lcsCRLF + lcsSTRUCT_POINT ; var lpt_Client: TPoint; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('Point', '指定座標を、調べたいウィンドウのクライアント座標で指定します。'); FAddElement('戻り値', '調べたいウィンドウの指定座標上にある子ウィンドウのハンドルが返ります。' + lcsCRLF + '子ウィンドウが非表示の場合や無効化されている場合でもその子ウィンドウのハンドルが返ります。' + lcsCRLF + '指定した座標がウィンドウの外側にある場合は0が返ります。' + lcsCRLF + '指定した座標はウィンドウ内にあるがその座標上に子ウィンドウがない場合はそのウィンドウのハンドルが返ります。'); FAddElement('参考値', '指定された座標上にある、一番手間にある見えているウィンドウの値。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin //ptPosはスクリーン座標なのでクライアント座標に変換する lpt_Client := gfnptScreenToClient(FhWndHandle, FptPos); FAddPointValue(lpt_Client); FAddWindowValue(RealChildWindowFromPoint(FhWndHandle, lpt_Client)); FAddWindowValue(F_GetWindow(FptPos)); end; end; // WindowFromPoint ------------------------------------------------------------- procedure T_MyAPIValue.FWindowFromPoint; const lcs_DECLARATION = 'HWND WindowFromPoint(POINT Point);'; lcs_DESCRIPTION = '指定された座標上にあるウィンドウのハンドルを取得します。' + lcsTITLE_CRLF + 'Point 調べる座標の入ったPOINT構造体を指定します。' + lcsCRLF + '戻り値 関数が成功すると指定した座標を含むウィンドウのハンドルが返ります。指定した座標にウィンドウがないときは0が返ります。' ; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('Point', '調べる座標の入ったPOINT構造体を指定します。'); FAddElement('戻り値', '関数が成功すると指定した座標上にあるウィンドウのハンドルが返ります。' + lcsCRLF + '指定した座標にウィンドウがないときは0が返ります。' + lcsCRLF + '座標上のウィンドウが無効化されているウィンドウに属する場合は、祖先ウィンドウを遡り無効化されていないウィンドウのハンドルが返ります。' + lcsCRLF + '指定した座標がスタティックテキストコントロールに重なっていた場合はそのスタティックテキストコントロールの下にあるウィンドウのハンドルが返ります。' + lcsCRLF + 'またマウスイベント透過な透明ウィンドウの場合もそのウィンドウの下にあるウィンドウのハンドルが返ります。'); FAddElement('参考値', '指定された座標上にある、一番手間にある見えているウィンドウの値。'); end else begin //値のみ初期化 FClearValue; end; FAddPointValue(FptPos); FAddWindowValue(WindowFromPoint(FptPos)); FAddWindowValue(F_GetWindow(FptPos)); end; {$ENDIF} //GetCursorPos ----------------------------------------------------------------- procedure T_MyAPIValue.FGetCursorPos; const lcs_DECLARATION = 'BOOL GetCursorPos(LPPOINT lpPoint);'; lcs_DESCRIPTION = 'マウスカーソルの現在位置をスクリーン座標で取得します。' + lcsTITLE_CRLF + 'lpPoint マウスカーソルの現在位置を受け取るPOINT構造体を指定します。' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; var lb_Ret : BOOL; l_Pos : TPoint; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('lpPoint', 'マウスカーソルの現在位置を受け取るPOINT構造体を指定します。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; lb_Ret := GetCursorPos(l_Pos); FAddPointValue(l_Pos); FAddBoolValue (lb_Ret); end; // GetPhysicalCursorPos -------------------------------------------------------- function _GetPhysicalCursorPos(var lpPoint: TPoint): HResult; var lb_Ret : BOOL; begin Result := E_NOTIMPL; if (@F_GetPhysicalCursorPos <> nil) then begin lb_Ret := F_GetPhysicalCursorPos(lpPoint); if (lb_Ret) then Result := S_OK else Result := S_FALSE; end; end; procedure T_MyAPIValue.FGetPhysicalCursorPos; const lcs_DECLARATION = 'BOOL GetPhysicalCursorPos(LPPOINT lpPoint);'; lcs_DESCRIPTION = 'マウスカーソルの現在位置を物理座標のスクリーン座標で取得します。' + lcsTITLE_CRLF + 'lpPoint マウスカーソルの現在位置を受け取るPOINT構造体を指定します。' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; var li_Ret : HResult; l_Pos : TPoint; l_LogicalPos : TPoint; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('lpPoint', 'マウスカーソルの現在位置を受け取るPOINT構造体を指定します。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); FAddElement('(論理座標)', '論理座標でのマウスカーソルの現在位置。'); end else begin //値のみ初期化 FClearValue; end; l_Pos := Point(0, 0); li_Ret := _GetPhysicalCursorPos(l_Pos); if (li_Ret = E_NOTIMPL) then begin FAddBlank; FAddStrValue('未実装'); FAddBlank; end else begin FAddPointValue(l_Pos); FAddBoolValue (li_Ret = S_OK); l_LogicalPos := Point(0, 0); if (GetCursorPos(l_LogicalPos)) then begin FAddPointValue(l_LogicalPos); end else begin FAddStrValue('False'); end; end; end; // LogicalToPhysicalPoint ------------------------------------------------------ procedure T_MyAPIValue.FLogicalToPhysicalPoint; function _LogicalToPhysicalPoint(hWindow: HWND; var lpPoint: TPoint): HResult; type TLogicalToPhysicalPoint = function(hWindow: HWND; var lpPoint: TPoint): BOOL; stdcall; var lb_Ret : BOOL; begin Result := E_NOTIMPL; if (FpFuncAddr <> nil) then begin lb_Ret := TLogicalToPhysicalPoint(FpFuncAddr)(hWindow, lpPoint); if (lb_Ret) then Result := S_OK else Result := S_FALSE; end; end; const lcs_DECLARATION = 'BOOL LogicalToPhysicalPoint(HWND hWnd, LPPOINT lpPoint);'; lcs_DESCRIPTION = 'ウィンドウ上の論理座標を物理座標に変換します。' + lcsTITLE_CRLF + 'hWnd 座標を変換するウィンドウのハンドルを指定します。' + lcsCRLF + 'lpPoint 変換する論理座標を指定します。この関数が成功するとこの変数に変換後の物理座標が格納されます。' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; var li_Ret : HResult; l_Pos : TPoint; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; FLoadModule('user32.dll', 'LogicalToPhysicalPoint'); Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('論理スクリーン座標', '現在のマウスカーソルの論理スクリーン座標。'); FAddElement('hWnd', '座標を変換するウィンドウのハンドルを指定します。'); FAddElement('lpPoint', '変換する論理座標を指定します。この関数が成功するとこの変数に変換後の物理座標が格納されます。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); FAddElement('物理スクリーン座標', '現在のマウスカーソルの物理スクリーン座標。'); end else begin //値のみ初期化 FClearValue; end; l_Pos := Point(0, 0); GetCursorPos(l_Pos); //論理座標 // Windows.ScreenToClient(FhWndHandle, l_Pos); FAddPointValue(l_Pos); li_Ret := _LogicalToPhysicalPoint(FhWndHandle, l_Pos); if (li_Ret = E_NOTIMPL) then begin FAddBlank; FAddStrValue('未実装'); FAddBlank; end else begin FAddWindowValue(FhWndHandle); FAddPointValue (l_Pos); FAddBoolValue (li_Ret = S_OK); end; if (Succeeded(_GetPhysicalCursorPos(l_Pos))) then begin FAddPointValue(l_Pos); end else begin FAddStrValue('False'); end; end; // PhysicalToLogicalPoint ------------------------------------------------------ procedure T_MyAPIValue.FPhysicalToLogicalPoint; function _PhysicalToLogicalPoint(hWindow: HWND; var lpPoint: TPoint): HResult; type TPhysicalToLogicalPoint = function(hWindow: HWND; var lpPoint: TPoint): BOOL; stdcall; var lb_Ret : BOOL; begin Result := E_NOTIMPL; if (FpFuncAddr <> nil) then begin lb_Ret := TPhysicalToLogicalPoint(FpFuncAddr)(hWindow, lpPoint); if (lb_Ret) then Result := S_OK else Result := S_FALSE; end; end; const lcs_DECLARATION = 'BOOL PhysicalToLogicalPoint(HWND hWnd, LPPOINT lpPoint);'; lcs_DESCRIPTION = 'ウィンドウ上の物理スクリーン座標を論理スクリーン座標に変換します。' + lcsTITLE_CRLF + 'hWnd 座標を変換するウィンドウのハンドルを指定します。' + lcsCRLF + 'lpPoint 変換する物理スクリーン座標を指定します。この関数が成功するとこの変数に変換後の論理スクリーン座標が格納されます。' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; var li_Ret : HResult; l_Pos : TPoint; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; FLoadModule('user32.dll', 'PhysicalToLogicalPoint'); Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('物理スクリーン座標', '現在のマウスカーソルの物理スクリーン座標。'); FAddElement('hWnd', '座標を変換するウィンドウのハンドルを指定します。'); FAddElement('lpPoint', '変換する物理スクリーン座標を指定します。この関数が成功するとこの変数に変換後の論理スクリーン座標が格納されます。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; l_Pos := Point(0, 0); _GetPhysicalCursorPos(l_Pos); //物理座標 FAddPointValue(l_Pos); li_Ret := _PhysicalToLogicalPoint(FhWndHandle, l_Pos); if (li_Ret = E_NOTIMPL) then begin FAddBlank; FAddStrValue('未実装'); FAddBlank; end else begin FAddWindowValue(FhWndHandle); FAddPointValue (l_Pos); FAddBoolValue (li_Ret = S_OK); end; end; //ScreenToClient --------------------------------------------------------------- procedure T_MyAPIValue.FScreenToClient; const lcs_DECLARATION = 'BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);'; lcs_DESCRIPTION = '画面上にある指定された点をスクリーン座標からクライアント座標へ変換します。' + lcsTITLE_CRLF + 'hWnd ウィンドウハンドルを指定します。このウィンドウのクライアント領域を利用して変換を行います。' + lcsCRLF + 'lpPoint スクリーン座標を保持しているPOINT構造体を指定します。関数が成功するとこの構造体にクライアント座標が格納されます。 ' + lcsCRLF + '戻り値 関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。' ; var lb_Ret : BOOL; l_Pos : TPoint; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('スクリーン座標', '調べたいスクリーン座標。この座標をhwndで指定したウィンドウのクライアント領域を利用して変換を行います。'); FAddElement('hWnd', 'ウィンドウハンドルを指定します。このウィンドウのクライアント領域を利用して変換を行います。'); FAddElement('lpPoint', 'スクリーン座標を保持しているPOINT構造体を指定します。関数が成功するとこの構造体にクライアント座標が格納されます。'); FAddElement('戻り値', '関数が成功すると0以外の値(True)が、失敗すると0(False)が返ります。'); end else begin //値のみ初期化 FClearValue; end; l_Pos := Point(0, 0); GetCursorPos(l_Pos); // FAddPointValue (FptPos); FAddPointValue (l_Pos); FAddWindowValue(FhWndHandle); // l_Pos := FptPos; lb_Ret := Windows.ScreenToClient(FhWndHandle, l_Pos); FAddPointValue(l_Pos); FAddBoolValue (lb_Ret); end; // 以下メッセージ ============================================================== //コンボボックスとリストボックス procedure T_MyAPIValue.FAdd_LBIntValue(iValue: DWORD); begin if (iValue = DWORD(LB_ERR)) then begin FAddStrValue('LB_ERR(-1)'); end else begin FAddIntValue(iValue); end; end; procedure T_MyAPIValue.FAdd_CBIntValue(iValue: DWORD); begin if (iValue = DWORD(CB_ERR)) then begin FAddStrValue('CB_ERR(-1)'); end else begin FAddIntValue(iValue); end; end; procedure T_MyAPIValue.FCBLB_GetCount( hHandle : HWND; iMessage : UINT ); var li_Index: DWORD; ls_Declaration: String; ls_Description: String; ls_ResultMsg: String; ls_Control: String; l_Func: procedure(iValue: DWORD) of object; begin l_Func := nil; case iMessage of CB_GETCOUNT :begin ls_Control := 'コンボボックス'; ls_Declaration := 'CB_GETCOUNT'; ls_Description := Format('%sのアイテム数を取得します。', [ls_Control]); ls_ResultMsg := Format('%sのアイテム数が返ります。', [ls_Control]); l_Func := FAdd_CBIntValue; end; LB_GETCOUNT :begin ls_Control := 'リストボックス'; ls_Declaration := 'LB_GETCOUNT'; ls_Description := Format('%sのアイテム数を取得します。', [ls_Control]); ls_ResultMsg := Format('%sのアイテム数が返ります。', [ls_Control]); l_Func := FAdd_LBIntValue; end; CB_GETCURSEL :begin ls_Control := 'コンボボックス'; ls_Declaration := 'CB_GETCURSEL'; ls_Description := Format('%sの選択アイテムのインデックスを取得します。', [ls_Control]); ls_ResultMsg := '選択アイテムの0ベースのインデックスが返ります。'; l_Func := FAdd_CBIntValue; end; LB_GETCURSEL :begin ls_Control := 'リストボックス'; ls_Declaration := 'LB_GETCURSEL'; ls_Description := Format('%sの選択アイテムのインデックスを取得します。', [ls_Control]); ls_ResultMsg := '選択アイテムの0ベースのインデックスが返ります。'; l_Func := FAdd_LBIntValue; end; end; if not(IsNowAPI(ls_Declaration)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := ls_Declaration; Description := ls_Declaration + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 ' + ls_ResultMsg; FAddElement('hwnd', '調べたい' + ls_Control + 'のハンドルを指定します。'); FAddElement('戻り値', ls_ResultMsg); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin if (SendMessageTimeoutW(hHandle, iMessage, 0, 0, SMTO_ABORTIFHUNG, 500, li_Index) <> 0) then begin if (Assigned(l_Func)) then begin l_Func(li_Index); end; end; end; end; procedure T_MyAPIValue.FCBLB_GetText( hHandle : HWND; iMessage : UINT ); var li_GetCurSel : UINT; li_GetTextLen : UINT; li_Err : Integer; li_Index : DWORD; li_Len : DWORD; lp_Buff : PWideChar; ls_Item : WideString; ls_Declaration: String; ls_Control: String; begin case iMessage of CB_GETLBTEXT :begin ls_Control := 'コンボボックス'; ls_Declaration := 'CB_GETLBTEXT'; li_GetCurSel := CB_GETCURSEL; li_GetTextLen := CB_GETLBTEXTLEN; li_Err := CB_ERR; end; LB_GETTEXT :begin ls_Control := 'リストボックス'; ls_Declaration := 'LB_GETTEXT'; li_GetCurSel := LB_GETCURSEL; li_GetTextLen := LB_GETTEXTLEN; li_Err := LB_ERR; end; else begin Exit; end; end; if not(IsNowAPI(ls_Declaration)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := ls_Declaration; Description := Format('%sのアイテムの文字列を取得します。', [ls_Control]) + lcsTITLE_CRLF + 'wParam アイテムのインデックスを指定。このテストでは選択行を指定。' + lcsCRLF + 'lParam 文字列を受け取るバッファのアドレスを指定。' + lcsCRLF + '戻り値 取得したアイテムの文字数が返ります。'; FAddElement('hwnd', Format('調べたい%sのハンドルを指定します。', [ls_Control])); FAddElement('wParam', 'アイテムのインデックスを指定します。' + lcsCRLF + 'このテストでは選択行を指定しています。'); FAddElement('lParam', 'lParamに指定したバッファにアイテムの文字列がコピーされます。'); FAddElement('戻り値', '取得したアイテムの文字数が返ります。終端のNULL文字分は含みません。' + lcsCRLF + 'wParamに範囲外のインデックスを指定した場合はエラーが返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin ls_Item := ''; //現在の選択行を取得。 if (SendMessageTimeoutW(hHandle, li_GetCurSel, 0, 0, SMTO_ABORTIFHUNG, 500, li_Index) <> 0) then begin if (li_Index = DWORD(li_Err)) then begin li_Index := 0; end; end else begin li_Index := 0; end; //文字数を取得 if (SendMessageTimeoutW(hHandle, li_GetTextLen, WPARAM(li_Index), 0, SMTO_ABORTIFHUNG, 500, li_Len) <> 0) then begin if (li_Len <> DWORD(li_Err)) and (li_Len > 0) then begin lp_Buff := AllocMem((li_Len +1) * SizeOf(WideChar)); try SendMessageTimeoutW(hHandle, iMessage, WPARAM(li_Index), LPARAM(lp_Buff), SMTO_ABORTIFHUNG, 500, li_Len); ls_Item := WideString(lp_Buff); finally FreeMem(lp_Buff); end; end; FAddIntValue(li_Index); FAddStrValue(ls_Item); FAdd_LBIntValue(li_Len); end; end; end; procedure T_MyAPIValue.FCBLB_GetTextLen( hHandle: HWND; iMessage: UINT ); var li_GetCurSel : UINT; li_Err : Integer; li_Index : DWORD; li_Len : DWORD; ls_Declaration: String; ls_Control: String; l_Func: procedure(iValue: DWORD) of object; begin case iMessage of CB_GETLBTEXTLEN :begin ls_Control := 'コンボボックス'; ls_Declaration := 'CB_GETLBTEXTLEN'; li_GetCurSel := CB_GETCURSEL; li_Err := CB_ERR; l_Func := FAdd_CBIntValue; end; LB_GETTEXTLEN :begin ls_Control := 'リストボックス'; ls_Declaration := 'LB_GETTEXTLEN'; li_GetCurSel := LB_GETCURSEL; li_Err := LB_ERR; l_Func := FAdd_LBIntValue; end; else begin Exit; end; end; if not(IsNowAPI(ls_Declaration)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := ls_Declaration; Description := Format('%sのアイテムの文字数を取得します。', [ls_Control]) + lcsTITLE_CRLF + 'wParam アイテムのインデックスを指定。このテストでは選択行を指定。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 アイテムの文字数が返ります。'; FAddElement('hwnd', Format('調べたい%sのハンドルを指定します。', [ls_Control])); FAddElement('wParam', 'アイテムのインデックスを指定します。このテストでは選択行を指定しています。'); FAddElement('戻り値', 'アイテムの文字数が返ります。終端のNULL文字分は含みません。wParamに範囲外のインデックスを指定した場合はエラーが返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin //現在の選択行を取得。 if (SendMessageTimeoutW(hHandle, li_GetCurSel, 0, 0, SMTO_ABORTIFHUNG, 500, li_Index) <> 0) then begin if (li_Index = DWORD(li_Err)) then begin li_Index := 0; end; end else begin li_Index := 0; end; FAddIntValue(li_Index); if (SendMessageTimeoutW(hHandle, iMessage, li_Index, 0, SMTO_ABORTIFHUNG, 500, li_Len) <> 0) then begin l_Func(li_Len); end; end; end; // CB_GETCOUNT ----------------------------------------------------------------- procedure T_MyAPIValue.FCB_GetCount; begin FCBLB_GetCount(FhWndHandle, CB_GETCOUNT); end; // CB_GETCURSEL ---------------------------------------------------------------- procedure T_MyAPIValue.FCB_GetCurSel; begin FCBLB_GetCount(FhWndHandle, CB_GETCURSEL); end; // CB_GETLBTEXT ---------------------------------------------------------------- procedure T_MyAPIValue.FCB_GetLBText; begin FCBLB_GetText(FhWndHandle, CB_GETLBTEXT); end; // CB_GETLBTEXTLEN ------------------------------------------------------------- procedure T_MyAPIValue.FCB_GetLBTextLen; begin FCBLB_GetTextLen(FhWndHandle, CB_GETLBTEXTLEN); end; // LB_GETCOUNT ----------------------------------------------------------------- procedure T_MyAPIValue.FLB_GetCount; begin FCBLB_GetCount(FhWndHandle, LB_GETCOUNT); end; // LB_GETCURSEL ---------------------------------------------------------------- procedure T_MyAPIValue.FLB_GetCurSel; begin FCBLB_GetCount(FhWndHandle, LB_GETCURSEL); end; // LB_GETTEXT ------------------------------------------------------------------ procedure T_MyAPIValue.FLB_GetText; begin FCBLB_GetText(FhWndHandle, LB_GETTEXT); end; // LB_GETTEXTLEN --------------------------------------------------------------- procedure T_MyAPIValue.FLB_GetTextLen; begin FCBLB_GetTextLen(FhWndHandle, LB_GETTEXTLEN); end; //トラックバー (* // TBM_GETBUDDY ---------------------------------------------------------------- //他アプリに深刻なエラーを起こす。 procedure T_MyAPIValue.FTBM_GetBuddy; const lcs_DECLARATION = 'TBM_GETBUDDY'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETBUDDY, {TRUE|FALSE}, 0)'; lcs_DESCRIPTION = 'Retrieves the handle to a trackbar control buddy window at a given location. The specified location is relative to the control''s orientation (horizontal or vertical). ' + lcsTITLE_CRLF + 'wParam TRUEもしくはFALSEを指定します。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 Returns the handle to the buddy window at the location specified by wParam, or NULL if no buddy window exists at that location.' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'Returns the handle to the buddy window at the location specified by wParam, or NULL if no buddy window exists at that location.'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETBUDDY, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; *) (* // TBM_GETCHANNELRECT ---------------------------------------------------------- //他アプリに深刻なエラーを起こす。 procedure T_MyAPIValue.FTBM_GetChannelRECT; const lcs_DECLARATION = 'TBM_GETCHANNELRECT'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETCHANNELRECT, 0, LPARAM(@l_Rect))'; lcs_DESCRIPTION = 'トラックバーのスライダーが移動する範囲を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 値を受け取るRECT構造体の変数のポインタを指定。' + lcsCRLF + '戻り値 ありません。' ; var li_Ret : DWORD; l_Rect : TRect; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('lParam', '値を受け取るRECT構造体の変数のポインタを指定します。' + lcsCRLF + 'この構造体にスライダーが移動する範囲の矩形領域(RECT)がクライアント座標で格納されます。'); FAddElement('戻り値', '無いはずの戻り値。たまに-1が返る。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FillChar(l_Rect, SizeOf(l_Rect), 0); SendMessageTimeout(FhWndHandle, TBM_GETCHANNELRECT, 0, LPARAM(@l_Rect), SMTO_ABORTIFHUNG, 500, li_Ret); FAddRectValue(l_Rect); FAddIntValue(Integer(li_Ret)); end; end; *) // TBM_GETNUMTICS -------------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetNumTics; const lcs_DECLARATION = 'TBM_GETNUMTICS'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETNUMTICS, 0, 0)'; lcs_DESCRIPTION = 'トラックバーの目盛りの数を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 トラックバーの目盛りの数が返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'トラックバーの目盛りの数が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETNUMTICS, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; // FTBM_GETLINESIZE ------------------------------------------------------------ procedure T_MyAPIValue.FTBM_GetLineSize; const lcs_DECLARATION = 'TBM_GETLINESIZE'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETLINESIZE, 0, 0)'; lcs_DESCRIPTION = 'キーボードの左右キーを押した時にトラックバーのスライダーの動く単位(ラインサイズ)を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 スライダーの動く単位(ラインサイズ)が返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'スライダーの動く単位(ラインサイズ)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETLINESIZE, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; // TBM_GETPAGESIZE ------------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetPageSize; const lcs_DECLARATION = 'TBM_GETPAGESIZE'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETPAGESIZE, 0, 0)'; lcs_DESCRIPTION = 'キーボードの[PgUp][PgDn]キーを押した時にトラックバーのスライダーの動く単位(ページサイズ)を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 スライダーの動く単位(ページサイズ)が返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'スライダーの動く単位(ページサイズ)が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETPAGESIZE, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; // TBM_GETPOS ------------------------------------------------------------------ procedure T_MyAPIValue.FTBM_GetPos; const lcs_DECLARATION = 'TBM_GETPOS'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETPOS, 0, 0)'; lcs_DESCRIPTION = 'トラックバーのスライダーの現在位置を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 スライダーの現在位置が返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'スライダーの現在位置が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETPOS, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; (* // TBM_GETPTICS ---------------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetPTics; const lcs_DECLARATION = 'TBM_GETPTICS'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETPTICS, 0, 0)'; lcs_DESCRIPTION = 'トラックバーのスライダーの目盛りの位置の配列を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 スライダーの目盛りの位置の配列の先頭アドレスが返ります。' ; { type T_PTics = record case Integer of 0: (iValue: DWORD); 1: (iV1, iV2, iV3, iV4: Byte); end; P_PTics = ^T_PTics; } var li_Ret : array of DWORD; // lp_Ret : PDWORD; // lp_Ret : DWORD; // lp_Dat : P_PTics; li_Num : DWORD; i : Integer; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'スライダーの目盛りの位置の配列の先頭アドレスが返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETNUMTICS, 0, 0, SMTO_ABORTIFHUNG, 500, li_Num); if (li_Num > 2) then begin Dec(li_Num, 2); //目盛りの数より2少ない数の配列のため {うまく行かない} SetLength(li_Ret, li_Num); // lp_Dat := New(P_PTics); // try // lp_Ret := PDWORD(SendMessage(FhWndHandle, TBM_GETPTICS, 0, 0)); // lp_Ret := DWORD(SendMessage(FhWndHandle, TBM_GETPTICS, 0, 0)); SendMessageTimeout(FhWndHandle, TBM_GETPTICS, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret[0]); // FAddDumpValue(PAnsiChar(@lp_Ret), SizeOf(DWORD) * li_Num); for i := 0 to li_Num -1 do begin FAddIntValue(li_Ret[i]); //Inc(lp_Ret); // lp_Ret := PDWORD(PAnsiChar(@lp_Dat)[i * SizeOf(DWORD)]); // FAddIntValue(Integer(lp_Ret)); // FAddIntValue(Integer(PAnsiChar(@lp_Ret)[i * SizeOf(DWORD)])); // Inc(lp_Ret, SizeOf(DWORD)); // lp_Dat.iV1 := Byte(PAnsiChar(@lp_Ret)[i * SizeOf(DWORD) +0]); // lp_Dat.iV2 := Byte(PAnsiChar(@lp_Ret)[i * SizeOf(DWORD) +1]); // lp_Dat.iV3 := Byte(PAnsiChar(@lp_Ret)[i * SizeOf(DWORD) +2]); // lp_Dat.iV4 := Byte(PAnsiChar(@lp_Ret)[i * SizeOf(DWORD) +3]); // FAddIntValue(Integer(lp_Dat.iValue)); end; // finally // Dispose(lp_Dat); // end; end; end; end; *) // TBM_GETRANGEMAX ------------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetRangeMAX; const lcs_DECLARATION = 'TBM_GETRANGEMAX'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETRANGEMAX, 0, 0)'; lcs_DESCRIPTION = 'トラックバーの最大値を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 トラックバーの最大値が返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'ラックバーの最大値が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETRANGEMAX, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; // TBM_GETRANGEMIN ------------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetRangeMIN; const lcs_DECLARATION = 'TBM_GETRANGEMIN'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETRANGEMIN, 0, 0)'; lcs_DESCRIPTION = 'トラックバーの最小値を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 トラックバーの最小値が返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'トラックバーの最小値が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETRANGEMIN, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; // TBM_GETTHUMBLENGTH ---------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetThumbLength; const lcs_DECLARATION = 'TBM_GETTHUMBLENGTH'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETTHUMBLENGTH, 0, 0)'; lcs_DESCRIPTION = 'トラックバーのスライダーの高さを取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 スライダーの高さがピクセル数で返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'スライダーの高さがピクセル数で返ります。' + lcsCRLF + 'トラックバーが縦長の場合はスライダーの幅になります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETTHUMBLENGTH, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; (* // TBM_GETTHUMBRECT ------------------------------------------------------------ //他アプリに深刻なエラーを起こす。 procedure T_MyAPIValue.FTBM_GetThumbRECT; const lcs_DECLARATION = 'TBM_GETTHUMBRECT'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETTHUMBRECT, 0, LPARAM(@l_Rect))'; lcs_DESCRIPTION = 'トラックバーのスライダーの矩形領域(RECT)を取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 値を受け取るRECT構造体の変数のポインタを指定。' + lcsCRLF + '戻り値 ありません。' ; var li_Ret : DWORD; l_Rect : TRect; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('lParam', '値を受け取るRECT構造体の変数のポインタを指定します。' + lcsCRLF + 'この構造体にスライダーの矩形領域(RECT)がクライアント座標で格納されます。'); FAddElement('戻り値', '無いはずの戻り値。たまに-1が返る。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin FillChar(l_Rect, SizeOf(l_Rect), 0); SendMessageTimeout(FhWndHandle, TBM_GETTHUMBRECT, 0, LPARAM(@l_Rect), SMTO_ABORTIFHUNG, 500, li_Ret); FAddRectValue(l_Rect); //myDebug.gpcDebug(li_Ret); FAddIntValue(Integer(li_Ret)); end; end; *) // TBM_GETTIC ------------------------------------------------------------------ procedure T_MyAPIValue.FTBM_GetTic; const lcs_DECLARATION = 'TBM_GETTIC'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETTIC, WPARAM(iIndex), 0)'; lcs_DESCRIPTION = 'トラックバーの目盛りの位置を取得します。' + lcsTITLE_CRLF + 'wParam 調べたい目盛りの位置を0ベースで指定。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 トラックバーの目盛りの位置が返ります。' ; var li_Pos : DWORD; li_Min : DWORD; li_Max : DWORD; li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', '目盛りの位置が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETPOS, 0, 0, SMTO_ABORTIFHUNG, 500, li_Pos); //スライダの現在位置 SendMessageTimeout(FhWndHandle, TBM_GETRANGEMIN, 0, 0, SMTO_ABORTIFHUNG, 500, li_Min); //トラックバーの最小値 SendMessageTimeout(FhWndHandle, TBM_GETRANGEMAX, 0, 0, SMTO_ABORTIFHUNG, 500, li_Max); //トラックバーの最小値 if (li_Min <= li_Pos) then begin if (li_Pos = li_Min) then begin FAddStrValue(WideFormat('現在位置がトラックバーの最小値の場合は無効です。(%d)', [li_Pos])); end else if (li_Pos = li_Max) then begin FAddStrValue(WideFormat('現在位置がトラックバーの最大値の場合は無効です。(%d)', [li_Pos])); end else begin SendMessageTimeout(FhWndHandle, TBM_GETTIC, WPARAM(li_Pos - li_Min) -1, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end else begin FAddStrValue('エラー(恐らくウィンドウはトラックバーではありません)'); end; end; end; // TBM_GETTICPOS --------------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetTicPos; const lcs_DECLARATION = 'TBM_GETTICPOS'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETTICPOS, WPARAM(iIndex), 0)'; lcs_DESCRIPTION = 'トラックバーの目盛りの位置を取得します。' + lcsTITLE_CRLF + 'wParam 調べたい目盛りの位置を0ベースで指定。このテストではスライダーの現在位置を指定。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 トラックバーの目盛りの位置がクライアント座標で返ります。' ; var li_Pos : DWORD; li_Min : DWORD; li_Max : DWORD; li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', '目盛りの位置が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETPOS, 0, 0, SMTO_ABORTIFHUNG, 500, li_Pos); //スライダの現在位置 SendMessageTimeout(FhWndHandle, TBM_GETRANGEMIN, 0, 0, SMTO_ABORTIFHUNG, 500, li_Min); //トラックバーの最小値 SendMessageTimeout(FhWndHandle, TBM_GETRANGEMAX, 0, 0, SMTO_ABORTIFHUNG, 500, li_Max); //トラックバーの最小値 if (li_Min <= li_Pos) then begin if (li_Pos = li_Min) then begin FAddStrValue(WideFormat('現在位置がトラックバーの最小値の場合は無効です。(%d)', [li_Pos])); end else if (li_Pos = li_Max) then begin FAddStrValue(WideFormat('現在位置がトラックバーの最大値の場合は無効です。(%d)', [li_Pos])); end else begin SendMessageTimeout(FhWndHandle, TBM_GETTICPOS, WPARAM(li_Pos - li_Min -1), 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end else begin FAddStrValue('エラー(恐らくウィンドウはトラックバーではありません)'); end; end; end; // TBM_GETTOOLTIPS ------------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetToolTips; const lcs_DECLARATION = 'TBM_GETTOOLTIPS'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETTOOLTIPS, 0, 0)'; lcs_DESCRIPTION = 'トラックバーにTBS_TOOLTIPSスタイルがセットされているかどうかを取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 TBS_TOOLTIPSスタイルがセットされていれば0以外の値が返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'TBS_TOOLTIPSスタイルがセットされていれば0以外の値が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETTOOLTIPS, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; // TBM_GETUNICODEFORMAT -------------------------------------------------------- procedure T_MyAPIValue.FTBM_GetUnicodeFormat; const lcs_DECLARATION = 'TBM_GETUNICODEFORMAT'; // lcs_DECLARATION = 'SendMessage(hwnd, TBM_GETUNICODEFORMAT, 0, 0)'; lcs_DESCRIPTION = 'トラックバーがユニコード対応かどうかを取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 トラックバーがユニコード対応であれば0以外が返ります。' ; var li_Ret : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいトラックバーのハンドルを指定します。'); FAddElement('戻り値', 'トラックバーがユニコード対応であれば0以外が返ります。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin SendMessageTimeout(FhWndHandle, TBM_GETUNICODEFORMAT, 0, 0, SMTO_ABORTIFHUNG, 500, li_Ret); FAddIntValue(Integer(li_Ret)); end; end; // WM_GETTEXT ------------------------------------------------------------------ procedure T_MyAPIValue.FWM_GetText; const lcs_DECLARATION = 'WM_GETTEXT'; lcs_DESCRIPTION = '指定されたウィンドウのテキストを取得します。' + lcsTITLE_CRLF + 'wParam 取得するテキストの文字数を指定。'+ lcsCRLF + 'lParam 文字列を受け取るバッファのアドレスを指定。' + lcsCRLF + '戻り値 取得したテキストの文字数が返ります。' ; const lci_OUTPUTNUM = 2; var li_Ret : DWORD; li_Len : DWORD; lp_Buff : PWideChar; ls_Text : WideString; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウのハンドルを指定します。'); FAddElement('wParam', '取得するテキストの文字数を指定します。' + lcsCRLF + 'このテストではWM_GETTEXTLENGTHメッセージで取得した値を指定しています。'); FAddElement('lParam', '文字列を受け取るバッファのアドレスを指定します。' + lcsCRLF + 'このバッファにウィンドウのテキストが格納されます。'); FAddElement('戻り値', '関数が成功するとコピーされたテキストの文字数が返ります(終端のNULL文字分は含められません)。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin li_Ret := 0; ls_Text := ''; if (SendMessageTimeoutW(FhWndHandle, WM_GETTEXTLENGTH, 0, 0, SMTO_ABORTIFHUNG, 500, li_Len) <> 0) then begin if (li_Len > 0) then begin lp_Buff := AllocMem((li_Len +1) * SizeOf(WideChar)); try if (SendMessageTimeoutW(FhWndHandle, WM_GETTEXT, WPARAM(li_Len +1), LPARAM(lp_Buff), SMTO_ABORTIFHUNG, 500, li_Ret) <> 0) then begin ls_Text := WideString(lp_Buff); end; finally FreeMem(lp_Buff); end; end; FAddIntValue(li_Len); FAddStrValue(ls_Text); FAddIntValue(li_Ret); end; end; end; // WM_GETTEXTLENGTH ------------------------------------------------------------ procedure T_MyAPIValue.FWM_GetTextLength; const lcs_DECLARATION = 'WM_GETTEXTLENGTH'; lcs_DESCRIPTION = '指定されたウィンドウのテキストの長さを取得します。' + lcsTITLE_CRLF + 'wParam 使用しません。' + lcsCRLF + 'lParam 使用しません。' + lcsCRLF + '戻り値 テキストの長さが返ります。' ; var li_Len : DWORD; begin if not(IsNowAPI(lcs_DECLARATION)) then begin //グリッド表示をこのAPI用に初期化する。 Clear; Declaration := lcs_DECLARATION; Description := lcs_DESCRIPTION; FAddElement('hwnd', '調べたいウィンドウまたはコントロールのハンドルを指定します。'); FAddElement('戻り値', 'ウィンドウのテキストの長さが返ります(終端のNULL文字分は含められません)。'); end else begin //値のみ初期化 FClearValue; end; if (FAddWindowValue) //調べるウィンドウの簡易情報を表示 then begin li_Len := 0; if (SendMessageTimeoutW(FhWndHandle, WM_GETTEXTLENGTH, 0, 0, SMTO_ABORTIFHUNG, 500, li_Len) <> 0) then begin FAddIntValue(li_Len); end; end; end; //============================================================================== // T_Execute ------------------------------------------------------------------- constructor T_Execute.Create(sName: String; AFunc: T_ExecuteFunc; sCategory: String); begin FsName := sName; FFunc := AFunc; FsCategory := sCategory; end; // T_MyAPIValue ---------------------------------------------------------------- procedure T_MyAPIValue.FAddFunc(sName: String; AFunc: T_ExecuteFunc; sCategory: String = ''); begin FOrgItems.AddObject(sName, T_Execute.Create(sName, AFunc, sCategory)); end; destructor T_MyAPIValue.Destroy; var i: Integer; begin Self.Clear; FDescription.Free; FWindowList.Free; FItems.Free; for i := 0 to FOrgItems.Count -1 do begin FOrgItems.Objects[i].Free; end; FOrgItems.Free; inherited; end; function SortCategroyFunc(AString: TStringList; iIndex1, iIndex2: Integer): Integer; var // l_Execute : T_Execute; ls_Compare1, ls_Compare2: String; begin if (AString.Objects[iIndex1] = nil) then begin ls_Compare1 := AString[iIndex1]; end else begin ls_Compare1 := T_Execute(AString.Objects[iIndex1]).SortCategory; end; if (AString.Objects[iIndex2] = nil) then begin ls_Compare2 := AString[iIndex2]; end else begin ls_Compare2 := T_Execute(AString.Objects[iIndex2]).SortCategory; end; Result := CompareText(ls_Compare1, ls_Compare2); if (Result = 0) then begin Result := CompareText(AString[iIndex1], AString[iIndex2]); end; end; function T_MyAPIValue.Execute(sTestAPI: String; hWindow: HWND; ptPos: TPoint): Integer; var i : Integer; l_Execute : T_Execute; begin Result := 0; //このクラスでは-1でなければ良い。 FhWndHandle := hWindow; FptPos := ptPos; for i := 0 to FOrgItems.Count -1 do begin l_Execute := T_Execute(FOrgItems.Objects[i]); if (l_Execute.Name = sTestAPI) then begin FsAPIName := l_Execute.Name; l_Execute.Func; Exit; end; end; Result := -1; end; function T_MyAPIValue.IsNowAPI(sDeclaration: String): Boolean; begin Result := (Self.Declaration <> '') and (Self.Declaration = sDeclaration) and not(FbRefresh) ; FbRefresh := False; end; procedure T_MyAPIValue.FLoadModule(sLibrary, sFuncAddr: String); begin FhLoadModule := LoadLibraryW(PWideChar(gfnsSystem32DirGet + sLibrary)); if (FhLoadModule <> 0) then begin FpFuncAddr := GetProcAddress(FhLoadModule, PChar(sFuncAddr)); end else begin FpFuncAddr := nil; end; end; procedure T_MyAPIValue.Clear; begin FsDeclaration := ''; //関数宣言 FDescription.Clear; //関数の説明 SetLength(FsParams, 0); Self.FClearValue; SetLength(FsHints, 0); if (FhLoadModule <> 0) then begin FreeLibrary(FhLoadModule); end; if (FpFuncAddr <> nil) then begin FpFuncAddr := nil; end; end; procedure T_MyAPIValue.FClearValue; begin SetLength(FsValues, 0); end; procedure T_MyAPIValue.FSetElement(iCount: Integer); var i : Integer; li_Count : Integer; begin //myDebug.gpcDebug([FGetParamCount, High(FsParams), iIndex]); li_Count := FGetParamCount; //現在の項目の数 if (li_Count = iCount) then begin //項目数が同じなら処理を抜ける Exit; end; SetLength(FsParams, iCount); if (iCount > li_Count) then begin //項目数を増やした for i := li_Count to iCount -1 do begin //添え字は0ベースなので-1する必要はない FsParams[i] := ''; end; end; end; function T_MyAPIValue.FGetSendText: WideString; procedure _SetResult(var sResult: WideString; sAdd: WideString); begin sResult := sResult + #1 + sAdd; end; var i: Integer; begin Result := FsDeclaration + #1; //宣言 _SetResult(Result, FsDescription); //説明 _SetResult(Result, IntToStr(Self.ParamCount)); //項目名とヒントの数 for i := 0 to Self.ParamCount -1 do begin _SetResult(Result, Self.Params[i]); //項目名 _SetResult(Result, Self.Hints[i]); //ヒント end; _SetResult(Result, IntToStr(Self.ValueCount)); //テストの値の数 for i := 0 to Self.ValueCount -1 do begin _SetResult(Result, Self.Values[i]); //テストの値 end; end; procedure T_MyAPIValue.FAddItems(sItems: array of String); var i: Integer; begin for i := Low(sItems) to High(sItems) do begin FItems.Add(sItems[i]); end; end; function T_MyAPIValue.FGetText(sItems: array of WideString): WideString; var i: Integer; begin Result := ''; for i := Low(sItems) to High(sItems) do begin if (Result = '') then begin Result := sItems[i]; end else begin Result := Result + CRLF + sItems[i]; end; end; end; procedure T_MyAPIValue.FAddDescription(sLines: array of WideString); begin FsDescription := FGetText(sLines); end; function T_MyAPIValue.FGetParam(iIndex: Integer): WideString; begin Result := FsParams[iIndex]; end; function T_MyAPIValue.FGetValue(iIndex: Integer): WideString; begin Result := FsValues[iIndex]; end; function T_MyAPIValue.FGetHint(iIndex: Integer): WideString; begin Result := FsHints[iIndex]; end; function T_MyAPIValue.FGetCount: Integer; var li_Params, li_Values: Integer; begin li_Params := Length(FsParams); li_Values := Length(FsValues); if (li_Values > li_Params) then Result := li_Values else Result := li_Params; end; function T_MyAPIValue.FGetParamCount: Integer; begin Result := Length(FsParams); end; function T_MyAPIValue.FGetValueCount: Integer; begin Result := Length(FsValues); end; procedure T_MyAPIValue.FAddElement(sParam, sHint: WideString); var li_Count: Integer; begin li_Count := Length(FsParams) +1; SetLength(FsParams, li_Count); FsParams[li_Count -1] := sParam; SetLength(FsHints, li_Count); FsHints[li_Count -1] := sHint; end; procedure T_MyAPIValue.FAddElement(sParam: WideString; sHint: array of WideString); begin FAddElement(sParam, FGetText(sHint)); end; procedure T_MyAPIValue.FAddElement(sParam: WideString); begin FAddElement(sParam, ''); end; procedure T_MyAPIValue.FAddStrValue(sValue: WideString; bQuot: Boolean = False); var li_Count: Integer; begin li_Count := Length(FsValues) +1; SetLength(FsValues, li_Count); if (bQuot) then begin FsValues[li_Count -1] := '"' + sValue + '"'; end else begin FsValues[li_Count -1] := sValue; end; end; procedure T_MyAPIValue.FAddBlank(iCount: Integer); var i : Integer; begin for i := 1 to iCount do begin FAddStrValue(''); end; end; procedure T_MyAPIValue.FAddBlank; begin Self.FAddBlank(1); end; function F_GetWindowValue(hHandle: HWND): WideString; function _LimitText(sText: WideString): WideString; const lci_MAXLENGTH = 64; begin if (Length(sText) > lci_MAXLENGTH) then Result := Copy(sText, 1, lci_MAXLENGTH) + '…' else Result := sText; end; begin if (IsWindow(hHandle)) then Result := WideFormat('0x%0:.8x %0:d %s "%s"', [hHandle, gfnsClassNameGet(hHandle), _LimitText(gfnsWindowTextGet(hHandle))]) else Result := WideFormat('0x%0:.8x %0:d ウィンドウハンドルが無効です', [hHandle]); end; function T_MyAPIValue.FAddWindowValue(hHandle: HWND): Boolean; begin Result := IsWindow(hHandle); FAddStrValue(F_GetWindowValue(hHandle)); end; function T_MyAPIValue.FAddWindowValue: Boolean; begin Result := FAddWindowValue(FhWndHandle); end; { procedure T_MyAPIValue.FAddHResultValue(iValue: HResult); var ls_Value: WideString; begin if (Succeeded(iValue)) then begin ls_Value := 'S_OK'; end else begin ls_Value := WideFormat('ERROR:%d', [iValue]); end; FPutValue(ls_Value); end; } function T_MyAPIValue.FGetBoolValue(bValue: Boolean): WideString; begin if (bValue) then Result := 'True' else Result := 'False'; end; procedure T_MyAPIValue.FAddBoolValue(bValue: Boolean); begin FAddStrValue(FGetBoolValue(bValue)); end; function T_MyAPIValue.FGetColorName(clColor: TColor): WideString; begin case clColor of $CD5C5C: Result := 'IndianRed'; $F08080: Result := 'LightCoral'; $FA8072: Result := 'Salmon'; $E9967A: Result := 'DarkSalmon'; $FFA07A: Result := 'LightSalmon'; $DC143C: Result := 'Crimson'; $FF0000: Result := 'Red'; $B22222: Result := 'FireBrick'; $8B0000: Result := 'DarkRed'; $FFC0CB: Result := 'Pink'; $FFB6C1: Result := 'LightPink'; $FF69B4: Result := 'HotPink'; $FF1493: Result := 'DeepPink'; $C71585: Result := 'MediumVioletRed'; $DB7093: Result := 'PaleVioletRed'; $FF7F50: Result := 'Coral'; $FF6347: Result := 'Tomato'; $FF4500: Result := 'OrangeRed'; $FF8C00: Result := 'DarkOrange'; $FFA500: Result := 'Orange'; $FFD700: Result := 'Gold'; $FFFF00: Result := 'Yellow'; $FFFFE0: Result := 'LightYellow'; $FFFACD: Result := 'LemonChiffon'; $FAFAD2: Result := 'LightGoldenrodYellow'; $FFEFD5: Result := 'PapayaWhip'; $FFE4B5: Result := 'Moccasin'; $FFDAB9: Result := 'PeachPuff'; $EEE8AA: Result := 'PaleGoldenrod'; $F0E68C: Result := 'Khaki'; $BDB76B: Result := 'DarkKhaki'; $E6E6FA: Result := 'Lavender'; $D8BFD8: Result := 'Thistle'; $DDA0DD: Result := 'Plum'; $EE82EE: Result := 'Violet'; $DA70D6: Result := 'Orchid'; $FF00FF: Result := 'Fuchsia/Magenta'; $BA55D3: Result := 'MediumOrchid'; $9370DB: Result := 'MediumPurple'; $9966CC: Result := 'Amethyst'; $8A2BE2: Result := 'BlueViolet'; $9400D3: Result := 'DarkViolet'; $9932CC: Result := 'DarkOrchid'; $8B008B: Result := 'DarkMagenta'; $800080: Result := 'Purple'; $4B0082: Result := 'Indigo'; $6A5ACD: Result := 'SlateBlue'; $483D8B: Result := 'DarkSlateBlue'; $7B68EE: Result := 'MediumSlateBlue'; $ADFF2F: Result := 'GreenYellow'; $7FFF00: Result := 'Chartreuse'; $7CFC00: Result := 'LawnGreen'; $00FF00: Result := 'Lime'; $32CD32: Result := 'LimeGreen'; $98FB98: Result := 'PaleGreen'; $90EE90: Result := 'LightGreen'; $00FA9A: Result := 'MediumSpringGreen'; $00FF7F: Result := 'SpringGreen'; $3CB371: Result := 'MediumSeaGreen'; $2E8B57: Result := 'SeaGreen'; $228B22: Result := 'ForestGreen'; $008000: Result := 'Green'; $006400: Result := 'DarkGreen'; $9ACD32: Result := 'YellowGreen'; $6B8E23: Result := 'OliveDrab'; $808000: Result := 'Olive'; $556B2F: Result := 'DarkOliveGreen'; $66CDAA: Result := 'MediumAquamarine'; $8FBC8F: Result := 'DarkSeaGreen'; $20B2AA: Result := 'LightSeaGreen'; $008B8B: Result := 'DarkCyan'; $008080: Result := 'Teal'; $00FFFF: Result := 'Aqua/Cyan'; $E0FFFF: Result := 'LightCyan'; $AFEEEE: Result := 'PaleTurquoise'; $7FFFD4: Result := 'Aquamarine'; $40E0D0: Result := 'Turquoise'; $48D1CC: Result := 'MediumTurquoise'; $00CED1: Result := 'DarkTurquoise'; $5F9EA0: Result := 'CadetBlue'; $4682B4: Result := 'SteelBlue'; $B0C4DE: Result := 'LightSteelBlue'; $B0E0E6: Result := 'PowderBlue'; $ADD8E6: Result := 'LightBlue'; $87CEEB: Result := 'SkyBlue'; $87CEFA: Result := 'LightSkyBlue'; $00BFFF: Result := 'DeepSkyBlue'; $1E90FF: Result := 'DodgerBlue'; $6495ED: Result := 'CornflowerBlue'; $4169E1: Result := 'RoyalBlue'; $0000FF: Result := 'Blue'; $0000CD: Result := 'MediumBlue'; $00008B: Result := 'DarkBlue'; $000080: Result := 'Navy'; $191970: Result := 'MidnightBlue'; $FFF8DC: Result := 'Cornsilk'; $FFEBCD: Result := 'BlanchedAlmond'; $FFE4C4: Result := 'Bisque'; $FFDEAD: Result := 'NavajoWhite'; $F5DEB3: Result := 'Wheat'; $DEB887: Result := 'BurlyWood'; $D2B48C: Result := 'Tan'; $BC8F8F: Result := 'RosyBrown'; $F4A460: Result := 'SandyBrown'; $DAA520: Result := 'Goldenrod'; $B8860B: Result := 'DarkGoldenrod'; $CD853F: Result := 'Peru'; $D2691E: Result := 'Chocolate'; $8B4513: Result := 'SaddleBrown'; $A0522D: Result := 'Sienna'; $A52A2A: Result := 'Brown'; $800000: Result := 'Maroon'; $FFFFFF: Result := 'White'; $FFFAFA: Result := 'Snow'; $F0FFF0: Result := 'Honeydew'; $F5FFFA: Result := 'MintCream'; $F0FFFF: Result := 'Azure'; $F0F8FF: Result := 'AliceBlue'; $F8F8FF: Result := 'GhostWhite'; $F5F5F5: Result := 'WhiteSmoke'; $FFF5EE: Result := 'Seashell'; $F5F5DC: Result := 'Beige'; $FDF5E6: Result := 'OldLace'; $FFFAF0: Result := 'FloralWhite'; $FFFFF0: Result := 'Ivory'; $FAEBD7: Result := 'AntiqueWhite'; $FAF0E6: Result := 'Linen'; $FFF0F5: Result := 'LavenderBlush'; $FFE4E1: Result := 'MistyRose'; $DCDCDC: Result := 'Gainsboro'; $D3D3D3: Result := 'LightGrey'; $C0C0C0: Result := 'Silver'; $A9A9A9: Result := 'DarkGray'; $808080: Result := 'Gray'; $696969: Result := 'DimGray'; $778899: Result := 'LightSlateGray'; $708090: Result := 'SlateGray'; $2F4F4F: Result := 'DarkSlateGray'; $000000: Result := 'Black'; else Result := ''; end; end; procedure T_MyAPIValue.FAddColorName(clColor: TColor); begin FAddStrValue(Format('#%.6x ', [clColor]) + FGetColorName(clColor)); end; function T_MyAPIValue.FGetIntValue(iValue: Integer): WideString; begin Result := WideFormat('%d', [iValue]); end; procedure T_MyAPIValue.FAddIntValue(iValue: Integer); begin FAddStrValue(FGetIntValue(iValue)); end; function T_MyAPIValue.FGetHexValue(iValue: DWORD; iPrec: Integer): WideString; var ls_Format : WideString; begin if (iPrec <= 0) then begin ls_Format := '0x%0:x %0:u'; end else begin ls_Format := '0x%0:.' + IntToStr(iPrec) + 'x %0:u'; end; Result := WideFormat(ls_Format, [DWORD(iValue)]); end; function T_MyAPIValue.FGetHexValue(iValue: Integer): WideString; begin Result := Self.FGetHexValue(DWORD(iValue), 8); end; function T_MyAPIValue.FGetHexValue(iValue: DWORD): WideString; begin Result := Self.FGetHexValue(iValue, 8); end; procedure T_MyAPIValue.FAddHexValue(iValue: DWORD; iPrec: Integer); begin FAddStrValue(FGetHexValue(iValue, iPrec)); end; procedure T_MyAPIValue.FAddHexValue(iValue: Integer); begin Self.FAddHexValue(DWORD(iValue), 8); end; procedure T_MyAPIValue.FAddHexValue(iValue: DWORD); begin Self.FAddHexValue(iValue, 8); end; function T_MyAPIValue.FGetPointValue(APoint: TPoint): WideString; begin Result := WideFormat('(%d, %d)', [APoint.X, APoint.Y]); end; procedure T_MyAPIValue.FAddPointValue(APoint: TPoint); begin FAddStrValue(FGetPointValue(APoint)); end; function T_MyAPIValue.FGetRectValue(ARect: TRect): WideString; begin Result := WideFormat('(%d, %d, %d, %d)', [ARect.Left, ARect.Top, ARect.Right, ARect.Bottom]); end; procedure T_MyAPIValue.FAddRectValue(ARect: TRect); begin FAddStrValue(FGetRectValue(ARect)); end; procedure T_MyAPIValue.FAddDumpValue(pData: PAnsiChar; iCount: Integer; bUnicode: Boolean = False); {2010-10-05: pDataを16進ダンプする } const lcs_NOTCHAR = '.'; lci_DUMP = 16; lci_DUMPHEX = lci_DUMP * 3 +2; lcs_HEX_CONVERT : array[0..lci_DUMP -1] of AnsiChar = '0123456789ABCDEF'; var i, k : Integer; li_Count : Integer; li_Mod : Integer; li_Index : Integer; //Shift-JISの第2バイトの判定用 lb_SJISFlag : Boolean; ls_Dump : array[0..lci_DUMPHEX -1] of AnsiChar; ls_Ansi : array[0..lci_DUMP -1] of AnsiChar; ls_Utf16LE : array[0..lci_DUMP -1 + SizeOf(WideChar)] of AnsiChar; //後でWideStringでキャストして取り出せるように#0#0の分で + SizeOf(WideChar) ls_Char : AnsiChar; li_Byte : Byte; li_Copy : Integer; begin li_Count := iCount div lci_DUMP; li_Mod := iCount mod lci_DUMP; if not(li_Mod > 0) then begin Dec(li_Count); end; for i := 0 to li_Count do begin if (li_Mod > 0) and (i = li_Count) then begin li_Copy := li_Mod; end else begin li_Copy := lci_DUMP; end; FillChar(ls_Dump, lci_DUMPHEX, $20); FillChar(ls_Ansi, lci_DUMP, $20); // Move(pData[lci_DUMP * i], ls_Ansi, lci_DUMP); Move(pData[lci_DUMP * i], ls_Ansi, li_Copy); if (bUnicode) then begin FillChar(ls_Utf16LE, SizeOf(ls_Utf16LE), #0); // Move(pData[lci_DUMP * i], ls_Utf16LE, lci_DUMP); Move(pData[lci_DUMP * i], ls_Utf16LE, li_Copy); end; lb_SJISFlag := False; li_Index := 0; for k := 0 to lci_DUMP -1 do begin if (li_Mod > 0) and (i = li_Count) and (k >= li_Mod) then begin // ls_Dump[li_Index] := ' '; Break; end; ls_Char := pData[lci_DUMP * i + k]; li_Byte := Ord(ls_Char); //16進ダンプ ls_Dump[li_Index] := lcs_HEX_CONVERT[li_Byte shr 4]; Inc(li_Index); ls_Dump[li_Index] := lcs_HEX_CONVERT[li_Byte and $F]; if (k = (lci_DUMP div 2) -1) then begin Inc(li_Index); ls_Dump[li_Index] := '-'; Inc(li_Index); end else begin Inc(li_Index, 2); end; case li_Byte of $81..$9F, $E0..$EF :begin //Shift-JISの第1バイト if (k = lci_DUMP -1) then begin ls_Ansi[k] := lcs_NOTCHAR; lb_SJISFlag := False; end else if not(lb_SJISFlag) then begin lb_SJISFlag := True; end else begin lb_SJISFlag := False; end; end; else begin case li_Byte of $0..$1F, $7F :begin //制御コード //'.'として表示 ls_Ansi[k] := lcs_NOTCHAR; if (bUnicode) then begin //Unicode リトルエンディアン //制御コードを'.'(#$2E)に置き換える。 if (k mod 2 = 0) then begin if (k < lci_DUMP) and (ls_Utf16LE[k +1] = #0) then begin // ls_Utf16LE[k +1] := #0; ls_Utf16LE[k] := lcs_NOTCHAR; //#$2E; //'.' end; end; end; end; $FD..$FF :begin //Shift-JISの範囲外なので'.'として表示 ls_Ansi[k] := lcs_NOTCHAR; end; $A1..$DF :begin //半角カタカナ //Shift-JISは第1バイト目でも第2バイト目でもOK end; $80, $A0, $F0..$FC :begin //Shift-JISの第2バイト if not(lb_SJISFlag) then begin //直前のバイトがShift-JISの第1バイトでないので'.'として表示 ls_Ansi[k] := lcs_NOTCHAR; end; end; end; lb_SJISFlag := False; end; end; end; if (bUnicode) then begin FAddStrValue(WideString(ls_Dump + ls_Ansi + ' ') + WideString(PWideChar(@ls_Utf16LE))); end else begin FAddStrValue(WideString(ls_Dump + ls_Ansi)); end; //myDebug.gpcDebug(AnsiString(ls_Ansi), i); end; end; // 以下、汎用関数 ============================================================== //スタイル function gfnbFlagCheck(iStyle: Longint; iCheck: Longint): Boolean; begin Result := ((iStyle and iCheck) = iCheck); end; function gfnsClassNameGet(hHandle: HWND): WideString; //ウィンドウハンドルhHandleのクラス名を返す const lci_LEN = 256; var lp_Buff: PWideChar; begin Result := ''; lp_Buff:= AllocMem((lci_LEN +1) * SizeOf(WideChar)); try GetClassNameW(hHandle, lp_Buff, lci_LEN -1); Result := WideString(lp_Buff); finally FreeMem(lp_Buff); end; end; function gfnsWindowTextGet(hHandle: HWND): WideString; var li_Len : DWORD; lp_Buff : PWideChar; li_Index : DWORD; li_Style : Longint; li_Ret : DWORD; begin Result := ''; li_Ret := 0; li_Len := GetWindowTextLengthW(hHandle); if (li_Len > 0) then begin Inc(li_Len); lp_Buff := AllocMem((li_Len) * SizeOf(WideChar)); try li_Ret := GetWindowTextW(hHandle, lp_Buff, li_Len); Result := WideString(lp_Buff); finally FreeMem(lp_Buff); end; if (li_Ret > 0) then begin Exit; end; end; //リストボックスがオーナードローでスタイルにLBS_HASSTRINGSがないと文字列は取得できない(文字化けすることがある) li_Style := GetWindowLong(hHandle, GWL_STYLE); if (gfnbFlagCheck(li_Style, LBS_OWNERDRAWFIXED)) or (gfnbFlagCheck(li_Style, LBS_OWNERDRAWVARIABLE)) then begin if not(gfnbFlagCheck(li_Style, LBS_HASSTRINGS)) then begin Exit; end; end; //他のアプリケーションのエディットボックス用。 if (SendMessageTimeoutW(hHandle, WM_GETTEXTLENGTH, 0, 0, SMTO_ABORTIFHUNG, 500, li_Len) <> 0) then begin if (li_Len > 0) then begin Inc(li_Len); lp_Buff := AllocMem(li_Len * SizeOf(WideChar)); try if (SendMessageTimeoutW(hHandle, WM_GETTEXT, WPARAM(li_Len), LPARAM(lp_Buff), SMTO_ABORTIFHUNG, 500, li_Ret) <> 0) then begin Result := WideString(lp_Buff); end; finally FreeMem(lp_Buff); end; if (li_Ret > 0) then begin Exit; end; end; end; //リストボックス用。 //現在の選択行を取得。 if (SendMessageTimeoutW(hHandle, LB_GETCURSEL, 0, 0, SMTO_ABORTIFHUNG, 500, li_Index) <> 0) then begin if (li_Index = DWORD(LB_ERR)) then begin li_Index := 0; end; end else begin li_Index := 0; end; if (SendMessageTimeoutW(hHandle, LB_GETTEXTLEN, li_Index, 0, SMTO_ABORTIFHUNG, 500, li_Len) <> 0) then begin //エラーでなく文字数が0より大きければ(1以上なら)処理に入る if (li_Len <> DWORD(LB_ERR)) and (li_Len > 0) then begin Inc(li_Len); lp_Buff := AllocMem((li_Len +1) * SizeOf(WideChar)); try if (SendMessageTimeoutW(hHandle, LB_GETTEXT, WPARAM(li_Index), LPARAM(lp_Buff), SMTO_ABORTIFHUNG, 500, li_Ret) <> 0) then begin Result := WideString(lp_Buff); end; finally FreeMem(lp_Buff); end; if (li_Ret > 0) then begin Exit; end; end; end; //コンボボックス用 if ((li_Style and CBS_OWNERDRAWFIXED) = LBS_OWNERDRAWFIXED) or ((li_Style and CBS_OWNERDRAWVARIABLE) = LBS_OWNERDRAWVARIABLE) then begin if not((li_Style and CBS_HASSTRINGS) = CBS_HASSTRINGS) then begin Exit; end; end; if (SendMessageTimeoutW(hHandle, CB_GETCURSEL, 0, 0, SMTO_ABORTIFHUNG, 500, li_Index) <> 0) then begin if (li_Index = DWORD(CB_ERR)) then begin li_Index := 0; end; end; if (SendMessageTimeoutW(hHandle, CB_GETLBTEXTLEN, li_Index, 0, SMTO_ABORTIFHUNG, 500, li_Len) <> 0) then begin if (li_Len <> DWORD(CB_ERR)) and (li_Len > 0) then begin Inc(li_Len); lp_Buff := AllocMem(li_Len * SizeOf(WideChar)); try if (SendMessageTimeoutW(hHandle, CB_GETLBTEXT, WPARAM(li_Index), LPARAM(lp_Buff), SMTO_ABORTIFHUNG, 500, li_Ret) <> 0) then begin Result := WideString(lp_Buff); end; finally FreeMem(lp_Buff); end; if (li_Ret > 0) then begin Exit; end; end; end; end; function gfnsSystem32DirGet: WideString; var li_Size : UINT; lp_Buff : PWideChar; begin Result := ''; li_Size := GetSystemDirectoryW(nil, 0); if (li_Size > 0) then begin lp_Buff := AllocMem(li_Size * SizeOf(WideChar)); try li_Size := GetSystemDirectoryW(lp_Buff, li_Size); if (li_Size > 0) then begin Result := WideString(lp_Buff) + '\'; end; finally FreeMem(lp_Buff); end; end; end; (* function gfnbIsAeroThemeEnabled: Boolean; var ls_Path : WideString; lh_Module : HMODULE; lb_Bool : BOOL; l_DwmIsCompositionEnabled : function(var bBool: BOOL): HResult stdcall; begin Result := False; ls_Path := gfnsSystem32DirGet; lh_Module := LoadLibraryW(PWideChar(ls_Path + 'Dwmapi.dll')); if (lh_Module <> 0) then begin try // DwmIsCompositionEnabled の関数ポインタを取得 @l_DwmIsCompositionEnabled := GetProcAddress(lh_Module, 'DwmIsCompositionEnabled'); if (@l_DwmIsCompositionEnabled <> nil) then begin l_DwmIsCompositionEnabled(lb_Bool); Result := lb_Bool; end; finally FreeLibrary(lh_Module); end; end; end; *) //function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall; external 'Dwmapi.dll'; function gfnrcDwmWindowRectGet(hHandle: HWND): TRect; {2013-11-17: } var // ls_Path : WideString; // lh_Module : HMODULE; // l_DwmGetWindowAttribute : TDwmGetWindowAttribute; li_Ret : HRESULT; begin Result := Rect(0, 0, 0, 0); li_Ret := DwmGetWindowAttribute( hHandle, DWMWA_EXTENDED_FRAME_BOUNDS, @Result, SizeOf(TRect) ); //トップレベルウィンドウ以外では失敗するようだ。 if not(Succeeded(li_Ret)) then begin GetWindowRect(hHandle, Result); end; (* ls_Path := gfnsSystem32DirGet; lh_Module := LoadLibraryW(PWideChar(ls_Path + 'Dwmapi.dll')); if (lh_Module <> 0) then begin try // DwmGetWindowAttribute の関数ポインタを取得 @l_DwmGetWindowAttribute := GetProcAddress(lh_Module, 'DwmGetWindowAttribute'); if (@l_DwmGetWindowAttribute <> nil) then begin li_Ret := l_DwmGetWindowAttribute( hHandle, DWMWA_EXTENDED_FRAME_BOUNDS, @Result, SizeOf(TRect) ); //トップレベルウィンドウ以外では失敗するようだ。 if not(Succeeded(li_Ret)) then begin GetWindowRect(hHandle, Result); end; end; finally FreeLibrary(lh_Module); end; end; *) end; function gfnrcWindowRectGet(hHandle: HWND): TRect; {2008-12-31: ウィンドウのRectを返す。 } begin Result := gfnrcDwmWindowRectGet(hHandle); { Result := Rect(0, 0, 0, 0); if (gfnbIsAeroThemeEnabled) then begin Result := gfnrcDwmWindowRectGet(hHandle); end else begin GetWindowRect(hHandle, Result); end; } end; function gfnptScreenToClient(hHandle: HWND; ptPos: TPoint): TPoint; {2009-03-08: ptPosをhHandleのウィンドウのクライアント座標で返す。 } //var // l_Rect : TRect; begin Result := ptPos; if (IsWindow(hHandle)) then begin ScreenToClient(hHandle, Result); end; end; type TGetProcessImageFileName = function(hProcess: THandle; lpImageFileName: LPWSTR; nSize: DWORD): DWORD; stdcall; //function GetProcessImageFileNameW(hProcess: THandle; lpImageFileName: LPWSTR; nSize: DWORD): DWORD; stdcall; external 'Psapi.dll'; function gfnsExeNameGet(hHandle: HWND): WideString; {2007-12-11: ウィンドウハンドルからexeファイル名を返す http://m--takahashi.com/bbs/pastlog/02500/02414.html http://www.geocities.jp/fjtkt/problems/2003_0004.html http://www2.big.or.jp/~osamu/Delphi/tips.cgi?index=0182.txt http://homepage1.nifty.com/MADIA/delphi/Win32API/Process.htm http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+201010/10100011.txt http://www14.big.or.jp/~ken1/tech/tech11.html } function _GetProcessID(hHandle: HWND): DWORD; begin GetWindowThreadProcessId(hHandle, @Result); end; var lh_Process : THandle; lp_Buff : PWideChar; i : Integer; li_Drives : DWORD; li_Flag : Integer; ls_Device : WideString; lp_Device : PWideChar; ls_Drv : WideString; lh_Module : HMODULE; l_GetProcessImageFileName : TGetProcessImageFileName; begin Result := '-'; lh_Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, _GetProcessID(hHandle)); try lp_Buff := AllocMem((MAX_PATH + 1) * SizeOf(WideChar)); try //プロセスハンドルを渡すだけで実行ファイル名を得られた。インスタンスハンドルはいらないようだ。 if (GetModuleFileNameExW(lh_Process, 0, lp_Buff, MAX_PATH) <> 0) then begin Result := WideString(lp_Buff); end else begin //GetModuleFileNameExは32bitプロセスから64bitプロセスの実行ファイル名を取得できない。 //完全修飾パスを指定してPsapi.dllをロード lh_Module := LoadLibraryW(PWideChar(gfnsSystem32DirGet + 'Psapi.dll')); if (lh_Module <> 0) then begin try //GetProcessImageFileNameの関数ポインタを取得 @l_GetProcessImageFileName := GetProcAddress(lh_Module, 'GetProcessImageFileNameW'); if (@l_GetProcessImageFileName <> nil) then begin l_GetProcessImageFileName(lh_Process, lp_Buff, MAX_PATH); Result := WideString(lp_Buff); li_Drives := GetLogicalDrives; li_Flag := 1; for i := Ord('A') to Ord('Z') do begin if ((li_Drives and li_Flag) <> 0) then begin lp_Device := AllocMem((MAX_PATH +1) * SizeOf(WideChar)); try ls_Drv := Char(i) + ':'; QueryDosDeviceW(PWideChar(ls_Drv), lp_Device, MAX_PATH); ls_Device := WideString(lp_Device); if (Pos(ls_Device + '\', Result) = 1) then begin Result := ls_Drv + Copy(Result, Length(ls_Device) +1, MaxInt); Break; end; finally FreeMem(lp_Device); end; end; li_Flag := li_Flag shl 1; end; end; finally FreeLibrary(lh_Module); end; end; end; finally FreeMem(lp_Buff); end; finally CloseHandle(lh_Process); end; end; //------------------------------------------------------------------------------ //文字コードの自動判定 //http://mrxray.on.coocan.jp/Delphi/plSamples/886_ChangeCodePage.htm //http://www.delphikingdom.com/asp/answer.asp?IDAnswer=16895 const IID_IMultiLanguage2 : TGUID = '{DCCFC164-2B38-11D2-B7EC-00C04F8F5D9A}'; CLASS_CMultiLanguage : TGUID = '{275C23E2-3747-11D0-9FEA-00AA003F8646}'; type tagMIMECPINFO = packed record dwFlags : LongWord; uiCodePage : SYSUINT; uiFamilyCodePage : SYSUINT; wszDescription : array[0..63] of Word; wszWebCharset : array[0..49] of Word; wszHeaderCharset : array[0..49] of Word; wszBodyCharset : array[0..49] of Word; wszFixedWidthFont : array[0..31] of Word; wszProportionalFont : array[0..31] of Word; bGDICharset : Byte; end; tagMIMECSETINFO = packed record uiCodePage : SYSUINT; uiInternetEncoding : SYSUINT; wszCharset : array[0..49] of Word; end; tagRFC1766INFO = packed record lcid : LongWord; wszRfc1766 : array[0..5] of Word; wszLocaleName : array[0..31] of Word; end; tagDetectEncodingInfo = packed record nLangID : SYSUINT; nCodePage : SYSUINT; nDocPercent : SYSINT; nConfidence : SYSINT; end; tagSCRIPTINFO = packed record ScriptId : Byte; uiCodePage : SYSUINT; wszDescription : array[0..47] of Word; wszFixedWidthFont : array[0..31] of Word; wszProportionalFont : array[0..31] of Word; end; __MIDL_IWinTypes_0009 = record case Integer of 0 : (hInproc : Integer); 1 : (hRemote : Integer); end; _RemotableHandle = packed record fContext : Integer; u : __MIDL_IWinTypes_0009; end; // Constants for enum tagMIMECONTF //type tagMIMECONTF = TOleEnum; // *********************************************************************// // Interface: IEnumCodePage // Flags: (0) // GUID: {275C23E3-3747-11D0-9FEA-00AA003F8646} // *********************************************************************// IEnumCodePage = interface(IUnknown) ['{275C23E3-3747-11D0-9FEA-00AA003F8646}'] function Clone(out ppEnum: IEnumCodePage): HResult; stdcall; function Next(celt: LongWord; out rgelt: tagMIMECPINFO; out pceltFetched: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; // *********************************************************************// // Interface: IEnumRfc1766 // Flags: (0) // GUID: {3DC39D1D-C030-11D0-B81B-00C04FC9B31F} // *********************************************************************// IEnumRfc1766 = interface(IUnknown) ['{3DC39D1D-C030-11D0-B81B-00C04FC9B31F}'] function Clone(out ppEnum: IEnumRfc1766): HResult; stdcall; function Next(celt: LongWord; out rgelt: tagRFC1766INFO; out pceltFetched: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; // *********************************************************************// // Interface: IMLangConvertCharset // Flags: (0) // GUID: {D66D6F98-CDAA-11D0-B822-00C04FC9B31F} // *********************************************************************// IMLangConvertCharset = interface(IUnknown) ['{D66D6F98-CDAA-11D0-B822-00C04FC9B31F}'] function Initialize(uiSrcCodePage: SYSUINT; uiDstCodePage: SYSUINT; dwProperty: LongWord): HResult; stdcall; function GetSourceCodePage(out puiSrcCodePage: SYSUINT): HResult; stdcall; function GetDestinationCodePage(out puiDstCodePage: SYSUINT): HResult; stdcall; function GetProperty(out pdwProperty: LongWord): HResult; stdcall; //***** // function DoConversion(var pSrcStr: Byte; var pcSrcSize: SYSUINT; var pDstStr: Byte; // var pcDstSize: SYSUINT): HResult; stdcall; function DoConversion( pSrcStr : PAnsiChar; var pcSrcSize : SYSUINT; pDstStr : PAnsiChar; var pcDstSize : SYSUINT ) : HResult; stdcall; function DoConversionToUnicode(var pSrcStr: Shortint; var pcSrcSize: SYSUINT; var pDstStr: Word; var pcDstSize: SYSUINT): HResult; stdcall; function DoConversionFromUnicode(var pSrcStr: Word; var pcSrcSize: SYSUINT; var pDstStr: Shortint; var pcDstSize: SYSUINT): HResult; stdcall; end; // *********************************************************************// // Interface: IEnumScript // Flags: (0) // GUID: {AE5F1430-388B-11D2-8380-00C04F8F5DA1} // *********************************************************************// IEnumScript = interface(IUnknown) ['{AE5F1430-388B-11D2-8380-00C04F8F5DA1}'] function Clone(out ppEnum: IEnumScript): HResult; stdcall; function Next(celt: LongWord; out rgelt: tagSCRIPTINFO; out pceltFetched: LongWord): HResult; stdcall; function Reset: HResult; stdcall; function Skip(celt: LongWord): HResult; stdcall; end; // *********************************************************************// // Interface: IMultiLanguage2 // Flags: (0) // GUID: {DCCFC164-2B38-11D2-B7EC-00C04F8F5D9A} // *********************************************************************// IMultiLanguage2 = interface(IUnknown) ['{DCCFC164-2B38-11D2-B7EC-00C04F8F5D9A}'] function GetNumberOfCodePageInfo(out pcCodePage: SYSUINT): HResult; stdcall; function GetCodePageInfo(uiCodePage: SYSUINT; LangId: Word; out pCodePageInfo: tagMIMECPINFO): HResult; stdcall; function GetFamilyCodePage(uiCodePage: SYSUINT; out puiFamilyCodePage: SYSUINT): HResult; stdcall; function EnumCodePages(grfFlags: LongWord; LangId: Word; out ppEnumCodePage: IEnumCodePage): HResult; stdcall; function GetCharsetInfo(const Charset: WideString; out pCharsetInfo: tagMIMECSETINFO): HResult; stdcall; function IsConvertible(dwSrcEncoding: LongWord; dwDstEncoding: LongWord): HResult; stdcall; //***** // function ConvertString(var pdwMode: LongWord; dwSrcEncoding: LongWord; dwDstEncoding: LongWord; // var pSrcStr: Byte; var pcSrcSize: SYSUINT; var pDstStr: Byte; // var pcDstSize: SYSUINT): HResult; stdcall; function ConvertString( var pdwMode : LongWord; dwSrcEncoding : LongWord; dwDstEncoding : LongWord; var pSrcStr : Byte; var pcSrcSize : SYSUINT; var pDstStr : Byte; var pcDstSize : SYSUINT ) : HResult; stdcall; //***** // function ConvertStringToUnicode(var pdwMode: LongWord; dwEncoding: LongWord; // var pSrcStr: Shortint; var pcSrcSize: SYSUINT; // var pDstStr: Word; var pcDstSize: SYSUINT): HResult; stdcall; function ConvertStringToUnicode( var pdwMode : DWORD; dwEncoding : DWORD; pSrcStr : PAnsiChar; var pcSrcSize : SYSUINT; pDstStr : PWideChar; var pcDstSize : SYSUINT ) : HResult; stdcall; //***** // function ConvertStringFromUnicode(var pdwMode: LongWord; dwEncoding: LongWord; // var pSrcStr: Word; var pcSrcSize: SYSUINT; // var pDstStr: Shortint; var pcDstSize: SYSUINT): HResult; stdcall; function ConvertStringFromUnicode( var pdwMode : DWORD; dwEncoding : DWORD; pSrcStr : PWideChar; var pcSrcSize : SYSUINT; pDstStr : PAnsiChar; var pcDstSize : SYSUINT ) : HResult; stdcall; function ConvertStringReset: HResult; stdcall; function GetRfc1766FromLcid(locale: LongWord; out pbstrRfc1766: WideString): HResult; stdcall; function GetLcidFromRfc1766(out plocale: LongWord; const bstrRfc1766: WideString): HResult; stdcall; function EnumRfc1766(LangId: Word; out ppEnumRfc1766: IEnumRfc1766): HResult; stdcall; function GetRfc1766Info(locale: LongWord; LangId: Word; out pRfc1766Info: tagRFC1766INFO): HResult; stdcall; function CreateConvertCharset(uiSrcCodePage: SYSUINT; uiDstCodePage: SYSUINT; dwProperty: LongWord; out ppMLangConvertCharset: IMLangConvertCharset): HResult; stdcall; function ConvertStringInIStream(var pdwMode: LongWord; dwFlag: LongWord; var lpFallBack: Word; dwSrcEncoding: LongWord; dwDstEncoding: LongWord; const pstmIn: ISequentialStream; const pstmOut: ISequentialStream): HResult; stdcall; function ConvertStringToUnicodeEx(var pdwMode: LongWord; dwEncoding: LongWord; var pSrcStr: Shortint; var pcSrcSize: SYSUINT; var pDstStr: Word; var pcDstSize: SYSUINT; dwFlag: LongWord; var lpFallBack: Word): HResult; stdcall; function ConvertStringFromUnicodeEx(var pdwMode: LongWord; dwEncoding: LongWord; var pSrcStr: Word; var pcSrcSize: SYSUINT; var pDstStr: Shortint; var pcDstSize: SYSUINT; dwFlag: LongWord; var lpFallBack: Word): HResult; stdcall; function DetectCodepageInIStream(dwFlag: LongWord; dwPrefWinCodePage: LongWord; const pstmIn: ISequentialStream; var lpEncoding: tagDetectEncodingInfo; var pnScores: SYSINT): HResult; stdcall; //***** // function DetectInputCodepage(dwFlag: LongWord; dwPrefWinCodePage: LongWord; // var pSrcStr: Shortint; var pcSrcSize: SYSINT; // var lpEncoding: tagDetectEncodingInfo; var pnScores: SYSINT): HResult; stdcall; function DetectInputCodepage( dwFlag : DWORD; dwPrefWinCodePage : DWORD; pSrcStr : PAnsiChar; var pcSrcSize : SYSINT; var lpEncoding : tagDetectEncodingInfo; var pnScores : SYSINT ) : HResult; stdcall; function ValidateCodePage(uiCodePage: SYSUINT; var hwnd: _RemotableHandle): HResult; stdcall; function GetCodePageDescription(uiCodePage: SYSUINT; lcid: LongWord; lpWideCharStr: PWideChar; cchWideChar: SYSINT): HResult; stdcall; function IsCodePageInstallable(uiCodePage: SYSUINT): HResult; stdcall; function SetMimeDBSource(dwSource: tagMIMECONTF): HResult; stdcall; function GetNumberOfScripts(out pnScripts: SYSUINT): HResult; stdcall; function EnumScripts(dwFlags: LongWord; LangId: Word; out ppEnumScript: IEnumScript): HResult; stdcall; function ValidateCodePageEx(uiCodePage: SYSUINT; var hwnd: _RemotableHandle; dwfIODControl: LongWord): HResult; stdcall; end; function gfnsLanguageGet(iLanguage: WORD): WideString; //http://kwikwi.cocolog-nifty.com/blog/2007/05/index.html var li_Len: Integer; lp_Buff: PWideChar; begin Result := 'UnKnown'; li_Len := GetLocaleInfoW(iLanguage, LOCALE_SENGLANGUAGE, nil, 0); if (li_Len > 0) then begin lp_Buff := AllocMem((li_Len +1) * SizeOf(WideChar)); try GetLocaleInfoW(iLanguage, LOCALE_SLANGUAGE, lp_Buff, li_Len); Result := WideString(lp_Buff); finally FreeMem(lp_Buff); end; end; end; function gfnsCodePageGet(iLanguage, iCodePage: WORD): WideString; //http://mrxray.on.coocan.jp/Delphi/plSamples/886_ChangeCodePage.htm var l_IMultiLanguage: IMultiLanguage2; l_MIMECPInfo : tagMIMECPINFO; begin //指定されたCLSID関連付けクラスの1つの未初期化オブジェクトを作成 if (Succeeded(CoCreateInstance( CLASS_CMultiLanguage, //オブジェクトのCLSID nil, //複数オブジェクトの一部の時はIUnknownインターフェイスのポインタ CLSCTX_INPROC_SERVER, //管理コードを実行するコンテキスト IID_IMultiLanguage2, //取得するIID l_IMultiLanguage //生成オブジェクトの変数アドレス ))) then begin try FillChar(l_MIMECPInfo, SizeOf(l_MIMECPInfo), 0); if (Succeeded(l_IMultiLanguage.GetCodePageInfo(iCodePage, iLanguage, l_MIMECPInfo))) then begin Result := WideString(PWideChar(@l_MIMECPInfo.wszDescription)); end; finally l_IMultiLanguage := nil; end; end; end; initialization //Dwmapi.dll F_hDwmapidllModule := LoadLibraryW(PWideChar(gfnsSystem32DirGet + 'Dwmapi.dll')); if (F_hDwmapidllModule <> 0) then begin @F_DwmGetWindowAttribute := GetProcAddress(F_hDwmapidllModule, 'DwmGetWindowAttribute'); end else begin @F_DwmGetWindowAttribute := nil; end; //user32.dll F_hUser32dllModule := LoadLibraryW(PWideChar(gfnsSystem32DirGet + 'User32.dll')); if (F_hUser32dllModule <> 0) then begin // 各種の関数ポインタを取得 @F_GetLayeredWindowAttributes := GetProcAddress(F_hUser32dllModule, 'GetLayeredWindowAttributes'); @F_GetPhysicalCursorPos := GetProcAddress(F_hUser32dllModule, 'GetPhysicalCursorPos'); end else begin @F_GetLayeredWindowAttributes := nil; @F_GetPhysicalCursorPos := nil; end; finalization if (F_hUser32dllModule <> 0) then begin FreeLibrary(F_hUser32dllModule); end; if (F_hDwmapidllModule <> 0) then begin FreeLibrary(F_hDwmapidllModule); end; end.