【发布时间】:2018-06-26 05:52:15
【问题描述】:
我的场景是一个程序调用我的 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 这样的十几个不同窗口的整个进程......)
【问题讨论】:
-
这种黑客攻击可能需要针对不同程序使用不同的方法。记事本真的是你的目标吗?
-
记事本确实是我的目标之一。我使用语音识别命令启动应用程序、切换到应用程序、关闭窗口、发送文本等。关闭应用程序(我希望是任何应用程序)是所需的操作之一。
-
为什么不使用 UIAutomation?毕竟是平台自动化API
-
感谢您对 UIAutomation 的引用 - 我从未听说过。据我所知,那里有很多材料要阅读。我会做更多的阅读,看看我可以如何使用它。