代码之家  ›  专栏  ›  技术社区  ›  Kevin

为什么wm_u只关闭/销毁部分记事本窗口?

  •  0
  • Kevin  · 技术社区  · 6 年前

    我的场景是一个程序调用我的dll,我使用 Process.Start(notepad) 在Windows 10 x64上启动记事本窗口。我不保存已启动进程的进程ID。稍后,程序再次调用我的dll,我找到记事本窗口句柄(通过匹配标题字符串)。

    问题是,当我使用句柄向窗口发送wm_close或destroy消息时,作业没有完成。窗口确实从我的屏幕上消失了。它确实会从任务栏中消失。但当我用alt tab键查看windows时,就看到了。它并没有真的消失,只是隐藏在任务栏中。我正在使用此win32 api调用尝试关闭窗口。

    [DllImport ("user32.dll", SetLastError = true)]
    public static extern bool CloseWindow (IntPtr hWnd);
    

    (1)我做错了什么?

    (2)我的期望值是否不合要求?我(作为在一个进程下运行的dll)是否有可能命令另一个进程中的记事本关闭?

    我想,拿着记事本的手柄,我可以把它放到前台,然后发送alt+f4到键盘缓冲区,假装我在给它输入字符。但是,这似乎有很长的路要走。

    (3)如何以编程方式告诉应用程序关闭其窗口,而不将窗口置于前台并向其发送击键,或不向其发送X关闭按钮上的鼠标单击?

    我看过论坛上的其他帖子,但他们大多都在讨论用进程api终止进程,这是一种暴力杀死方法,我并不想这么做。(此外,我想关闭我感兴趣的单个窗口,而不是像word这样运行十几个不同窗口的整个过程…)

    2 回复  |  直到 6 年前
        1
  •  2
  •   Andreas Rejbrand    6 年前

    我正在用[关闭窗口]试图关闭窗口。

    CloseWindow 不会关闭窗口--它会最小化窗口。

    相反,发送窗口 WM_CLOSE 消息:

    SendMessage(h, WM_CLOSE, 0, 0);
    
        2
  •  1
  •   catnip    6 年前

    尝试这样做:

    SendMessage (hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);  // or PostMessage perhaps better
    

    这是Windows在单击“关闭”框时发送的消息,而且更可能在更广泛的应用程序中工作,因为应用程序将认为它已被用户关闭,并应相应地采取行动。