我的场景是一个程序调用我的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这样运行十几个不同窗口的整个过程…)