Win32 API 日本語リファレンス
ホームUI.WindowsAndMessaging › GetSystemMetrics

GetSystemMetrics

関数
画面寸法やシステム構成要素の各種メトリクス値を取得する。
DLLUSER32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// USER32.dll
#include <windows.h>

INT GetSystemMetrics(
    SYSTEM_METRICS_INDEX nIndex
);

パラメーター

名前方向説明
nIndexSYSTEM_METRICS_INDEXin

取得するシステムメトリックまたは構成設定です。このパラメーターには、次のいずれかの値を指定できます。 すべての SM_CX* 値は幅、すべての SM_CY* 値は高さである点に注意してください。また、ブール値のデータを返すよう設計されたすべての設定では、TRUE は 0 以外の任意の値、FALSE は 0 で表されます。

意味
SM_ARRANGE
56
システムが最小化されたウィンドウをどのように配置したかを示すフラグです。詳細については、本トピックの「解説」セクションを参照してください。
SM_CLEANBOOT
67
システムの起動方法を示す値です。
  • 0 通常起動
  • 1 フェールセーフ起動
  • 2 ネットワークを伴うフェールセーフ起動
フェールセーフ起動(SafeBoot、セーフモード、クリーンブートとも呼ばれます)では、ユーザーのスタートアップファイルがバイパスされます。
SM_CMONITORS
80
デスクトップ上のディスプレイモニターの数です。詳細については、本トピックの「解説」セクションを参照してください。
SM_CMOUSEBUTTONS
43
マウスのボタン数です。マウスが取り付けられていない場合は 0 です。
SM_CONVERTIBLESLATEMODE
0x2003
ラップトップモードまたはスレートモードの状態を反映します。スレートモードの場合は 0、それ以外の場合は 0 以外です。このシステムメトリックが変化すると、システムは LPARAM に "ConvertibleSlateMode" を含む WM_SETTINGCHANGE によるブロードキャストメッセージを送信します。このシステムメトリックはデスクトップ PC には適用されない点に注意してください。その場合は GetAutoRotationState を使用してください。
SM_CXBORDER
5
ウィンドウ境界の幅(ピクセル単位)です。これは、3D 表示のウィンドウにおける SM_CXEDGE 値と同等です。
SM_CXCURSOR
13
カーソルの標準的な幅(ピクセル単位)です。
SM_CXDLGFRAME
7
この値は SM_CXFIXEDFRAME と同じです。
SM_CXDOUBLECLK
36
ダブルクリック操作における最初のクリック位置を囲む四角形の幅(ピクセル単位)です。システムが 2 回のクリックをダブルクリックとみなすには、2 回目のクリックが SM_CXDOUBLECLKSM_CYDOUBLECLK で定義される四角形内で発生する必要があります。また、2 回のクリックは指定された時間内に発生する必要があります。

ダブルクリック四角形の幅を設定するには、SPI_SETDOUBLECLKWIDTH を指定して SystemParametersInfo を呼び出します。

SM_CXDRAG
68
ドラッグ操作が開始される前に、マウスボタンを押した地点の両側でマウスポインターが移動できるピクセル数です。これにより、ユーザーは意図せずドラッグ操作を開始することなく、マウスボタンを簡単にクリックして離すことができます。この値が負の場合、マウスボタンを押した地点の左側からは減算され、右側には加算されます。
SM_CXEDGE
45
3D 境界の幅(ピクセル単位)です。このメトリックは SM_CXBORDER の 3D 版に相当します。
SM_CXFIXEDFRAME
7
キャプションを持つがサイズ変更できないウィンドウの外周を囲むフレームの太さ(ピクセル単位)です。 SM_CXFIXEDFRAME は水平境界の高さ、SM_CYFIXEDFRAME は垂直境界の幅です。

この値は SM_CXDLGFRAME と同じです。

SM_CXFOCUSBORDER
83
DrawFocusRect が描画するフォーカス四角形の左右の端の幅です。この値はピクセル単位です。

Windows 2000: この値はサポートされていません。

SM_CXFRAME
32
この値は SM_CXSIZEFRAME と同じです。
SM_CXFULLSCREEN
16
プライマリディスプレイモニター上の全画面ウィンドウのクライアント領域の幅(ピクセル単位)です。システムのタスクバーやアプリケーションデスクトップツールバーで隠されていない画面部分の座標を取得するには、SPI_GETWORKAREA 値を指定して SystemParametersInfo 関数を呼び出します。
SM_CXHSCROLL
21
水平スクロールバーの矢印ビットマップの幅(ピクセル単位)です。
SM_CXHTHUMB
10
水平スクロールバーのつまみ(スクロールボックス)の幅(ピクセル単位)です。
SM_CXICON
11
アイコンのシステム標準の大きい方の幅(ピクセル単位)です。LoadIcon 関数は、SM_CXICONSM_CYICON で指定される寸法のアイコンのみを読み込むことができます。詳細については Icon Sizes を参照してください。
SM_CXICONSPACING
38
大アイコン表示における項目用グリッドセルの幅(ピクセル単位)です。配置されると、各項目は SM_CXICONSPACING × SM_CYICONSPACING のサイズの四角形に収まります。この値は常に SM_CXICON 以上です。
SM_CXMAXIMIZED
61
プライマリディスプレイモニター上で最大化されたトップレベルウィンドウの既定の幅(ピクセル単位)です。
SM_CXMAXTRACK
59
キャプションとサイズ変更境界を持つウィンドウの既定の最大幅(ピクセル単位)です。このメトリックはデスクトップ全体を対象とします。ユーザーはウィンドウフレームをこの寸法より大きくドラッグすることはできません。ウィンドウは WM_GETMINMAXINFO メッセージを処理することでこの値を上書きできます。
SM_CXMENUCHECK
71
既定のメニューチェックマークビットマップの幅(ピクセル単位)です。
SM_CXMENUSIZE
54
メニューバーボタン(MDI(マルチドキュメントインターフェイス)で使用される子ウィンドウの閉じるボタンなど)の幅(ピクセル単位)です。
SM_CXMIN
28
ウィンドウの最小幅(ピクセル単位)です。
SM_CXMINIMIZED
57
最小化されたウィンドウの幅(ピクセル単位)です。
SM_CXMINSPACING
47
最小化されたウィンドウ用グリッドセルの幅(ピクセル単位)です。配置されると、各最小化ウィンドウはこのサイズの四角形に収まります。この値は常に SM_CXMINIMIZED 以上です。
SM_CXMINTRACK
34
ウィンドウの最小トラッキング幅(ピクセル単位)です。ユーザーはウィンドウフレームをこの寸法より小さくドラッグすることはできません。ウィンドウは WM_GETMINMAXINFO メッセージを処理することでこの値を上書きできます。
SM_CXPADDEDBORDER
92
キャプション付きウィンドウの境界パディング量(ピクセル単位)です。

Windows XP/2000: この値はサポートされていません。

SM_CXSCREEN
0
プライマリディスプレイモニターの画面の幅(ピクセル単位)です。これは、次のように GetDeviceCaps を呼び出して得られる値と同じです: GetDeviceCaps( hdcPrimaryMonitor, HORZRES)
SM_CXSIZE
30
ウィンドウのキャプションまたはタイトルバー内のボタンの幅(ピクセル単位)です。
SM_CXSIZEFRAME
32
サイズ変更可能なウィンドウの外周を囲むサイズ変更境界の太さ(ピクセル単位)です。 SM_CXSIZEFRAME は水平境界の幅、SM_CYSIZEFRAME は垂直境界の高さです。

この値は SM_CXFRAME と同じです。

SM_CXSMICON
49
アイコンのシステム標準の小さい方の幅(ピクセル単位)です。小さいアイコンは通常、ウィンドウキャプションや小アイコン表示に表示されます。詳細については Icon Sizes を参照してください。
SM_CXSMSIZE
52
小さいキャプションボタンの幅(ピクセル単位)です。
SM_CXVIRTUALSCREEN
78
仮想画面の幅(ピクセル単位)です。仮想画面は、すべてのディスプレイモニターを囲む境界四角形です。SM_XVIRTUALSCREEN メトリックは仮想画面の左側の座標です。
SM_CXVSCROLL
2
垂直スクロールバーの幅(ピクセル単位)です。
SM_CYBORDER
6
ウィンドウ境界の高さ(ピクセル単位)です。これは、3D 表示のウィンドウにおける SM_CYEDGE 値と同等です。
SM_CYCAPTION
4
キャプション領域の高さ(ピクセル単位)です。
SM_CYCURSOR
14
カーソルの標準的な高さ(ピクセル単位)です。
SM_CYDLGFRAME
8
この値は SM_CYFIXEDFRAME と同じです。
SM_CYDOUBLECLK
37
ダブルクリック操作における最初のクリック位置を囲む四角形の高さ(ピクセル単位)です。システムが 2 回のクリックをダブルクリックとみなすには、2 回目のクリックが SM_CXDOUBLECLKSM_CYDOUBLECLK で定義される四角形内で発生する必要があります。また、2 回のクリックは指定された時間内に発生する必要があります。

ダブルクリック四角形の高さを設定するには、SPI_SETDOUBLECLKHEIGHT を指定して SystemParametersInfo を呼び出します。

SM_CYDRAG
69
ドラッグ操作が開始される前に、マウスボタンを押した地点の上下でマウスポインターが移動できるピクセル数です。これにより、ユーザーは意図せずドラッグ操作を開始することなく、マウスボタンを簡単にクリックして離すことができます。この値が負の場合、マウスボタンを押した地点の上側からは減算され、下側には加算されます。
SM_CYEDGE
46
3D 境界の高さ(ピクセル単位)です。これは SM_CYBORDER の 3D 版に相当します。
SM_CYFIXEDFRAME
8
キャプションを持つがサイズ変更できないウィンドウの外周を囲むフレームの太さ(ピクセル単位)です。 SM_CXFIXEDFRAME は水平境界の高さ、SM_CYFIXEDFRAME は垂直境界の幅です。

この値は SM_CYDLGFRAME と同じです。

SM_CYFOCUSBORDER
84
DrawFocusRect が描画するフォーカス四角形の上下の端の高さです。この値はピクセル単位です。

Windows 2000: この値はサポートされていません。

SM_CYFRAME
33
この値は SM_CYSIZEFRAME と同じです。
SM_CYFULLSCREEN
17
プライマリディスプレイモニター上の全画面ウィンドウのクライアント領域の高さ(ピクセル単位)です。システムのタスクバーやアプリケーションデスクトップツールバーで隠されていない画面部分の座標を取得するには、SPI_GETWORKAREA 値を指定して SystemParametersInfo 関数を呼び出します。
SM_CYHSCROLL
3
水平スクロールバーの高さ(ピクセル単位)です。
SM_CYICON
12
アイコンのシステム標準の大きい方の高さ(ピクセル単位)です。LoadIcon 関数は、SM_CXICONSM_CYICON で指定される寸法のアイコンのみを読み込むことができます。詳細については Icon Sizes を参照してください。
SM_CYICONSPACING
39
大アイコン表示における項目用グリッドセルの高さ(ピクセル単位)です。配置されると、各項目は SM_CXICONSPACING × SM_CYICONSPACING のサイズの四角形に収まります。この値は常に SM_CYICON 以上です。
SM_CYKANJIWINDOW
18
システムのダブルバイト文字セット版では、これは画面下部にある漢字ウィンドウの高さ(ピクセル単位)です。
SM_CYMAXIMIZED
62
プライマリディスプレイモニター上で最大化されたトップレベルウィンドウの既定の高さ(ピクセル単位)です。
SM_CYMAXTRACK
60
キャプションとサイズ変更境界を持つウィンドウの既定の最大高さ(ピクセル単位)です。このメトリックはデスクトップ全体を対象とします。ユーザーはウィンドウフレームをこの寸法より大きくドラッグすることはできません。ウィンドウは WM_GETMINMAXINFO メッセージを処理することでこの値を上書きできます。
SM_CYMENU
15
単一行メニューバーの高さ(ピクセル単位)です。
SM_CYMENUCHECK
72
既定のメニューチェックマークビットマップの高さ(ピクセル単位)です。
SM_CYMENUSIZE
55
メニューバーボタン(MDI(マルチドキュメントインターフェイス)で使用される子ウィンドウの閉じるボタンなど)の高さ(ピクセル単位)です。
SM_CYMIN
29
ウィンドウの最小高さ(ピクセル単位)です。
SM_CYMINIMIZED
58
最小化されたウィンドウの高さ(ピクセル単位)です。
SM_CYMINSPACING
48
最小化されたウィンドウ用グリッドセルの高さ(ピクセル単位)です。配置されると、各最小化ウィンドウはこのサイズの四角形に収まります。この値は常に SM_CYMINIMIZED 以上です。
SM_CYMINTRACK
35
ウィンドウの最小トラッキング高さ(ピクセル単位)です。ユーザーはウィンドウフレームをこの寸法より小さくドラッグすることはできません。ウィンドウは WM_GETMINMAXINFO メッセージを処理することでこの値を上書きできます。
SM_CYSCREEN
1
プライマリディスプレイモニターの画面の高さ(ピクセル単位)です。これは、次のように GetDeviceCaps を呼び出して得られる値と同じです: GetDeviceCaps( hdcPrimaryMonitor, VERTRES)
SM_CYSIZE
31
ウィンドウのキャプションまたはタイトルバー内のボタンの高さ(ピクセル単位)です。
SM_CYSIZEFRAME
33
サイズ変更可能なウィンドウの外周を囲むサイズ変更境界の太さ(ピクセル単位)です。 SM_CXSIZEFRAME は水平境界の幅、SM_CYSIZEFRAME は垂直境界の高さです。

この値は SM_CYFRAME と同じです。

SM_CYSMCAPTION
51
小さいキャプションの高さ(ピクセル単位)です。
SM_CYSMICON
50
アイコンのシステム標準の小さい方の高さ(ピクセル単位)です。小さいアイコンは通常、ウィンドウキャプションや小アイコン表示に表示されます。詳細については Icon Sizes を参照してください。
SM_CYSMSIZE
53
小さいキャプションボタンの高さ(ピクセル単位)です。
SM_CYVIRTUALSCREEN
79
仮想画面の高さ(ピクセル単位)です。仮想画面は、すべてのディスプレイモニターを囲む境界四角形です。SM_YVIRTUALSCREEN メトリックは仮想画面の上端の座標です。
SM_CYVSCROLL
20
垂直スクロールバーの矢印ビットマップの高さ(ピクセル単位)です。
SM_CYVTHUMB
9
垂直スクロールバーのつまみ(スクロールボックス)の高さ(ピクセル単位)です。
SM_DBCSENABLED
42
User32.dll が DBCS をサポートする場合は 0 以外、それ以外の場合は 0 です。
SM_DEBUG
22
デバッグ版の User.exe がインストールされている場合は 0 以外、それ以外の場合は 0 です。
SM_DIGITIZER
94
現在のオペレーティングシステムが Windows 7 または Windows Server 2008 R2 であり、Tablet PC Input サービスが開始されている場合は 0 以外、それ以外の場合は 0 です。戻り値は、デバイスがサポートするデジタイザー入力の種類を指定するビットマスクです。詳細については「解説」を参照してください。

Windows Server 2008、Windows Vista、Windows XP/2000: この値はサポートされていません。

SM_IMMENABLED
82
Input Method Manager / Input Method Editor の機能が有効な場合は 0 以外、それ以外の場合は 0 です。

SM_IMMENABLED は、Unicode アプリケーション上で Unicode ベースの IME を使用する準備がシステムに整っているかどうかを示します。言語依存の IME が動作することを確実にするには、SM_DBCSENABLED とシステムの ANSI コードページを確認してください。そうしないと、ANSI から Unicode への変換が正しく行われなかったり、フォントやレジストリ設定などの一部のコンポーネントが存在しない場合があります。

SM_MAXIMUMTOUCHES
95
システムにデジタイザーが存在する場合は 0 以外、それ以外の場合は 0 です。

SM_MAXIMUMTOUCHES は、システム内のすべてのデジタイザーがサポートする最大接触点数の集計上の最大値を返します。システムにシングルタッチデジタイザーしかない場合、戻り値は 1 です。システムにマルチタッチデジタイザーがある場合、戻り値はハードウェアが提供できる同時接触点の数です。

Windows Server 2008、Windows Vista、Windows XP/2000: この値はサポートされていません。

SM_MEDIACENTER
87
現在のオペレーティングシステムが Windows XP Media Center Edition の場合は 0 以外、そうでない場合は 0 です。
SM_MENUDROPALIGNMENT
40
ドロップダウンメニューが対応するメニューバー項目に対して右揃えの場合は 0 以外、左揃えの場合は 0 です。
SM_MIDEASTENABLED
74
システムがヘブライ語およびアラビア語に対応している場合は 0 以外、そうでない場合は 0 です。
SM_MOUSEPRESENT
19
マウスが取り付けられている場合は 0 以外、それ以外の場合は 0 です。仮想マウスのサポートや、マウスの存在ではなくポートの存在を検出するシステムがあるため、この値が 0 になることはまれです。
SM_MOUSEHORIZONTALWHEELPRESENT
91
水平スクロールホイール付きのマウスが取り付けられている場合は 0 以外、それ以外の場合は 0 です。
SM_MOUSEWHEELPRESENT
75
垂直スクロールホイール付きのマウスが取り付けられている場合は 0 以外、それ以外の場合は 0 です。
SM_NETWORK
63
ネットワークが存在する場合は最下位ビットがセットされ、それ以外の場合はクリアされます。その他のビットは将来の使用のために予約されています。
SM_PENWINDOWS
41
Microsoft Windows for Pen computing 拡張機能がインストールされている場合は 0 以外、それ以外の場合は 0 です。
SM_REMOTECONTROL
0x2001
このシステムメトリックは、ターミナルサービス環境で、現在のターミナルサーバーセッションがリモートで制御されているかどうかを判定するために使用されます。現在のセッションがリモートで制御されている場合は 0 以外、それ以外の場合は 0 です。

リモートセッションを制御するには、Terminal Services Manager(tsadmin.msc)や shadow.exe などのターミナルサービス管理ツールを使用できます。セッションがリモートで制御されている場合、別のユーザーがそのセッションの内容を表示し、場合によっては操作することができます。

SM_REMOTESESSION
0x1000
このシステムメトリックは、ターミナルサービス環境で使用されます。呼び出し元プロセスがターミナルサービスクライアントセッションに関連付けられている場合、戻り値は 0 以外です。呼び出し元プロセスがターミナルサービスのコンソールセッションに関連付けられている場合、戻り値は 0 です。Windows Server 2003 および Windows XP: コンソールセッションは必ずしも物理的なコンソールではありません。詳細については WTSGetActiveConsoleSessionId を参照してください。
SM_SAMEDISPLAYFORMAT
81
すべてのディスプレイモニターが同じカラーフォーマットを持つ場合は 0 以外、それ以外の場合は 0 です。2 つのディスプレイは、同じビット深度を持ちながら異なるカラーフォーマットを持つことがあります。たとえば、赤・緑・青のピクセルが異なるビット数でエンコードされていたり、それらのビットがピクセルのカラー値内の異なる位置に配置されていたりする場合があります。
SM_SECURE
44
このシステムメトリックは無視してください。常に 0 を返します。
SM_SERVERR2
89
システムが Windows Server 2003 R2 の場合はそのビルド番号、それ以外の場合は 0 です。
SM_SHOWSOUNDS
70
通常は音声でのみ情報を提示する状況において、アプリケーションが情報を視覚的に提示することをユーザーが要求している場合は 0 以外、それ以外の場合は 0 です。
SM_SHUTTINGDOWN
0x2000
現在のセッションがシャットダウン中の場合は 0 以外、それ以外の場合は 0 です。

Windows 2000: この値はサポートされていません。

SM_SLOWMACHINE
73
コンピューターが低性能(低速)プロセッサを搭載している場合は 0 以外、それ以外の場合は 0 です。
SM_STARTER
88
現在のオペレーティングシステムが Windows 7 Starter Edition、Windows Vista Starter、または Windows XP Starter Edition の場合は 0 以外、それ以外の場合は 0 です。
SM_SWAPBUTTON
23
マウスの左右ボタンの意味が入れ替えられている場合は 0 以外、それ以外の場合は 0 です。
SM_SYSTEMDOCKED
0x2004
ドッキングモードの状態を反映します。アンドックモードの場合は 0、それ以外の場合は 0 以外です。このシステムメトリックが変化すると、システムは LPARAM に "SystemDockMode" を含む WM_SETTINGCHANGE によるブロードキャストメッセージを送信します。
SM_TABLETPC
86
現在のオペレーティングシステムが Windows XP Tablet PC Edition であるか、または Windows Vista もしくは Windows 7 であって Tablet PC Input サービスが開始されている場合は 0 以外、それ以外の場合は 0 です。SM_DIGITIZER 設定は、Windows 7 または Windows Server 2008 R2 を実行するデバイスがサポートするデジタイザー入力の種類を示します。詳細については「解説」を参照してください。
SM_XVIRTUALSCREEN
76
仮想画面の左側の座標です。仮想画面は、すべてのディスプレイモニターを囲む境界四角形です。SM_CXVIRTUALSCREEN メトリックは仮想画面の幅です。
SM_YVIRTUALSCREEN
77
仮想画面の上端の座標です。仮想画面は、すべてのディスプレイモニターを囲む境界四角形です。SM_CYVIRTUALSCREEN メトリックは仮想画面の高さです。

戻り値の型: INT

公式ドキュメント

指定されたシステムメトリックまたはシステム構成設定を取得します。

戻り値

型: int

関数が成功した場合、戻り値は要求されたシステムメトリックまたは構成設定です。

関数が失敗した場合、戻り値は 0 です。 GetLastError は拡張エラー情報を提供しません。

解説(Remarks)

システムメトリックはディスプレイごとに異なる場合があります。

GetSystemMetrics(SM_CMONITORS) は、可視のディスプレイモニターのみを数えます。これは、可視のディスプレイモニターと、ミラーリングドライバーに関連付けられた不可視の疑似モニターの両方を列挙する EnumDisplayMonitors とは異なります。不可視の疑似モニターは、リモート処理などの目的でアプリケーションの描画をミラーリングするために使用される疑似デバイスに関連付けられています。

SM_ARRANGE 設定は、システムが最小化されたウィンドウをどのように配置するかを指定し、開始位置と方向で構成されます。開始位置には次のいずれかの値を指定できます。

意味
ARW_BOTTOMLEFT 画面の左下隅から開始します。既定の位置です。
ARW_BOTTOMRIGHT 画面の右下隅から開始します。ARW_STARTRIGHT と同等です。
ARW_TOPLEFT 画面の左上隅から開始します。ARW_STARTTOP と同等です。
ARW_TOPRIGHT 画面の右上隅から開始します。ARW_STARTTOP | SRW_STARTRIGHT と同等です。

最小化されたウィンドウを配置する方向には、次のいずれかの値を指定できます。

意味
ARW_DOWN 垂直方向に、上から下へ配置します。
ARW_HIDE 最小化されたウィンドウを画面の可視領域外へ移動して非表示にします。
ARW_LEFT 水平方向に、左から右へ配置します。
ARW_RIGHT 水平方向に、右から左へ配置します。
ARW_UP 垂直方向に、下から上へ配置します。

SM_DIGITIZER 設定は、Windows 7 または Windows Server 2008 R2 を実行するデバイスにインストールされているデジタイザーの種類を指定します。戻り値は、次の値の 1 つ以上を指定するビットマスクです。

意味
NID_INTEGRATED_TOUCH

0x01

デバイスは内蔵タッチデジタイザーを備えています。
NID_EXTERNAL_TOUCH

0x02

デバイスは外付けタッチデジタイザーを備えています。
NID_INTEGRATED_PEN

0x04

デバイスは内蔵ペンデジタイザーを備えています。
NID_EXTERNAL_PEN

0x08

デバイスは外付けペンデジタイザーを備えています。
NID_MULTI_INPUT

0x40

デバイスは複数のデジタイザー入力ソースをサポートしています。
NID_READY

0x80

デバイスはデジタイザー入力を受け取る準備ができています。

この API は DPI を認識しないため、呼び出し元のスレッドがモニターごとの DPI を認識する場合は使用しないでください。この API の DPI 対応版については、GetSystemMetricsForDPI を参照してください。DPI 認識の詳細については、Windows の高 DPI ドキュメントを参照してください。

次の例では、GetSystemMetrics 関数を使用して、マウスがインストールされているか、およびマウスボタンが入れ替えられているかを判定します。また、SystemParametersInfo 関数を使用してマウスのしきい値と速度を取得します。情報はコンソールに表示されます。

#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "user32.lib")

void main()
{
   BOOL fResult;
   int aMouseInfo[3];
 
   fResult = GetSystemMetrics(SM_MOUSEPRESENT); 
 
   if (fResult == 0) 
      printf("No mouse installed.\n"); 
   else 
   { 
      printf("Mouse installed.\n");

      // Determine whether the buttons are swapped. 

      fResult = GetSystemMetrics(SM_SWAPBUTTON); 
 
      if (fResult == 0) 
         printf("Buttons not swapped.\n"); 
      else printf("Buttons swapped.\n");
 
      // Get the mouse speed and the threshold values. 
 
      fResult = SystemParametersInfo(
         SPI_GETMOUSE,  // get mouse information 
         0,             // not used 
         &aMouseInfo,   // holds mouse information 
         0);            // not used 

      if( fResult )
      { 
         printf("Speed: %d\n", aMouseInfo[2]); 
         printf("Threshold (x,y): %d,%d\n", 
            aMouseInfo[0], aMouseInfo[1]); 
      }
   } 
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// USER32.dll
#include <windows.h>

INT GetSystemMetrics(
    SYSTEM_METRICS_INDEX nIndex
);
[DllImport("USER32.dll", ExactSpelling = true)]
static extern int GetSystemMetrics(
    int nIndex   // SYSTEM_METRICS_INDEX
);
<DllImport("USER32.dll", ExactSpelling:=True)>
Public Shared Function GetSystemMetrics(
    nIndex As Integer   ' SYSTEM_METRICS_INDEX
) As Integer
End Function
' nIndex : SYSTEM_METRICS_INDEX
Declare PtrSafe Function GetSystemMetrics Lib "user32" ( _
    ByVal nIndex As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetSystemMetrics = ctypes.windll.user32.GetSystemMetrics
GetSystemMetrics.restype = ctypes.c_int
GetSystemMetrics.argtypes = [
    ctypes.c_int,  # nIndex : SYSTEM_METRICS_INDEX
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('USER32.dll')
GetSystemMetrics = Fiddle::Function.new(
  lib['GetSystemMetrics'],
  [
    Fiddle::TYPE_INT,  # nIndex : SYSTEM_METRICS_INDEX
  ],
  Fiddle::TYPE_INT)
#[link(name = "user32")]
extern "system" {
    fn GetSystemMetrics(
        nIndex: i32  // SYSTEM_METRICS_INDEX
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("USER32.dll")]
public static extern int GetSystemMetrics(int nIndex);
"@
$api = Add-Type -MemberDefinition $sig -Name 'USER32_GetSystemMetrics' -Namespace Win32 -PassThru
# $api::GetSystemMetrics(nIndex)
#uselib "USER32.dll"
#func global GetSystemMetrics "GetSystemMetrics" sptr
; GetSystemMetrics nIndex   ; 戻り値は stat
; nIndex : SYSTEM_METRICS_INDEX -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "USER32.dll"
#cfunc global GetSystemMetrics "GetSystemMetrics" int
; res = GetSystemMetrics(nIndex)
; nIndex : SYSTEM_METRICS_INDEX -> "int"
; INT GetSystemMetrics(SYSTEM_METRICS_INDEX nIndex)
#uselib "USER32.dll"
#cfunc global GetSystemMetrics "GetSystemMetrics" int
; res = GetSystemMetrics(nIndex)
; nIndex : SYSTEM_METRICS_INDEX -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	user32 = windows.NewLazySystemDLL("USER32.dll")
	procGetSystemMetrics = user32.NewProc("GetSystemMetrics")
)

// nIndex (SYSTEM_METRICS_INDEX)
r1, _, err := procGetSystemMetrics.Call(
	uintptr(nIndex),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function GetSystemMetrics(
  nIndex: Integer   // SYSTEM_METRICS_INDEX
): Integer; stdcall;
  external 'USER32.dll' name 'GetSystemMetrics';
result := DllCall("USER32\GetSystemMetrics"
    , "Int", nIndex   ; SYSTEM_METRICS_INDEX
    , "Int")   ; return: INT
●GetSystemMetrics(nIndex) = DLL("USER32.dll", "int GetSystemMetrics(int)")
# 呼び出し: GetSystemMetrics(nIndex)
# nIndex : SYSTEM_METRICS_INDEX -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "user32" fn GetSystemMetrics(
    nIndex: i32 // SYSTEM_METRICS_INDEX
) callconv(std.os.windows.WINAPI) i32;
proc GetSystemMetrics(
    nIndex: int32  # SYSTEM_METRICS_INDEX
): int32 {.importc: "GetSystemMetrics", stdcall, dynlib: "USER32.dll".}
pragma(lib, "user32");
extern(Windows)
int GetSystemMetrics(
    int nIndex   // SYSTEM_METRICS_INDEX
);
ccall((:GetSystemMetrics, "USER32.dll"), stdcall, Int32,
      (Int32,),
      nIndex)
# nIndex : SYSTEM_METRICS_INDEX -> Int32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t GetSystemMetrics(
    int32_t nIndex);
]]
local user32 = ffi.load("user32")
-- user32.GetSystemMetrics(nIndex)
-- nIndex : SYSTEM_METRICS_INDEX
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('USER32.dll');
const GetSystemMetrics = lib.func('__stdcall', 'GetSystemMetrics', 'int32_t', ['int32_t']);
// GetSystemMetrics(nIndex)
// nIndex : SYSTEM_METRICS_INDEX -> 'int32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("USER32.dll", {
  GetSystemMetrics: { parameters: ["i32"], result: "i32" },
});
// lib.symbols.GetSystemMetrics(nIndex)
// nIndex : SYSTEM_METRICS_INDEX -> "i32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t GetSystemMetrics(
    int32_t nIndex);
C, "USER32.dll");
// $ffi->GetSystemMetrics(nIndex);
// nIndex : SYSTEM_METRICS_INDEX
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface User32 extends StdCallLibrary {
    User32 INSTANCE = Native.load("user32", User32.class);
    int GetSystemMetrics(
        int nIndex   // SYSTEM_METRICS_INDEX
    );
}
@[Link("user32")]
lib LibUSER32
  fun GetSystemMetrics = GetSystemMetrics(
    nIndex : Int32   # SYSTEM_METRICS_INDEX
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef GetSystemMetricsNative = Int32 Function(Int32);
typedef GetSystemMetricsDart = int Function(int);
final GetSystemMetrics = DynamicLibrary.open('USER32.dll')
    .lookupFunction<GetSystemMetricsNative, GetSystemMetricsDart>('GetSystemMetrics');
// nIndex : SYSTEM_METRICS_INDEX -> Int32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetSystemMetrics(
  nIndex: Integer   // SYSTEM_METRICS_INDEX
): Integer; stdcall;
  external 'USER32.dll' name 'GetSystemMetrics';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "GetSystemMetrics"
  c_GetSystemMetrics :: Int32 -> IO Int32
-- nIndex : SYSTEM_METRICS_INDEX -> Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let getsystemmetrics =
  foreign "GetSystemMetrics"
    (int32_t @-> returning int32_t)
(* nIndex : SYSTEM_METRICS_INDEX -> int32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library user32 (t "USER32.dll"))
(cffi:use-foreign-library user32)

(cffi:defcfun ("GetSystemMetrics" get-system-metrics :convention :stdcall) :int32
  (n-index :int32))   ; SYSTEM_METRICS_INDEX
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $GetSystemMetrics = Win32::API::More->new('USER32',
    'int GetSystemMetrics(int nIndex)');
# my $ret = $GetSystemMetrics->Call($nIndex);
# nIndex : SYSTEM_METRICS_INDEX -> int
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型