Skip to content

建议:任务栏icon的ascii_icon变化区分大小写 #1726

@Arsiendle

Description

@Arsiendle

从当前代码结构来看,ASCII 英文输入状态可以进一步区分大小写,但需要做一些扩展。以下是分析和建议:


当前状态

  • 代码中 ASCII 是统一状态,使用 IDI_EN 单一图标
  • 未检测 Caps Lock 状态,无法区分大小写

实现方案

1. 扩展模式枚举

// 在 WeaselTrayMode 枚举中增加
enum WeaselTrayMode {
    INITIAL,
    ZHUNG,
    ASCII_LOWER,  // 原 ASCII 拆分为二
    ASCII_UPPER,
    DISABLED
};

2. 修改 Refresh() 逻辑

在确定模式时增加 Caps Lock 检测:

// 需要包含 weasel::Status 中增加 caps_lock 状态
WeaselTrayMode mode = m_status.disabled ? DISABLED
                    : m_status.ascii_mode ? 
                        (m_status.caps_lock ? ASCII_UPPER : ASCII_LOWER)
                      : ZHUNG;

3. 增加图标资源

static UINT mode_icon[] = {
    IDI_ZH,        // INITIAL
    IDI_ZH,        // ZHUNG
    IDI_EN_LOWER,  // ASCII_LOWER(原 IDI_EN)
    IDI_EN_UPPER,  // ASCII_UPPER(新增大写图标)
    IDI_RELOAD     // DISABLED
};

关键实现细节

  1. 状态同步:需要在 weasel::Status 结构中增加 bool caps_lock 字段
  2. 事件监听:监听 WM_KEYDOWN 消息,检测 Caps Lock 键(VK_CAPITAL)状态变化
  3. 即时刷新:当 Caps Lock 状态改变时,调用 Refresh() 更新图标
  4. 配置选项:建议增加配置项 m_style.show_caps_lock_status 让用户选择是否启用

示例代码片段

// 在消息处理函数中
case WM_KEYDOWN:
    if (wParam == VK_CAPITAL) {
        // 更新 caps_lock 状态
        m_status.caps_lock = (GetKeyState(VK_CAPITAL) & 0x1) != 0;
        m_TrayIcon.Refresh(); // 刷新托盘图标
    }
    break;

用户体验建议

  • 小写状态:显示 a 图标
  • 大写状态:显示 A 图标
  • 可选功能:默认关闭,高级用户可手动开启,避免普通用户感到干扰

这样修改后,托盘图标就能实时反映大小写状态了。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions