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);
- }