EnumWindows enumerates all the top level windows in a process. GetWindowThreadProcessId gets the process and Id of each thread.
You now have enough information to gracefully close any GUI application.
You can send WM_CLOSE
messages to any window you wish to close. Many windows handle WM_CLOSE
to prompt the user to save documents.You can send a WM_QUIT
message using PostThreadMessage
to the discovered threads to cause the message loop to terminate.
User code is not allowed to call DestroyWindow
from a different app or thread to the windows... if the app does not respond to WM_CLOSE
or WM_QUIT
requests you're back in TerminateProcess
land.
This will not close console applications as the application process, and process that owns the window, are different.
Refer to T.s. Arun's answer below for the correct method for dealing with console applications.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…