使用sendmessage将wm_close发送到另一个进程

时间:2011-03-23 07:43:04

标签: c++ windows visual-c++ messaging

我想将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;
}

这段代码看起来不错,但是目标进程没有终止,有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

您确定您找到的窗口是正确的吗?您可以使用Spy ++轻松查看。此外,在搜索窗口时,我认为最好使用EnumWindows。我不确定你的方法是否正确。

答案 1 :(得分:2)

我会尝试按以下顺序关闭(处理)窗口:

  
      
  1. WM_CLOSE

  2.   
  3. WM_QUIT

  4.   
  5. WM_DESTROY

  6.   
  7. 了TerminateProcess()。

  8.   

我正在处理(禁用)WM_CLOSE窗口并且难以区分由另一个主任务发送的用户关闭和关闭消息。 WM_QUIT似乎在不使用我自己的自定义WM_APP_CLOSE的情况下解决了我的问题。 TerminateProcess是不间断的不间断退出,不惜一切代价避免(它可能会留下句柄(例如COM等)和内存等等)。

答案 2 :(得分:0)

如果应用程序不处理WM_CLOSE,则DefWindowProc应该处理此问题(通过正常关闭应用程序),但是如果应用程序正在处理WM_CLOSE,那么它只是可以选择忽略它。请尝试发送WM_DESTROY和WM_NCDESTROY消息。