【问题标题】:Intercept the closing message of a window opened with ShellExecuteEx拦截使用 ShellExecuteEx 打开的窗口的关闭消息
【发布时间】:2015-03-27 21:52:25
【问题描述】:

我有一个烦人的程序,在关闭时不会保存他的位置。 我制作了一个小型控制台程序,可以打开它并将窗口移动到另一个位置,现在我想在程序关闭时保存位置,我如何拦截关闭消息,以便在窗口自行销毁之前保存位置?

【问题讨论】:

  • "我有一个烦人的程序在关闭时不保存他的位置。" 大多数应用程序保存它们的位置。应用程序必须经过专门编码才能做到这一点。
  • 扩展 Remy 的评论,如果应用程序在退出时不存储其窗口位置,它在启动时加载此信息的机会有多大?从哪里来? Windows 7 引入了许多快捷方式来快速定位窗口。也许Windows 7 logo key Keyboard Shortcuts 之一可以帮助使这个应用程序的窗口定位不那么烦人。
  • @IInspectable:来自STARTUPINFO。事实上,Win32 API 强制应用程序使用从调用者传递的矩形,因为他们中的许多人没有尊重它。
  • @Ben:这假设 STARTF_USEPOSITION | STARTF_USESIZE 已设置。

标签: c++ windows winapi windows-messages shellexecuteex


【解决方案1】:

由于您可以在启动其应用程序后定位窗口,因此您显然拥有窗口的HWND。但是,您不能跨进程边界对HWND 进行子类化,因此您的应用程序无法直接挂钩窗口。您必须:

  1. 将一些代码远程注入到启动的进程中,以从其自身进程的上下文中对目标窗口进行子类化,然后您的子类可以直接访问窗口接收到的所有消息。

  2. 使用 SetWindowsHookEx() 在 DLL 中实现全局消息挂钩,并查看目标 HWND 接收到的所有消息。

无论哪种方式,当您的子类/挂钩检测到 WM_CLLOSE 和/或 WM_DESTROY 消息被传递到目标窗口时,它可以使用任何进程间通信 (IPC) 机制将该信息传达回您的应用程序您的选择 - 命名管道、命名事件、套接字、邮槽、窗口消息等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2016-01-29
    • 1970-01-01
    • 2015-01-03
    • 2011-03-03
    相关资源
    最近更新 更多