CreateRemoteThread() is used to create a new thread inside the remote process. The function will return the ID of the newly created thread. This can be used to load your DLL into the remote process, by passing the address of LoadLibrary() as the thread start address (note that you would need to VirtualAllocEx() and WriteProcessMemory() to place the filename in the remote process first).
Once your DLL is loaded, you would need to hook the function of interest (via VirtualProtect(MEM_WRITABLE)/memcpy()/VirtualProtect(original protection)), since you can't inject directly into a thread. You can only modify the code that the thread is running, and then receive control indirectly.
Note that for safety, you would need to SuspendThread() the thread of interest before you make changes to its code, unless the function that you wish to alter is hot-patchable. In the case of a hot-patchable function, you would write the long jump at address function-5, and then write the short jump at the function start. The write of the short jump is an atomic operation so there is no risk of misaligned execution.