- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用 Delphi 编写的 Excel AddIn,它有一个带有 TMemo 的 VCL 表单。当我尝试在备忘录中输入文本时,输入会转至 Excel。
当我启动表单模式 (ShowModal
) 时,一切正常,但显然不可能同时使用主 Excel 窗口和插件窗口。
这个问题似乎与这个问题完全相同:Modeless form cannot receive keyboard input in Excel Add-in developed by Delphi
这个answer建议处理 WM_PARENTNOTIFY
所以我尝试了以下操作:
TMyForm = class(TForm)
...
procedure OnParentNotify(var Msg: TMessage); message WM_PARENTNOTIFY;
在该过程中尝试了诸如SetFocus
、WinApi.Windows.SetFocus(self.Handle)
、SetForeGroundWindows
、SetActiveWindow之类的东西
但这似乎不起作用。
我读过的其他建议是run the UI in a different thread (这对于 VCL 来说当然是不可能的)并使用 SetWindowsHookEx
安装键盘钩子(Hook)。显然,这将为我们提供按键事件,但不知道如何处理这些事件。
我没有使用 Add-In Express 等第 3 方工具,而只是实现 IDTExtensibility2
。
编辑:更多研究表明 Office 使用名为 IMsoComponent 的界面和和IMsoComponentManager作为跟踪应用程序中事件组件的一种方式。 Visual Studio 将它们用作 IOleComponent和 IOleComponentManager .
这个link和 this建议注册一个新的空 IOleComponent/IMsoComponent。
编辑:可以获取 MCVE here ,它是最小的 Excel AddIn 代码,将启动带有 TEdit 的 VCL 表单。一旦工作表处于事件状态,编辑就会失去键盘焦点。
最佳答案
我也遇到了同样的问题。我也在实现 IDTExtensibility2,但当我在 C++ 上实现时,我已经设法在不同的线程上运行 UI。但无论如何,我对这个解决方案并不完全满意。如果我想使用 VBA 用户窗体作为任务 Pane 窗口,我仍然会遇到这个问题。我确实尝试过,但(我猜,没有检查)VBA 用户窗体将在 native Excel 线程上运行,只是在不同的线程上调用它(用作 TaskPane 窗口)只是编码它,并不意味着它是在不同的线程上创建的,所以当我尝试时,存在这种问题。
我也阅读并尝试在我的窗口上使用 SetFocus.. 处理 WM_PARENTNOTIFY 消息,但没有成功。
这两个接口(interface) IOleComponent 和 IOleComponentManager 对我来说都是新的。找不到头文件,但可以根据您共享的链接中的描述进行编写和实现。
它对我的工作原理是在我的表单窗口的每个 WM_SETCURSOR e WM_IME_SETCONTEXT 上注册我的 IOleComponent 实现。 (我不确定这是否是最好的消息,但确实对我有用)并在每次点击 EXCEL7 窗口时撤销该组件。
我用来注册的 MSOCRINFO 选项是 msocrfPreTranslateKey 和 msocadvfModal。
希望这个回答不会让我受到大量批评。我知道这是一个非常具体的问题,当我读到它时,问题的状态是-1,但这正是我需要完成的。所以我只是想诚实地分享一些东西。
关于Excel 从 VCL 表单中窃取键盘焦点(在 AddIn 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058580/
一些背景(是 TLabel and TGroupbox Captions Flicker on Resize 的延续): 所以,我有一个应用程序可以加载不同的插件并创建一个TPageControl 上
我正在从 this handy template 复制一些 VCL 规则并在最新稳定的 Varnish4 上运行。但是 VCL 的这一部分: vcl 4.0; sub vcl_init { #
无论如何,这就是我的分析。今天早上,我将我的应用程序“分发”给了我们的组织,结果发现,在 XE8 中对这个旧的 win32 应用程序进行了一个月的新工作后,不使用 Windows 7“Basic”主题
在执行命令时 sudo service varnish reload 我收到以下错误: nish@styx:~$ sudo service varnish reload * Reloading HT
所以我第一次使用 Varnish 。我花了很多时间阅读它是如何工作的,但我无法弄清楚如何有选择地清除缓存。 就像说我有一个这样的网址 /?account=123&url=google.com 另一个喜
首先,维基百科将控制面板小程序定义为: graphical user interface which allows users to view and manipulate basic system
我的主窗体(我的图像中的 form1)中央有一个页面控件,我想打开停靠在该页面控件中的其他表单。因为我的子窗体上有很多控件,所以我需要垂直和水平滚动条(在子窗体上我有事件滚动条选项处于事件状态),但这
在Varnish中,std.log子例程是否会对性能产生影响,我应该关注该影响?例如,如果我将它称为请求的3-4次,那么在处理大量请求时会产生累积效果吗? 据我所知,std.log通过请求锁定,写入消
VCL中有几个内置子例程; vcl_recv,vcl_pipe,vcl_pass,vcl_hit,vcl_miss等; 引用https://varnish-cache.org/docs/4.1/use
我有以下形式的 URL: http://some-site.com/api/v2/portal-name/some/webservice/call 我要获取的数据需要 http://portal-na
我现在遇到了一个相当罕见的情况。我有一个直接与 Windows 消息队列交互的应用程序。该应用程序还使用 LuaJIT 运行外部 Lua 脚本。我想要为这些脚本提供调试工具,因此我创建了一个普通的 V
使用 Delphi 7 IDE 进行调试时,如何单步执行程序文件/borland/delphi7/source 文件夹中的代码? 听起来是个愚蠢的问题,但好奇的人想要调试。 (并不是说我认为源有什么问
在我的编程团队中,我们都使用 Delphi XE2 Professional。我们刚刚发现,在不同的计算机上,可用的 VCL 样式数量不同。 VCL 样式从何而来?我是否需要小心地将样式从一个 Del
我注意到,当启用 VCL-Styles 时,即使没有按下 Alt 键,也会使用热键选择菜单中的项目。 这会干扰我的用户界面的其余部分,并且我发现样式库改变热键的行为非常奇怪。 我可以以某种方式消除这种
我有一个源自 TMemo 的控件。它工作得很好,直到我第一次使用 Delphi XE7 VCL Styles。在Delphi XE7下,样式不应用于控件的滚动条。如果使用深色主题/风格,看起来很糟糕,
我一直在尝试将我拥有的单位从 VCL 转换为 FMX。我使用的库之一是用于 TpenStyle 的 VCL.Graphics: wallstyle,pathstyle,solvedpathstyle:
我正在设置主菜单字体(通过 Screen.MenuFont)以匹配程序中其他地方使用的字体的名称/大小。但主菜单不会随表单的其余部分一起刷新 - 我必须将鼠标移到每个菜单项上才能让它以新字体重新绘制该
我正在设置主菜单字体(通过 Screen.MenuFont)以匹配程序中其他地方使用的字体的名称/大小。但主菜单不会随表单的其余部分一起刷新 - 我必须将鼠标移到每个菜单项上才能让它以新字体重新绘制该
我为其编写软件的产品之一是会计类应用程序。它用 C++ 编写,使用 C++ Builder 和 VCL 控件,连接到运行在 Linux 上的 PostgreSQL 数据库。 PostgreSQL 数据
我正在创建一个包含多个表单的 VCL 表单应用程序。我创建了一个名为 formCreateAppointment 的新表单。 我正在尝试通过 menuItem 中的这段代码加载表单: formCrea
我是一名优秀的程序员,十分优秀!