Типичным способом создания устройств HID является использование классов IOHID * в IOKit. Вы можете написать пользовательский клиент, который передает и выводит события.
Я не уверен, что такое "виртуальное" устройство HID, однако, я думаю. Если вы хотите создать клавиатуру на экране, такого рода действия могут быть выполнены в пользовательском пространстве.