Non elevated process can't inject into elevated process. X user process can't inject into Y user process.
If user has access to process, they have very well access to modify by decompiling or reverse engineering it. Dynamic injection makes it much more seamless and less painful.
https://docs.microsoft.com/en-us/windows/win32/winstation/wi...
https://docs.microsoft.com/en-us/windows/win32/winstation/de...
https://docs.microsoft.com/en-us/windows/win32/procthread/pr...
https://docs.microsoft.com/en-us/windows/win32/procthread/th...
https://docs.microsoft.com/en-us/windows/win32/fileio/file-s...
Here https://news.ycombinator.com/item?id=31092978 suggests its not possible to prevent code injection aka system or app hooks. Preventing system and app hooks is very possible and the MS api's gve you all you need to block them, people just need to come up with innovative ways to deploy them!