I found a solution and it was far simpler than I thought it would be. In the onChanged callback, if the index of the active text is -1, it hasn't been added to the list yet. So to distinguish between typing and selecting from the drop-down list, this does the trick:
void onChanged(ComboBoxText cbt)
{
if(getIndex(getActiveText()) !is -1)
{
writeln("this is a list item: ", getActiveText());
}
else
{
writeln("and this isn't: ", getActiveText());
}
} // onChanged()
I just wasn't working with all available data.