使用单个sendmessage选择组合框项

ComboBox item selection with a single sendmessage

本文关键字:组合 选择 sendmessage 单个      更新时间:2023-10-16

通过代码,我从另一个进程对话框中选择组合框项

这是已经尝试过的2条路由

// selecting using item text
void setComboBox(HWND hDlg, const char* value, int ctrlId) {
    SendDlgItemMessageA(hDlg, ctrlId, CB_SELECTSTRING, -1, (LPARAM) value);
    SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(ctrlId,CBN_SELCHANGE),
            (LPARAM) GetDlgItem(hDlg, ctrlId));
}
 // selecting using item index
void setComboBox(HWND hDlg, int i, int ctrlId) {
    SendDlgItemMessageA(hDlg, ctrlId, CB_SETCURSEL, i, 0);
    SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(ctrlId,CBN_SELCHANGE),
            (LPARAM) GetDlgItem(hDlg, ctrlId));
}

所以我看到的是在这两个方法中,我需要发送第二个消息(WM_COMMAND),这增加了延迟。

是否有办法使用一条消息来选择和通知两者?

No。根据设计,通过代码更改选择不会触发CBN_SELCHANGE。文档明确地说明了这一点:

当使用CB_SETCURSEL消息设置当前选择时,不发送CBN_SELCHANGE通知代码。

只有用户操作触发CBN_SELCHANGE,所以你必须手动发送。