|Okay, here's the deal:|
• There is no official way to do what you want.
• Process.Start gives you a Process object which you can use to see if the program has terminated, but you won't know the status of the file. For instance, if the user uses this program to open an Excel file, your program won't let the user open the same spreadsheet until the user closes all open spreadsheets and closes Excel.
• The unofficial way of doing what you want is using NtQuerySystemInformation, but that's prone to hanging and/or failing depending on the state of the system at any given moment. It also requires elevation. As they're undocumented, NtQuery* functions are technically implementation details so expect incompatibilities between versions of Windows. This StackOverflow thread has some useful links on the subject.
• File locks in the launcher are probably not the way to go, as it'll just prevent the launched application from opening the file, and I doubt that's what you want.
• Unicode snowman: ☃
How To Ask Questions The Smart Way