创建父窗口的DLL插件无法正确处理消息

时间:2008-08-18 23:56:34

标签: c++ windows plugins c++builder vcl

我正在创建一个插件框架,我的应用程序加载了一系列插件DLL,然后创建一个新窗口并将这个新窗口的句柄传递给插件。然后,插件可以使用此句柄创建自己的GUI。

一切似乎都运转良好。唯一的问题是当我在插件小部件(例如编辑框)上按TAB时,它不会跳转到另一个小部件。我发现有些Windows消息已经通过,有些则没有通过。为其他键传递WM_KEYDOWN,因为我可以在编辑框上键入,但此消息不处理TAB键。

希望有人有提示。

我正在使用Boru VCL和CBuilder,但我想我可以使用WIN32下的任何框架来创建这些插件,因为他们永远不知道他们的父窗口是如何创建的。

4 个答案:

答案 0 :(得分:1)

这确实非常复杂。

当您点击TAB时,只有当这些控件属于“模态”对话框时,焦点才会跳转到另一个控件。实际上有一些按钮,如ESC,LEFT,RIGHT,DOWN,UP,TAB,模态对话框消息功能以特殊方式处理。如果您希望这些键的行为方式与无模式对话框或任何其他窗口类似,则应更改消息处理功能并在内部使用IsDialogMessage。您还可以在MSDN中找到有关IsDialogMessage功能的更多信息,以便更好地了解您可以查看的内容Dialog Boxes部分。

并且,如前所述,您应该在需要时设置WS_TABSTOPWS_GROUP样式。

祝你好运!

答案 1 :(得分:0)

我相信你在每个dll和exes中都有不同的VCL实例。来自dll的类与exe中的类不同,即使它们被称为相同。全局变量(应用程序,屏幕)也不会在它们之间共享。也没有内存,因为他们都有自己的内存管理器。

解决方案是让dll和exe共享VCL库和内存管理器。我不是BCB开发人员,而是Delphi开发人员。在Delphi中,我们只使用rtl和vcl作为运行时包。也许你可以做同样的BCB。

答案 2 :(得分:0)

我相信你必须采取以下步骤:

  1. Subclass您的编辑控件(以及其他需要的控件)。
  2. 在编辑控件的WndProc中捕获WM_KEYDOWN消息。
  3. 检查班次键当前是否按下(使用GetKeyState或类似名称)。
  4. 调用GetWindow,将句柄传递给编辑控件,并根据是否按住shift来传递GW_HWNDPREV或GW_HWNDNEXT。这将为您提供应该获得焦点的窗口的句柄。
  5. 调用SetFocus并传入您在步骤4中获得的窗口句柄。
  6. 确保您处理编辑控件是多行的情况,因为您可能希望显示真正的制表符而不是移动到下一个控件。

    希望有所帮助!

答案 3 :(得分:0)

DLL有自己的TApplication对象。

提供统一的密钥处理。当DLL加载时。 将DLL :: TApplication分配给EXE :: TApplication 请务必在退出时执行相反操作。

-

迈克尔