为什么WM_CLOSE / DESTROY只能部分关闭我的记事本窗口?

时间:2018-06-26 05:52:15

标签: winapi notepad

我的情况是程序调用我的DLL,我使用Process.Start(notepad)在Windows 10 x64上启动记事本窗口。我没有保存启动进程的进程ID。然后一段时间后,程序再次调用我的DLL,然后我找到了记事本窗口句柄(通过匹配标题字符串)。

问题是,当我使用句柄向窗口发送WM_CLOSE或DESTROY消息时,作业未完成。窗口确实从我的屏幕上消失了。它确实从任务栏消失。但是,当我用Alt-TAB查看窗口时,它确实存在。它并没有真正消失。它只是隐藏在任务栏中。我正在使用此Win32 API调用来尝试关闭窗口。

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

(1)我在做什么错?

(2)我的期望与众不同吗?对于我(作为在一个进程下运行的DLL),甚至可以命令另一个进程中的记事本关闭吗?

我想拥有一个记事本手柄,可以将它放在前台并将Alt + F4发送到它的键盘缓冲区以某种方式伪造它,以为我正在向它键入字符。但是,这似乎还有很长的路要走。

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

我在论坛上也看过其他帖子,但他们大多谈论使用流程API终止流程-这不是我真正想做的蛮力杀死方法。 (此外,我想关闭我感兴趣的单个窗口,而不是关闭可能正在运行像MS Word这样的十几个不同窗口的整个过程...)

2 个答案:

答案 0 :(得分:2)

  

我正在使用[CloseWindow]尝试关闭窗口。

CloseWindow不会关闭窗口,而是将其最小化。

相反,向窗口发送WM_CLOSE消息:

SendMessage(h, WM_CLOSE, 0, 0);

答案 1 :(得分:1)

尝试这样做:

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

这是Windows在您单击“关闭”框时发送的内容,并且很有可能在更广泛的应用程序中运行,因为该应用程序会认为该应用程序已被用户关闭并应采取相应措施。