我的情况是程序调用我的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这样的十几个不同窗口的整个过程...)
答案 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在您单击“关闭”框时发送的内容,并且很有可能在更广泛的应用程序中运行,因为该应用程序会认为该应用程序已被用户关闭并应采取相应措施。