GetFocus フォーカスを持つウィンドウを取得

Cの宣言:

HWND GetFocus();

VBの宣言:

Declare Function GetFocus Lib "user32" () As Long

説明:

この関数を呼び出したスレッドが持つ全てのウィンドウの内、キーボードフォーカスを持つウィンドウのハンドルを取得する。キーボードフォーカスを持つウィンドウが存在しない場合、NULLが返される。

Windowsが管理している全てのウィンドウの内、ユーザの操作対象になっているウィンドウを取得したい場合には、GetForegroundWindowを使用しなければならない。

通常は、GetFocus関数が返すウィンドウハンドルと、GetActiveWindow関数が返すウィンドウハンドルは、等しい。両者のハンドルが異なる場合は、例えば NT3.51において、アイコン化されているウィンドウがアクティブウィンドウである場合などである。この場合、GetFocus関数はNULLを返す。(→宿題)

この関数を呼び出したスレッドが、(そのスレッドが属するプロセスの中で)最も優先順位の高いスレッドではない場合は、注意が必要である。スレッドが最も優先順位の高いスレッドでなくなった時に、スレッドが再び最も優先順位が高くなるかまたはSetFocus関数が呼ばれるまでの間、キーボードフォーカスを持つウィンドウは存在しなくなる。

戻り値は、キーボードフォーカスを持つウィンドウのハンドルである。キーボードフォーカスを持つウィンドウが存在しない場合、NULLが返される。

Cのサンプル:

/* フォーカスを持つウィンドウのタイトルを表示する */
void DoGetFocus()
{
	char buf[1000];
	HWND hWnd;

	/* フォーカスを持つウィンドウの取得 */
	hWnd = GetFocus();

	/* ウィンドウタイトルの表示 */
	GetWindowText(hWnd, buf, 1000);
	MessageBox(NULL, buf, "DoGetFocus", MB_OK);
}

VBのサンプル:

' フォーカスを持つウィンドウのタイトルをデバッグウィンドウに表示する
Sub Main()
	Dim hFocusWnd As Long
	Dim WndTitle As String * 1000
	Dim FormObj As Form1
	Dim I As Integer
	Dim Cnt As Integer

	'フォームを3つ作成
	For I = 1 To 3
		Set FormObj = New Form1
		With FormObj
			FormObj.Caption = "Form " & I
			FormObj.Left = FormObj.Left + 300 * I
			FormObj.Top = FormObj.Top + 300 * I
			FormObj.Show
		End With
	Next
    
	'フォーカスを持つウィンドウのタイトルを1000回表示
	Do
		'1000回表示したら終了
		Cnt = Cnt + 1
		If Cnt = 1000 Then Exit Do
        
		'フォーカスを持つウィンドウの取得
		hFocusWnd = GetFocus()
        
		'ウィンドウタイトルの取得
		WndTitle = ""
		GetWindowText hFocusWnd, WndTitle, 1000
        
		'ウィンドウタイトルの表示
		Debug.Print WndTitle
        
		DoEvents
	Loop
End Sub
(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。