【发布时间】:2011-07-21 02:30:14
【问题描述】:
我想将 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;
}
这段代码看起来不错,但是目标进程没有终止,有人可以帮帮我吗?
【问题讨论】:
-
为什么要打开进程?这似乎是不必要的。错误 6 表示句柄无效。您不应该在窗口句柄上调用 CloseHandle。窗把手不用整理,不是HANDLE。
-
我在尝试别的东西,所以打开过程是其中的一部分。我知道错误 6。你不应该在窗口句柄上调用 CloseHandle --> 非常感谢。
-
发送 WM_CLOSE 消息到应用程序的主窗体确实会导致它关闭,如果该窗口响应 WM_CLOSE。我无法想象你做错了什么。我的建议是使用 Spy++ 检查您是否找到了正确的窗口句柄。
标签: c++ windows visual-c++ messaging