How do I catch keyboard input for a blender plugin?
I have no means to test for your intended usage, but maybe a modal operator is viable. Based on your use case, here's an operator template you could modify:

class VIEW3D_OT_process_input(bpy.types.Operator):
    """Process input while Control key is pressed."""
    bl_idname = 'view3d.process_input'
    bl_label = 'Process Input'
    bl_options = {'REGISTER'}

def modal(self, context, event):
    if event.type == 'ESC':
        return {'FINISHED'}
    elif event.ctrl:
        pass # Input processing code.

    return {'PASS_THROUGH'}

def invoke(self, context, event):
    context.window_manager.modal_handler_add(self)
    return {'RUNNING_MODAL'}


Watching input event being passed as argument, the operator will keep running (by returning PASS_THROUGH) until a condition, in this case pressing Esc button, is met. The input processing code itself is only executed if Ctrl key is pressed.