为什么 WM_CLOSE/DESTROY 只能部分关闭我的记事本 window?
Why does WM_CLOSE/DESTROY only partially close my Notepad window?
我的情况是程序调用我的 DLL,我使用 Process.Start(notepad)
在 Windows 10 x64 上启动记事本 window。我不保存启动进程的进程 ID。然后过了一段时间,一个程序再次调用我的 DLL,我找到了记事本 window 句柄(通过匹配标题字符串)。
问题是,当我使用句柄向 window 发送 WM_CLOSE 或 DESTROY 消息时,作业没有完成。 window 确实从我的屏幕上消失了。它确实从任务栏中消失了。但是当我用 Alt-TAB 查看 windows 时,它就在那里。它并没有真正消失;它只是隐藏在任务栏中。我正在使用此 Win32 API 调用来尝试关闭 window.
[DllImport ("user32.dll", SetLastError = true)]
public static extern bool CloseWindow (IntPtr hWnd);
(1) 我做错了什么?
(2) 是否超出了我的预期?我什至可以(作为一个进程下的 DLL 运行)命令关闭另一个进程中的记事本吗?
我想,手头有记事本句柄,我可以将它带到前台,然后将 Alt+F4 发送到它的键盘缓冲区,以某种方式假装它认为我正在向它输入字符。但是,这似乎还有很长的路要走。
(3) 如何以编程方式告诉应用程序关闭它们的 windows 而不将它们带到前台并向它们发送击键,或者不向它们发送鼠标点击 X 关闭按钮?
我看过论坛上的其他帖子,但他们大多谈论用进程 APIs 终止进程 - 一种蛮力杀死方法,这并不是我真正想要做的。 (此外,我想关闭我感兴趣的单个 window,而不是像 MS Word 那样 运行 一打不同 windows 的整个过程...)
I'm using [CloseWindow] to try to close the window.
CloseWindow
不会关闭 window -- 它会最小化它。
而是向 window 发送一条 WM_CLOSE
消息:
SendMessage(h, WM_CLOSE, 0, 0);
尝试这样做:
SendMessage (hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); // or PostMessage perhaps better
这是 Windows 在您单击“关闭”框时发送的内容,并且更有可能在更广泛的应用程序中工作,因为应用程序随后会认为它已被用户关闭并且应该相应地采取行动。
我的情况是程序调用我的 DLL,我使用 Process.Start(notepad)
在 Windows 10 x64 上启动记事本 window。我不保存启动进程的进程 ID。然后过了一段时间,一个程序再次调用我的 DLL,我找到了记事本 window 句柄(通过匹配标题字符串)。
问题是,当我使用句柄向 window 发送 WM_CLOSE 或 DESTROY 消息时,作业没有完成。 window 确实从我的屏幕上消失了。它确实从任务栏中消失了。但是当我用 Alt-TAB 查看 windows 时,它就在那里。它并没有真正消失;它只是隐藏在任务栏中。我正在使用此 Win32 API 调用来尝试关闭 window.
[DllImport ("user32.dll", SetLastError = true)]
public static extern bool CloseWindow (IntPtr hWnd);
(1) 我做错了什么?
(2) 是否超出了我的预期?我什至可以(作为一个进程下的 DLL 运行)命令关闭另一个进程中的记事本吗?
我想,手头有记事本句柄,我可以将它带到前台,然后将 Alt+F4 发送到它的键盘缓冲区,以某种方式假装它认为我正在向它输入字符。但是,这似乎还有很长的路要走。
(3) 如何以编程方式告诉应用程序关闭它们的 windows 而不将它们带到前台并向它们发送击键,或者不向它们发送鼠标点击 X 关闭按钮?
我看过论坛上的其他帖子,但他们大多谈论用进程 APIs 终止进程 - 一种蛮力杀死方法,这并不是我真正想要做的。 (此外,我想关闭我感兴趣的单个 window,而不是像 MS Word 那样 运行 一打不同 windows 的整个过程...)
I'm using [CloseWindow] to try to close the window.
CloseWindow
不会关闭 window -- 它会最小化它。
而是向 window 发送一条 WM_CLOSE
消息:
SendMessage(h, WM_CLOSE, 0, 0);
尝试这样做:
SendMessage (hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); // or PostMessage perhaps better
这是 Windows 在您单击“关闭”框时发送的内容,并且更有可能在更广泛的应用程序中工作,因为应用程序随后会认为它已被用户关闭并且应该相应地采取行动。