我想发送wm_close到另一个进程,我想要安全地结束这个进程。
int _tmain(int argc, _TCHAR* argv[]) { DWORD SetOfPID; SetOfPID = GetProcId(_T("abc.exe")); //this will return pid HANDLE h = OpenProcess(PROCESS_ALL_ACCESS,false, SetOfPID); HWND hwnd = ::GetTopWindow(NULL); while(hwnd) { DWORD pid; DWORD dwThreadId = ::GetWindowThreadProcessId(hwnd, &pid); if(pid == SetOfPID) { break; } hwnd = ::GetNextWindow(hwnd, GW_HWNDNEXT); } //DestroyWindow(hwnd); bool temp = IsWindow(hwnd); **//this gives true** LRESULT res = ::SendMessage(hwnd, WM_CLOSE, NULL, NULL); DWORD err = GetLastError(); **//this gives 6** CloseHandle(hwnd); CloseHandle(h); return 0; }
这段代码看起来不错,但是目标进程没有终止,有人可以帮我吗?
你确定你找到的窗户是正确的吗? 您可以使用Spy ++轻松检查。 而且,在搜索窗口时,我认为最好使用EnumWindows。 我不确定你的方法是否正确。
如果应用程序不处理WM_CLOSE,DefWindowProc应该处理这个(通过正常关闭应用程序),但是如果应用程序正在处理WM_CLOSE,那么它可以选择忽略它。 尝试发送WM_DESTROY和WM_NCDESTROY消息。
我会尝试按以下顺序关闭(进程)窗口:
WM_CLOSE
WM_QUIT
WM_DESTROY
了TerminateProcess()。
只是因为我正在处理(禁用) WM_CLOSE
窗口,并难以区分由另一个主任务发送的用户关闭和关闭消息。 WM_QUIT
似乎解决我的问题,而不使用我自己的自定义WM_APP_CLOSE
。 TerminateProcess
是不惜一切代价避免不必要的不必要的出口(它可能会留下句柄(如COM等)和内存等)。