リファレンスでキャレット(カーソル)の点滅速度に
関する API 関数を見つけました。
UINT WINAPI GetCaretBlinkTime (VOID);
BOOL WINAPI SetCaretBlinkTime (uMSec);
これらの関数を WM_SETFOCUS および WM_ACTIVATE で fActite == WA_{ACTIVE,
CLICKACTIVE} のときに呼び、ついでにカーソルの形も CreateCaret() API で変え
て、DestroyCaret() で破棄しましょうか。
ただし、キャレットは共有資源なので、
キーボードフォーカスを失う(WM_KILLFOCUS)、
あるいは inactive になるとき(WM_ACTIVATEで fActive == WA_INACTIVE)、
点滅速度を復元するようにということです。
てきとーにまとめると、
UINT uMilliSecOld, uMilliSec;
Activated or SetFocus:
//! 古い点滅速度を保存のため、取得。
uMilliSecOld = ::GetCaretBlinkTime()
//! 新しい点滅速度を設定。共有資源。
::SetCaretBlinkTime(uMilliSec);
//! キャレットの形を作成・設定。共有資源。
::CreateCaret(...);
Inactivated or KillFocus:
//! 古い点滅速度に復元。共有資源。
::SetCaretBlinkTime(uMilliSecOld);
//! 作成したキャレットの形を破棄・復元。共有資源。
::DestroyCaret(...);