1

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

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

希望有人给点提示。

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

4

4 回答 4

1

确实是很复杂的事情。

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

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

祝你好运!

于 2008-08-19T12:36:47.977 回答
0

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

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

于 2008-08-27T12:18:22.457 回答
0

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

  1. 子类化您的编辑控件(以及其他需要的控件)。
  2. 在编辑控件的 WndProc 中捕获WM_KEYDOWN消息。
  3. 检查当前是否按住 shift 键(使用GetKeyState或类似方法)。
  4. 调用GetWindow,将句柄传递给您的编辑控件以及 GW_HWNDPREV 或 GW_HWNDNEXT ,具体取决于是否按住 shift 。这将为您提供应该获得焦点的窗口的句柄。
  5. 调用SetFocus并传入您在步骤 4 中获得的窗口句柄。

确保您处理编辑控件是多行的情况,因为您可能希望显示一个真正的制表符而不是移动到下一个控件。

希望有帮助!

于 2008-08-19T00:52:48.897 回答
0

DLL 有自己的 TApplication 对象。

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

--

迈克尔

于 2009-01-24T17:58:06.570 回答