別スレッドの子ウィンドウにフォーカスをセットする方法


D-RascalではDatulaの内部のウィンドウにフォーカスを移す必要がありました。しかし、 SetFocus というAPIはトップレベルウィンドウか同じスレッドで作成された子ウィンドウでないとフォーカスを移してくれません。別スレッドで作成されたウィンドウを指定してもそのトップレベルウィンドウにフォーカスが渡ります。しかし、 AttachThreadInput というAPIを使うことにより、別スレッドの子ウィンドウに対して SetFocus できるようになります。

AttachThreadInput に渡す引数には対象となるウィンドウを持つスレッドのIDが必要になりますが、これは GetWindowThreadProcessId というAPIを使用します。

(例)"設定"というタイトルのウィンドウの中の最初のEditBoxにフォーカスを移す。

HWND hToplevel = ::FindWindow("#32770", "設定");
HWND hWnd = ::FindWindowEx(hToplevel, NULL, "Edit", NULL);
if (hWnd != NULL){
DWORD dwPID;
DWORD dwTID = ::GetWindowThreadProcessId(hWnd, &dwPID);
::AttachThreadInput(::GetCurrentThreadId(), dwTID, TRUE);
::SetFocus(hWnd);
::AttachThreadInput(::GetCurrentThreadId(), dwTID, FALSE);
}

戻る