Keeping the UIInput disabled doesn't seem to work for me, and enabling/disabling it during callbacks gives weird results because the order of SendMessage receivers doesn't appear to be consistent.
Using a second game object without a collider works better, but it's still a bit quirky. Because there are two separate objects, UIInput.selected=true makes my UIInput the "selected" object, which means that clicking on the other object (the one that actually has a collider) will always trigger OnSelect(true) because that object never stays selected. The result: when the on-screen keyboard is already up, clicking on the collider will quickly pop the keyboard down and back up again instead of just ignoring the click and keeping the keyboard up like a normal UIInput would do.