【问题标题】:Passing message to another window将消息传递到另一个窗口
【发布时间】:2011-09-22 11:36:35
【问题描述】:

我想编写一个应用程序,它将接收到的每条消息传递到另一个窗口。例如,我有一个应用程序,用户可以在其中按下一些键、将鼠标移到上面等等,我希望将所有这些消息传递给例如 MS Paint。

我该怎么做?有任何想法吗?据我所知,将击键发送到另一个窗口可能会出现问题,所以也请指教。

编辑

好的,也许我会给你更多关于我正在寻找的内容的描述。

我的应用程序在表单上显示另一个应用程序的窗口。现在我想使用发送到我的应用程序表单的消息(如按键、鼠标移动等)来控制另一个窗口。

我一直在考虑将我的表单接收到的所有消息传递到应用程序的窗口,我有点“嵌入”到我自己的应用程序的窗口中。 “嵌入”是指让应用程序窗口显示在我的表单上。

也许我的问题还有另一种解决方案。请指教。

感谢您的宝贵时间。

【问题讨论】:

  • 鼠标和键盘消息远非“每条消息”。
  • 我是这么认为的,所以我想听听你的想法。 :)
  • 那一定是一些具体的窗口,或者在你的表单后面?

标签: delphi winapi windows-messages


【解决方案1】:

一些消息(即输入消息)通过消息队列到达,其余消息直接传递到收件人窗口。因此,您要求做的事情需要您执行以下所有操作:

  1. 实现一个顶级消息循环,从队列中检索消息并将它们发送到其他应用程序。
  2. 重新实现所有模式窗口循环以传递所有消息。
  3. 将进程中所有窗口的窗口过程替换为将所有消息传递到另一个应用程序的窗口过程。
  4. 寻找其他我没有提到的让消息到达的机会。

我无法想象这真的会解决你的问题,不管那个问题是什么。

【讨论】:

  • 我喜欢第一个想法,你能详细说明一下吗?普通消息循环和顶级消息循环有什么区别吗?
  • @Pateman 顶级消息循环是指在 Delphi 应用程序中由 Application.Run 调用的循环。显示模式窗口时会运行其他消息循环。我相信您知道排队和非排队消息之间的区别吗?只能从消息循环中访问排队的消息。非排队消息到达每个窗口的窗口过程。
  • @Pateman:David 的列表不是对替代品的建议(“选择一个你喜欢的”)。你必须做所有这些事情(至少步骤#1-3),并调查#4。
【解决方案2】:

转发消息绝对是可能且容易的,但它可能不会达到您的预期。看看here

【讨论】:

    【解决方案3】:

    覆盖表单的 DefaultHandler() 并将它收到的每条消息发布到另一个表单。如果表单中有任何显式消息处理程序,甚至某些控件,那么您可能在 DefaultHandler() 中看不到这些消息。

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多