【问题标题】:using sendmessage to send wm_close to another process使用 sendmessage 将 wm_close 发送到另一个进程
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • IsWindow() 返回 true,这不意味着我有一个有效的窗口吗?
  • @rplusg:IsWindow 告诉你它是一个有效的窗口句柄,而不是更多。可能是应用程序有几个顶级窗口,可能不可见。而且你可能没有关闭正确的。
  • 即使我不确定是什么问题,但 enumwindows 已经给出了我想要的结果。感谢 patriiice,将您的答案标记为最终答案。
【解决方案2】:

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

【讨论】:

  • WM_DESTROY 和 WM_NCDESTROY 也不起作用。 DestroyWindow() 也返回 false。
  • WM_DESTROY 和 WM_NCDESTROY 不起作用,它们是通知。
【解决方案3】:

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

  1. WM_CLOSE

  2. WM_QUIT

  3. WM_DESTROY

  4. 终止进程()。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2017-05-08
    • 2012-10-17
    相关资源
    最近更新 更多