Windows 10自定义控件的输入光标停止闪烁后如何恢复闪烁效果
问题根因
仅在控件获得焦点时初始化了输入光标,系统内置的光标闪烁计时器走完5秒周期后就会进入常亮状态,单纯调用SetCaretPos移动光标位置不会触发系统重置该闪烁计时器,因此会出现移动光标后光标不再闪烁的问题。
解决方案
不需要调用SetCaretBlinkTime(该API会修改全系统的光标闪烁速率,不符合微软官方文档的使用建议,也不是实现该需求的正确方案)。只需要在每次更新光标位置之后,主动触发系统重置闪烁计时器即可,具体实现为调用SetCaretPos后,依次配对调用HideCaret和ShowCaret,该操作不会改变光标当前的显示状态,同时会重置5秒的闪烁周期,完全匹配系统原生控件的光标行为。
需要修改的代码片段如下:
procedure TEditPane.SetCaretPosition(AXPos : Integer); begin If AXPos < CInsideMargin then AXPos := CInsideMargin; If AXPos > CInsideMargin + (CCharsPerLine * CCharWidth) then AXPos := CInsideMargin + (CCharsPerLine * CCharWidth); FCaretPosX := AXPos; SetCaretPos(FCaretPosX,CInsideMargin); // 新增以下两行重置光标闪烁周期 HideCaret(Handle); ShowCaret(Handle); end;
内容的提问来源于stack exchange,提问作者Blurry Sterk
相关产品推荐
相关产品推荐

