当包对象(XML)被读入ADODB流时VBA阻止键盘输入?

Dav*_*ens 8 vba ole adodb powerpoint-vba

我正在开发一个应用程序,它打开并读取以前嵌入PowerPoint演示文稿或Word文档中的XML文档.为了读取这个对象(xmlFile as Object),我必须这样做:

xmlFile.OLEFormat.DoVerb 1

这将打开包对象,我有另一个子例程,它获取Notepad.exe的打开实例,并将其内容读入ADODB流.

Google文档中提供了此过程的示例:

XML_Test.pptm.

在此过程中,Notepad.exe会在几秒钟内获得焦点,并且无意中击键可能会导致意外结果或读取XML数据时出错.

我正在寻找两件事之一:

  1. 这是一种防止用户在执行此操作时无意中输入(通过键盘/鼠标/等)的方法.优选地MouseKeyboardTest,在下面的子程序中不控制用户机器的东西.要么,
  2. 将XML数据提取到字符串变量的更好方法.

对于#1:这是我发现的功能,我对它的使用持怀疑态度.我担心对用户系统进行这种控制.##我可以使用其他任何方法吗?##

Private Declare Function BlockInput Lib "USER32.dll" (ByVal fBlockIt As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub MouseKeyboardTest() 'both keyboard and mouse blocked

    BlockInput True ' Turns off Keyboard and Mouse
'   Routine goes here
    Sleep 5000 ' Optional coding
    BlockInput False ' Turns on Keyboard and Mouse

End Sub
Run Code Online (Sandbox Code Playgroud)

对于#2:一些背景,但问题似乎是无法使用除以外的任何方法可靠地提取嵌入对象DoVerb 1.由于我正在处理一个不受我的VBA技能影响的应用程序(记事本)中未保存的文档,这似乎是唯一的方法.完整的背景,在这里:

从PowerPoint VBA中提取OLEObject(XML文档)

Ily*_*sov 1

我的理解是,您首先可以控制 XML 文件如何嵌入到 PowerPoint 演示文稿中。在这里我不太明白为什么你选择将所需的数据保留为嵌入对象的内容。

可以肯定的是,取回这些内容的任务并不是小菜一碟。实际上,只要没有(简单甚至中等难度)方法从 VBA 调用QueryInterface和使用IPersist*接口,就只有一种方法来获取嵌入对象的内容。该方法包括以下步骤:

  1. 激活嵌入的对象。你用的OLEFormat.DoVerb 1是那个。更好的方法是致电OLEFormat.Activate,但这与您的特定问题无关。
  2. 使用嵌入式对象的编程模型来执行有用的操作,例如获取内容、保存或任何公开的操作。Notepad.exe没有公开这样的编程模型,并且您采取了WinAPI可用的最佳选择。

不幸的是,您当前的方法至少有两个缺陷:

  1. 您在问题中确定的那个(激活notepad.exe导致用户干扰的可能性)。
  2. 如果用户有默认的打开.txt文件的程序而不是notepad.exe,那么您的方法就注定失败。

如果您确实可以控制嵌入对象的创建方式,那么更好的方法是将 XML 数据存储在Shape对象的某些属性中。我会使用(使用起来非常简单;如果您将其导出为 HTML 或有一些不同的重要场景,则Shape.AlternativeText不应使用)或(这可能是该任务在语义上最正确的)。.pptmAlternativeTextShape.Tags